0

好的,我刚写完我的乒乓球游戏,但现在我想要一个 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/3 处,然后停止移动,spaz 消失。我究竟做错了什么???

4

1 回答 1

0

我还没有发现您的确切问题,并且只有一小段代码我无法运行它并查看问题,但我确实有一些建议给您。

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

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

你应该使用

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

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

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

祝好运并玩得开心点。

于 2012-11-15T22:20:20.127 回答