0

OK、卓球ゲームを書き終えたばかりですが、プレイヤーが対戦する AI が必要です。NPC パデルの位置がボールの Y 座標を超えると、正しいエリアに移動してボールをブロックしようとするようにすることで、これを実行しようとしました。私のパデルクラスのコードは次のとおりです。

    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) {}
}

このコードを使用すると、パデルは画面の右側の約 2/3 まで移動し、移動を停止してスパズアウトします。私は何を間違っていますか???

4

1 に答える 1

0

私はあなたの正確な問題を見つけていません.コードのほんの少しのスニペットでは、それを実行して問題を確認することはできませんが、アドバイスがあります.

まず、制限をチェックするときはいつでも、正確な状態をチェックします。場所が何らかの理由で奇妙な値に設定されたり、何らかの理由で制限を超えたりした場合、制限コードはそれを処理しません。代わりに

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

あなたが使用する必要があります

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

このようにして、LeftLocation が異常な値を取得した場合でも、単純に修正されます。制限をチェックするすべての場所でこのパターンを使用します。

もう 1 つのアドバイスは、コンピュータ プレーヤーのアルゴリズムは非常に単純だということです。ボールが動いている方向は考慮されません。ボールが右のパドルの上にあり、下に移動している場合、おそらく右のパドルは動かすべきではありません...コンピュータ プレーヤーに常に完璧なプレーをさせたくありません。負けるしかない人間。ただし、完璧なコンピューター プレーヤーから始める必要があります。これを行う最善の方法は、ボールが右パドルのラインを横切る場所を計算することです。ゲームは、ボールの現在の位置と、ボールが右および上/下に移動する速度を認識しているため、ボールがどこに移動するかを予測できます。バウンスを含むボールの軌道全体をシミュレートし、ボールがどこに行くかを正確に計算することもできます。次に、コンピューター プレーヤーにパドルをその場所に向けて動かさせます。完璧なコンピューター AI が機能するようになったら、ランダムな間違いを追加するか、単純化します (バウンスを処理するコードを取り出すなど。AI を打ち負かす方法は、常にボールを壁からバウンドさせることです!)。

頑張って楽しんでね。

于 2012-11-15T22:20:20.127 に答える