乒乓球比赛 - AI桨闪烁

时间:2014-04-04 16:53:08

标签: java game-physics

我需要让游戏无法获胜,所以我用这个代码来移动AI桨。

我的代码起初可能稍微不可读,所以这里有它的理论:桨总是用中点击球,除非球更接近边缘而不是桨长的一半,然后桨叶停止移动,其一端接触顶部或底部窗框。

if (ball.getY() < getHeight() - HEIGHT / 2
                    && ball.getY() > HEIGHT / 2) { 
                paddleRight.setLocation(getWidth() - 3 * WIDTH, ball.getY()
                        - HEIGHT / 2);
                image2.setLocation(getWidth() - 3 * WIDTH, ball.getY() - HEIGHT
                        / 2);
                image2.sendToFront();
            } else if (ball.getY() < HEIGHT / 2) {
                paddleRight.setLocation(getWidth() - 3 * WIDTH, 0);
                image2.setLocation(getWidth() - 3 * WIDTH, 0);
                image2.sendToFront();
            } else {
                paddleRight.setLocation(getWidth() - 3 * WIDTH, getHeight()
                        - HEIGHT);
                image2.setLocation(getWidth() - 3 * WIDTH, getHeight() - HEIGHT);
                image2.sendToFront();
            }

我的球在比赛期间也会随机加速:

boolean bool = rand.nextBoolean();
            if (bool)
                if (dx > 0)
                    dx += 1;
                else
                    dx -= 1;
            else if (dy > 0)
                    dy += 0.5;
                 else
                    dy -= 0.5;

球运动由X轴和Y轴运动组成

并且在某个特定的速度下,如果桨到达其中一个角落,它会开始在顶部和底部角落之间来回闪烁。我无法在我的代码中找到原因。

Full code here

1 个答案:

答案 0 :(得分:0)

您的if语句无法正确处理球完全处于条件之间边界的情况。你有:

if (ball.getY() < getHeight()-HEIGHT/2 && ball.getY() > HEIGHT/2) { 
    ...
} else if (ball.getY() < HEIGHT/2) {
    ...
} else { 
    ...
}

ball.getY() == HEIGHT/2会发生什么?在这种情况下,它将落到第三个区块,但这不是所希望的行为 - 它会在ball.getY() == HEIGHT/2时短暂跳转到第三个条件,因此当球的Y位置在那个位置时闪烁边缘。相反,只需对第二个条件进行简单的更改:

if (ball.getY() < getHeight()-HEIGHT/2 && ball.getY() > HEIGHT/2) { 
    ...
} else if (ball.getY() <= HEIGHT/2) { // note <= instead of <
    ...
} else { // ball.getY() >= getHeight()-HEIGHT/2
    ...
}

这应该照顾过渡案例。


顺便说一句,不相关的,你应该在嵌套的if语句中使用大括号,例如你所拥有的语句:

if (bool) {
    if (dx > 0)
        dx += 1;
    else
        dx -= 1;
} else {
    if (dy > 0)
        dy += 0.5;
    else
        dy -= 0.5;
}

虽然在这种情况下您的原始逻辑恰好具有相同的效果,但是您的原始代码尽管有轻微的误导性缩进,但实际上具有以下结构:

if (bool)
   ...
else if (dy > 0)
   ...
else // !bool && dy <= 0
   ...

这可能并不反映if的实际意图,即使它恰好在这里起作用,添加花括号是一个很好的习惯,因为它可以防止潜在的微妙逻辑错误在更复杂的代码中。