【发布时间】:2018-02-15 18:01:38
【问题描述】:
我正在制作一个蛇游戏。我创建的每只青蛙(食物)都有两个线程(主线程、蛇线程)和一个线程。青蛙也可以移动,但比蛇慢(所以我可以抓住它们)。这是事情开始变得有趣的时候。为了控制蛇和青蛙的运动,我这样做:
Snake.java:
public void run() {
while (isAlive){
move();
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
我让我的线程休眠一段时间。我对我的主线程做同样的事情,所以我在重新绘制我的 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 是一个神奇的数字,我完全同意。我不知道该怎么做。如何在此处管理我的线程?
编辑:似乎我对什么是“幻数”有错误的看法。
【问题讨论】:
-
在我看来,您只是在使用 3 倍因子使青蛙比蛇移动得慢。将其声明为“frogToSnakeRatio”或具有同等描述性的内容,然后称之为完成。换句话说,当很清楚什么是幻数时,它就不再是幻数了。
-
正如 Andy 所暗示的,使用常量并没有错。问题在于使用一个未命名的常量,对于正在查看您的代码的其他人来说,该常量可能看起来很随意。使字段名称有意义是自记录代码的基石之一。命名常量还使修改代码更加方便。
标签: java multithreading swing jpanel