Ai /计算机播放器用于简单的Pong游戏

时间:2012-11-15 21:01:18

标签: java

好吧,我刚刚完成了我的乒乓球比赛,但现在我想要一个AI让玩家对战。 我试过这样做,以便当NPC padel的位置超过球的Y值时,它移动到右侧区域试图阻挡球。 这是我的padel类的代码:

    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's out。 我做错了什么???

1 个答案:

答案 0 :(得分:0)

我没有发现你的确切问题,只有一小段代码我无法运行并看到问题,但我确实为你提供了一些建议。

首先,在您检查限制的任何地方,您都要检查确切的条件。如果位置以某种方式设置为奇数值,或者以某种方式跳过限制,则限制代码将无法处理它。我建议不要

    if(LeftPlayerUp==true){
        if(LeftLocation==50){}
        else{
            LeftLocation-=2;
        }
    }

你应该使用

    if (LeftPlayerUp) {
        if (LeftLocation <= 50) {
            LeftLocation = 50;
        }
        else {
            LeftLocation-=2;
        }
    }

这样一来,如果LeftLocation获得了一个被破坏的疯狂值,它就会被纠正。在检查限制的任何地方使用此模式。

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

祝你好运,玩得开心。