首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的pong AI抖动得这么厉害?

为什么我的pong AI抖动得这么厉害?
EN

Stack Overflow用户
提问于 2012-02-04 01:53:18
回答 1查看 1.5K关注 0票数 0

我正在尝试为我的乒乓球游戏制作一个AI,但AI控制的球拍在试图击球时会有很大的抖动。

以下是我的代码的AI部分:

代码语言:javascript
复制
function calculateAI() {
if (paddleA.AI) {
    if (ball.x + (ball.width / 2) <= ctx.canvas.width * 0.4 && ball.directionX == -1) {
        if (ball.y + (ball.height / 2) >= paddleA.y + (paddleA.height + paddleA.heightModifier * 0.75) && paddleA.y + paddleA.height + paddleA.heightModifier < ctx.canvas.height) {
            paddleA.y += paddleA.speed + paddleA.speedModifier;
        }
        else if (ball.y + (ball.height / 2) <= paddleA.y + (paddleA.height + paddleA.heightModifier * 0.25) && paddleA.y > 0) {
            paddleA.y -= paddleA.speed + paddleA.speedModifier;
        }
    }
    else {
        if (paddleA.y + ((paddleA.height + paddleA.heightModifier) / 2) <= (ctx.canvas.height / 2) - 50 && paddleA.y + paddleA.height + paddleA.heightModifier < ctx.canvas.height) {
            paddleA.y += paddleA.speed + paddleA.speedModifier;
        }
        else if (paddleA.y + ((paddleA.height + paddleA.heightModifier) / 2) >= (ctx.canvas.height / 2) + 50 && paddleA.y > 0) {
            paddleA.y -= paddleA.speed + paddleA.speedModifier;
        }
    }
}
}

你可以在这里找到完整代码的.zip:http://dl.dropbox.com/u/23225581/Pong.zip

我的问题是,我如何重构它,以便AI不会有太大的抖动?如果任何人对人工智能有其他建议,我很乐意听听。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-04 02:56:06

我假设你想让AI更顺畅地追球。这里有一些建议:

当球拍靠近球时,移动缓慢

假设AI的速度是8,如果球以2的速度移动,那么球拍不应该跳下8,然后再跳起来。相反,将y位置设置为等于球的位置。

使球拍只在真正需要时才追球

您可能已经实现了这一点,而我只是没有注意到。基本上,如果球会击中球拍的边缘,就不要费心移动了。

我已经修改了你的代码来做这些事情:

代码语言:javascript
复制
function calculateAI() {
if (paddleA.AI) {

    //ball's x position
    var bx = ball.x + (ball.width / 2);

    //Get half he paddle's height and its y position
    var hD2 = (paddleA.height + paddleA.heightModifier)/2;
    var py = paddleA.y;

    //speed
    var speed = paddleA.speed + paddleA.speedModifier;

    //by is either the center of the screen or the ball's y position,
    //depending on what the paddle wants to do.
    var by = ctx.canvas.height/2;
    if (bx <= ctx.canvas.width * 0.4 && ball.directionX == -1) {
        by = ball.y + (ball.height / 2) - hD2;
    }

    //Attempt to move toward 'by' (if I 'have' to)
    if (by > py+hD2) {

        //Jump to position if close enough
        //(Commented out to retain speed)
        /*
        if(by - speed < py)
            py = by;
        else
        */
            py += speed;

    }
    else if (by < py-hD2) {

        //Jump to position if close enough
        //(Commented out to retain speed)
        /*
        if(by + speed > py)
            py = by;
        else
        */
            py -= speed;
    }

    //Border range check goes here


    paddleA.y = py;
}
}

这是不完整的,但一切都应该可以工作。

更多关于乒乓球AI的想法,你可以查看我的乒乓球游戏的源代码:http://jsweeneydev.net84.net/apps.php

http://jsweeneydev.net84.net/apps/pong/game/script.js

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

https://stackoverflow.com/questions/9133155

复制
相关文章

相似问题

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