首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >乒乓游戏- AI桨闪烁

乒乓游戏- AI桨闪烁
EN

Stack Overflow用户
提问于 2014-04-04 16:53:08
回答 1查看 302关注 0票数 0

我需要让游戏不可能赢,所以我用这个代码移动AI桨。

我的代码一开始可能有点难以读懂,所以它背后的理论是:桨总是用中间点击中球,除非球更靠近边缘,而不是桨长的一半,然后桨停止移动,它的一端接触顶部或底部的窗框。

代码语言:javascript
运行
复制
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();
            }

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

代码语言:javascript
运行
复制
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轴运动组成

以一定的速度,如果划桨到达某个角落,它就开始在上角和下角之间来回眨眼。我在代码中找不到原因。

这里的完整代码

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-04 17:32:50

您的if语句不能正确处理球正好处于条件之间的边界的情况。你有:

代码语言:javascript
运行
复制
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位置在那个边缘。相反,对第二个条件做一个简单的更改:

代码语言:javascript
运行
复制
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语句中使用大括号,比如:

代码语言:javascript
运行
复制
if (bool) {
    if (dx > 0)
        dx += 1;
    else
        dx -= 1;
} else {
    if (dy > 0)
        dy += 0.5;
    else
        dy -= 0.5;
}

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

代码语言:javascript
运行
复制
if (bool)
   ...
else if (dy > 0)
   ...
else // !bool && dy <= 0
   ...

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22868629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档