我需要让游戏无法获胜,所以我用这个代码来移动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轴运动组成
并且在某个特定的速度下,如果桨到达其中一个角落,它会开始在顶部和底部角落之间来回闪烁。我无法在我的代码中找到原因。
答案 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
的实际意图,即使它恰好在这里起作用,添加花括号是一个很好的习惯,因为它可以防止潜在的微妙逻辑错误在更复杂的代码中。