我需要让游戏不可能赢,所以我用这个代码移动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轴运动组成
以一定的速度,如果划桨到达某个角落,它就开始在上角和下角之间来回眨眼。我在代码中找不到原因。
这里的完整代码
发布于 2014-04-04 17:32:50
您的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
的实际意图,而且即使它碰巧在这里工作,添加大括号也是一个很好的习惯,因为它可以在更复杂的代码中防止潜在的微妙逻辑错误。
https://stackoverflow.com/questions/22868629
复制相似问题