【问题标题】:Find out the exact time to sleep in each thread找出每个线程中的确切睡眠时间
【发布时间】: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


【解决方案1】:

Frog 构造函数可能采用定义frogDelay 的long 参数:

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;
}

您可以添加在运行时更改这些值的功能 - 然后您需要侦听器来纠正青蛙值。

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2022-11-01
    • 2012-07-24
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多