我已经编写了一些代码来跟踪爱好者,作为流行游戏英雄联盟的一个补充。
我的代码是难以置信的重复,我也有无法跟踪多个缓冲区的问题,尽管这可能不是这个问题的主题,所以在回答时可以不考虑这个问题。
import java.util.Scanner;
public class MainProgram {
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
System.out.println("Jungle Timers v1.0");
System.out.println("\nSelect a buff to time:");
System.out.println("\n1. Blue");
System.out.println("2. Enemy Blue");
System.out.println("3. Red");
System.out.println("4. Enemy Red");
System.out.println("5. Dragon");
System.out.println("6. Baron");
System.out.print("\n> ");
int timerChoice = keyboard.nextInt();
keyboard.close();
switch (timerChoice) {
case 1:
friendlyBlue();
case 2:
enemyBlue();
case 3:
friendlyRed();
case 4:
enemyRed();
case 5:
Dragon();
case 6:
Baron();
}
}
public static void friendlyBlue() {
System.out.println("\nTracking your blue...");
System.out.println("5 Minutes left");
int friendlyBlue = 300;
long startTime = System.currentTimeMillis() / 1000;
long endTime = startTime + friendlyBlue;
while (System.currentTimeMillis() / 1000 < endTime) {
while (startTime != System.currentTimeMillis() / 1000) {
startTime += 1;
if (endTime - startTime > 1)
if (endTime - startTime == 240)
System.out.println("4 Minutes left");
if (endTime - startTime == 180)
System.out.println("3 Minutes left");
if (endTime - startTime == 120)
System.out.println("2 Minutes left");
if (endTime - startTime == 60)
System.out.println("1 Minute left");
if (endTime - startTime == 30)
System.out.println("30 Seconds left");
if (endTime - startTime == 15)
System.out.println("15 Seconds left");
if (endTime - startTime == 5)
System.out.println("5 Seconds left");
else if (endTime - startTime == 1) {
System.out.println("Blue Buff is up!");
}
}
}
}
public static void enemyBlue() {
System.out.println("\nTracking enemy blue...");
System.out.println("5 Minutes left");
int enemyBlue = 300;
long startTime = System.currentTimeMillis() / 1000;
long endTime = startTime + enemyBlue;
while (System.currentTimeMillis() / 1000 < endTime) {
while (startTime != System.currentTimeMillis() / 1000) {
startTime += 1;
if (endTime - startTime > 1)
if (endTime - startTime == 240)
System.out.println("4 Minutes left");
if (endTime - startTime == 180)
System.out.println("3 Minutes left");
if (endTime - startTime == 120)
System.out.println("2 Minutes left");
if (endTime - startTime == 60)
System.out.println("1 Minute left");
if (endTime - startTime == 30)
System.out.println("30 Seconds left");
if (endTime - startTime == 15)
System.out.println("15 Seconds left");
if (endTime - startTime == 5)
System.out.println("5 Seconds left");
else if (endTime - startTime == 1) {
System.out.println("Enemy Blue Buff is up!");
}
}
}
}
public static void friendlyRed() {
System.out.println("\nTracking your red...");
System.out.println("5 Minutes left");
int friendlyRed = 300;
long startTime = System.currentTimeMillis() / 1000;
long endTime = startTime + friendlyRed;
while (System.currentTimeMillis() / 1000 < endTime) {
while (startTime != System.currentTimeMillis() / 1000) {
startTime += 1;
if (endTime - startTime > 1)
if (endTime - startTime == 240)
System.out.println("4 Minutes left");
if (endTime - startTime == 180)
System.out.println("3 Minutes left");
if (endTime - startTime == 120)
System.out.println("2 Minutes left");
if (endTime - startTime == 60)
System.out.println("1 Minute left");
if (endTime - startTime == 30)
System.out.println("30 Seconds left");
if (endTime - startTime == 15)
System.out.println("15 Seconds left");
if (endTime - startTime == 5)
System.out.println("5 Seconds left");
else if (endTime - startTime == 1) {
System.out.println("Red Buff is up!");
}
}
}
}
public static void enemyRed() {
System.out.println("\nTracking enemy red...");
System.out.println("5 Minutes left");
int enemyRed = 300;
long startTime = System.currentTimeMillis() / 1000;
long endTime = startTime + enemyRed;
while (System.currentTimeMillis() / 1000 < endTime) {
while (startTime != System.currentTimeMillis() / 1000) {
startTime += 1;
if (endTime - startTime > 1)
if (endTime - startTime == 240)
System.out.println("4 Minutes left");
if (endTime - startTime == 180)
System.out.println("3 Minutes left");
if (endTime - startTime == 120)
System.out.println("2 Minutes left");
if (endTime - startTime == 60)
System.out.println("1 Minute left");
if (endTime - startTime == 30)
System.out.println("30 Seconds left");
if (endTime - startTime == 15)
System.out.println("15 Seconds left");
if (endTime - startTime == 5)
System.out.println("5 Seconds left");
else if (endTime - startTime == 1) {
System.out.println("Enemy Red Buff is up!");
}
}
}
}
public static void Dragon() {
System.out.println("\nTracking dragon...");
System.out.println("6 Minutes left");
int dragon = 360;
long startTime = System.currentTimeMillis() / 1000;
long endTime = startTime + dragon;
while (System.currentTimeMillis() / 1000 < endTime) {
while (startTime != System.currentTimeMillis() / 1000) {
startTime += 1;
if (endTime - startTime > 1)
if (endTime - startTime == 300)
System.out.println("5 Minutes left");
if (endTime - startTime == 240)
System.out.println("4 Minutes left");
if (endTime - startTime == 180)
System.out.println("3 Minutes left");
if (endTime - startTime == 120)
System.out.println("2 Minutes left");
if (endTime - startTime == 60)
System.out.println("1 Minute left");
if (endTime - startTime == 30)
System.out.println("30 Seconds left");
if (endTime - startTime == 15)
System.out.println("15 Seconds left");
if (endTime - startTime == 5)
System.out.println("5 Seconds left");
else if (endTime - startTime == 1) {
System.out.println("Dragon is up!");
}
}
}
}
public static void Baron() {
System.out.println("\nTracking baron...");
System.out.println("7 Minutes left");
int baron = 420;
long startTime = System.currentTimeMillis() / 1000;
long endTime = startTime + baron;
while (System.currentTimeMillis() / 1000 < endTime) {
while (startTime != System.currentTimeMillis() / 1000) {
startTime += 1;
if (endTime - startTime > 1)
if (endTime - startTime == 360)
System.out.println("6 Minutes left");
if (endTime - startTime == 300)
System.out.println("5 Minutes left");
if (endTime - startTime == 240)
System.out.println("4 Minutes left");
if (endTime - startTime == 180)
System.out.println("3 Minutes left");
if (endTime - startTime == 120)
System.out.println("2 Minutes left");
if (endTime - startTime == 60)
System.out.println("1 Minute left");
if (endTime - startTime == 30)
System.out.println("30 Seconds left");
if (endTime - startTime == 15)
System.out.println("15 Seconds left");
if (endTime - startTime == 5)
System.out.println("5 Seconds left");
else if (endTime - startTime == 1) {
System.out.println("Baron is up!");
}
}
}
}
}发布于 2014-04-24 16:42:33
(相对重要的审查.事先道歉)
我觉得您的代码中最不正确的两个问题是错误的开关语句和错误的计时机制选择。使用这些机制的决定导致了糟糕的OOP设计。
但是,首先,开关错误:
开关(timerChoice) { case 1: friendlyBlue();case 2: enemyBlue();case 3: friendlyRed();case 4: enemyRed();case 5: Dragon();case 6: Baron()};
如果用户选择1,他们会做任何事情!你的开关箱应该“坏掉”:
switch (timerChoice) {
case 1:
friendlyBlue();
break;
case 2:
enemyBlue();
break;
case 3:
friendlyRed();
break;
case 4:
enemyRed();
break;
case 5:
Dragon();
break;
case 6:
Baron();
break;
}其他与代码约定相关的问题(如Baron中的大写B和Dragon中的D)没有那么重要。
Java中的Case语句是“失败的”,除非您希望执行以下语句,否则需要中断。
在Java中,任何定时问题的正确解决方案都是使用库计时器函数。在最近的Java版本中,正确的工具是ScheduledExecutorServiceScheduledExecutorService。此服务允许您在未来安排任务。
我会建造它,就像:
private final class TimedEvent {
private final long preTarget;
private final String message;
TimedEvent(long millis, String message) {
this.preTarget = millis;
this.message = message;
}
private long delayTo(final long target) {
return target - preTarget;
}
}
.....
public static final TimedEvent[] EVENTS = {
new TimedEvent(240000, "4 Minutes left"),
new TimedEvent(180000, "3 Minutes left"),
new TimedEvent(120000, "2 Minutes left"),
new TimedEvent(60000, "1 Minute left"),
new TimedEvent(30000, "30 Seconds left"),
new TimedEvent(15000, "15 Seconds left"),
new TimedEvent(5000, "5 Seconds left"),
new TimedEvent(1000, "1 Second left")
};
....然后,在设置了TimedEvents之后,您可以在一个循环中对它们进行调度,将其计数到目标时间……
final long now = System.currentTimeMillis();
final long target = now + sometime; /// whatever you are counting down to....
for (final TimedEvent te : EVENTS) {
long delay = te.delayTo(target);
if (delay >= 0) {
Callable<Object> torun = new Callable<Void>() {
public void call() {
System.out.println(te.getMessage());
return null;
}
}
scheduler.schedule(torun, delay, TimeUnit.MILLISECONDS);
}
}发布于 2014-04-24 14:39:23
您可以提取每个函数的while循环,并使其成为自己的函数。就像这样
private static void Countdown(long startTime, long endTime, string finalMsg){
while (System.currentTimeMillis() / 1000 < endTime) {
while (startTime != System.currentTimeMillis() / 1000) {
startTime += 1;
if (endTime - startTime > 1) {
if (endTime - startTime == 240)
System.out.println("4 Minutes left");
if (endTime - startTime == 180)
System.out.println("3 Minutes left");
if (endTime - startTime == 120)
System.out.println("2 Minutes left");
if (endTime - startTime == 60)
System.out.println("1 Minute left");
if (endTime - startTime == 30)
System.out.println("30 Seconds left");
if (endTime - startTime == 15)
System.out.println("15 Seconds left");
if (endTime - startTime == 5)
System.out.println("5 Seconds left");
} else if (endTime - startTime == 1) {
System.out.println(finalMsg);
}
}
}然后从每个函数调用倒计时函数。我想它看起来会更干净,也更少重复。
发布于 2014-04-24 14:41:41
您的概念不适合用于多次计数,相反,您可能希望尝试如下所示:
小心,这是草稿!
public class Buff{
private int respawnSeconds;
private String name;
private int respawnsAtSecond;
//constructor + getters and setters
public void kill(int currentGameSeconds){
this.respawnsAtSecond = currentGameSeconds + respawnSeconds;
}
}
public class Game{
private int elapsedSeconds;
private Set<Buff> buffs;
public void start(){
elapsedSeconds = 0;
buffs.add(new Buff("friendlyBlue", 300));
//Add the other buffs
}
//You need some ticking mechanism, maybe you could use something like a while(true)
}您的方法名称不一致。蓝色和红色的方法是camelCase,但是您的更大的目标是PascalCased (Dragon,Baron),除此之外,您非常符合非常清楚和可以理解的基于larger的局部变量。
你让你的方法做得太多了。他们同时进行计数,打印和计算.提取子方法并为不同的目标名称添加参数。
https://codereview.stackexchange.com/questions/48051
复制相似问题