首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个简单的乒乓球游戏的Ai/计算机玩家

一个简单的乒乓球游戏的Ai/计算机玩家
EN

Stack Overflow用户
提问于 2012-11-16 05:01:18
回答 1查看 1.4K关注 0票数 0

好了,我刚写完我的乒乓球游戏,但现在我想要一个供玩家玩的人工智能。我尝试过这样做,当NPC球的位置超过球的Y坐标时,它会移动到正确的区域,试图阻挡球。下面是我的padel类的代码:

代码语言:javascript
复制
    import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


public class Padel implements KeyListener{
    private Ball ball = new Ball();
    private boolean LeftPlayerUp=false;
    private boolean LeftPlayerDown=false;
    private boolean RightPlayerUp=false;
    private boolean RightPlayerDown=false;
    public int RightLocation=200;
    public int LeftLocation=200;

    public void keyPressed(KeyEvent e){
        int KeyPressed = e.getKeyCode();

        if (KeyPressed== KeyEvent.VK_W){
            LeftPlayerUp=true;
        }
        else if (KeyPressed==KeyEvent.VK_S){
            LeftPlayerDown=true;
        }
    }
    public void keyReleased(KeyEvent e){
        int KeyReleased = e.getKeyCode();

        if (KeyReleased== KeyEvent.VK_W){
            LeftPlayerUp=false;
        }
        else if (KeyReleased==KeyEvent.VK_S){
            LeftPlayerDown=false;
        }
    }
    public void ShouldLeftMove(){
        if(LeftPlayerUp==true){
            if(LeftLocation==50){}
            else{
                LeftLocation-=2;
            }
        }
        else if(LeftPlayerDown==true){
            if(LeftLocation==Main.Height-190){}
            else{
            LeftLocation+=2;
            }
        }
    }   
    public void ShouldRightMove(){
        if(ball.BallLocationY>=RightLocation){
            RightPlayerUp=false;
            RightPlayerDown=true;
        }else{
            RightPlayerUp=true;
            RightPlayerDown=false;
        }
        if(RightPlayerUp==true){
            if(RightLocation==50){}
            else{
            RightLocation-=2;
            }
        }
        else if(RightPlayerDown==true){
            if(RightLocation==Main.Height-190){}
            else{
            RightLocation+=2;
            }
        }
    }   
    //This just needs to be here :P
    public void keyTyped(KeyEvent e) {}
}

有了这段代码,padel在屏幕右侧向下移动了大约2/3rds,然后就停止了移动,spaz就出来了。我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2012-11-16 06:20:20

我还没有发现你的确切问题,而且只有一小段代码,我不能运行它并看到问题所在,但我确实有一些建议给你。

首先,无论你在哪里检查极限,你都要检查确切的条件。如果位置以某种方式被设置为奇数值,或者以某种方式超过了限制,您的限制代码将无法处理它。我建议不要这样做

代码语言:javascript
复制
    if(LeftPlayerUp==true){
        if(LeftLocation==50){}
        else{
            LeftLocation-=2;
        }
    }

你应该使用

代码语言:javascript
复制
    if (LeftPlayerUp) {
        if (LeftLocation <= 50) {
            LeftLocation = 50;
        }
        else {
            LeftLocation-=2;
        }
    }

这样,如果LeftLocation获得了一个疯狂的值,它将被简单地纠正。在您检查限制的任何地方使用此模式。

我的另一点建议是,你的计算机播放器算法非常简单。它没有考虑球的移动方向。如果球在右桨上方,但向下移动,也许右桨不应该移动。现在,你不希望电脑玩家一直玩得很完美,因为对于只会输的人来说,这并不有趣;但你应该从一个完美的电脑玩家开始。要做到这一点,最好的方法就是计算出球将在哪里越过右划桨的线。您的游戏知道球的当前位置,以及它将向右和向上/向下移动的速度,因此您的游戏可以预测球将移动的位置;您甚至可以模拟球的整个轨迹,包括反弹并精确计算球将移动的位置。然后让电脑玩家将球拍移向那个点。一旦你有了完美的计算机人工智能,然后添加随机错误,或者简化它(比如去掉处理反弹的代码;也许击败人工智能的方法总是将球从墙上反弹!)。

祝你好运,玩得开心。

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

https://stackoverflow.com/questions/13406133

复制
相关文章

相似问题

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