Snake.java:
public void run() {
while (isAlive){
move();
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
我让我的线程睡了一段时间。我对我的MAIN线程做同样的事情,所以重新绘制我的JPanel没有任何问题:
GameController.java:
void tick() {
for (Frog frog : frogs) {
if (CollisionChecker.checkFoodCollision(snake.getBody().get(0), frog)) {
snake.grow();
frog.respawn();
score++;
}
}
if (CollisionChecker.checkSnakeCollision(snake.getBody())){
onStop();
}
try {
Thread.sleep(snakeDelay);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
如果我想抓住我的青蛙,我必须让它们睡得更久,所以我这样做了:
Frog.java
public void run() {
while (isAlive){
try {
Thread.sleep(snakeDelay * 3);
} catch (InterruptedException e) {
e.printStackTrace();
}
move();
}
}
游戏有效,但当我发送我的项目进行代码审查时,我被告知方法 run()中的 3 是一个神奇的数字,我完全同意。我不知道该怎么办。我如何在这里管理我的线程?
编辑:好像我对什么是“神奇数字”有错误的看法。
答案 0 :(得分:2)
Frog
构造函数可能会使用long
参数来定义frogDelay
:
class Frog {
private long delay;
public Frog(long delay) {
this.delay = delay;
}
public void run() {
Thread.sleep(delay);
}
}
创建new Frog(calculateFrogDelay())
时,此参数的值可以通过常量SHAKE_DELAY
和RATIO
来计算:
private final long SHAKE_DELAY = 100;
private final int RATIO = 3;
private long calculateFrogDelay() {
return SHAKE_DELAY * RATIO;
}
您可以添加在运行时更改这些值的功能 - 然后您需要侦听器来更正青蛙值。