26

Pacman と Snake を実装した後、次の非常に古典的なゲームである Pong を実装しています。

実装は非常に簡単ですが、1 つだけ小さな問題が残っています。パドル(パドルと呼んでいるかどうかはわかりません)の1つがコンピューターによって制御されている場合、正しい位置に配置するのに苦労します。

ボールには、現在の位置、速度 (現時点では一定)、および方向角があります。それで、コンピューター制御のパドルの側面に当たる位置を計算できました。そして、パドルをそこに配置することができました。しかし、実際のゲームでは、コンピューターのパドルがボールを逃す可能性があります。この確率をどのように実装できますか?

コンピューターのパドルがボールに当たる確率を 0.5 とすれば問題は解決しますが、それほど単純ではないと思います。

元のゲームから、確率は現在のパドル位置とボールが境界に当たる位置との間の距離に依存すると思います。

これがどのように正確に計算されるかについてのヒントはありますか?

4

7 に答える 7

31

とても楽しい本「RacingtheBeam」(Googleブックス:http://books.google.co.uk/books?id = DqePfdz_x6gC&lpg = PP1&dq = Racing%20the%20beam&pg = PA40#v = onepage&q&f = false )からの引用元の手法は次のとおりです。

正確なパドルポジショニングに固有の人為的エラーをシミュレートするために、AIパドルは8フレームごとに調整をスキップします。結果として生じる動作は目に見えて目立たないものですが、コンピュータープレーヤーの狙いを十分にドリフトさせて、ボールを時々逃すことができます。実装することも技術的に簡単であり、単一のマスクと、対応する6502命令が存在するバイナリAND演算のみを必要とします。プログラマーは、別の単一のオペコードを使用して結果がゼロかどうかをテストし、必要に応じて分岐して、パドルを移動する命令をスキップできます。

ゲームを完全に機能させるには、この動作を少し変更する必要があります。AIプレーヤーが8フレームごとにボールの追跡を停止した場合、数秒以内に同期が外れることはありません。これを防ぐために、AIは、プレイフィールドの上部と下部の近くにある2番目のボール追跡スキームに従います。パドルが壁に位置合わせされているときにボールがこれらの壁の1つに衝突すると、パドルは再調整され、ボールが最後に壁に当たってから蓄積されたドリフトから回復します。その結果、コンピューターのパドルとボールの確率的なずれと再調整が発生します。

于 2011-01-02T10:50:50.087 に答える
22

高校のCSクラス用に(疑似)3D卓球ゲームを作りました。私たちがしたことは、コンピューターが常にパドルをボールに向かって動かすようにしましたが、最大速度で、ボールが遠すぎるとボールを逃す可能性がありますが、それでもスマートです。これは役に立ちますか?

于 2011-01-02T09:29:32.583 に答える
5

他の回答では、さまざまな状況で移動する正しい方向を決定する方法について説明しています。また、コンピューター プレイヤーがこの方向に動き始めることで「反応」するまでの遅延時間を追加することもできます。これは、人間のプレイヤーの典型的な反応を反映しています。

于 2011-01-02T09:48:50.760 に答える
5

パドルを常に現在の位置から特定のポイントに移動する必要があると思います。これは、ボールがパドルと垂直に整列すると予想される場所です。次に、パドルがこの正確なポイントに移動してボールをそらす可能性が 50%、X ピクセルほどオーバーシュートする可能性が 25%、アンダーシュートする可能性が 25% です。それを行うためのさらに良い方法は、毎回異なる量でミスするように、ベル カーブ上のその位置に移動させることです。

于 2011-01-02T09:24:42.613 に答える
4

これを行うための「公式」の方法が何であるかはわかりませんが、私はいつも(疑似コード)を使用してきました

if (ball is above paddle) {
    move paddle up
}
if (ball is below paddle) {
    move paddle down
}

次に、パドルの速度をわずかに変化させましたが、これは十分に遅く、常にボールについていくとは限りませんでした。ちょっと粗いですが、うまくいきます。

このスレッドにも興味深いアイデアがいくつかあります: http://www.gamedev.net/community/forums/topic.asp?topic_id=439576

于 2011-01-02T09:35:41.077 に答える
4

たまたま、先日楽しみのために pong クローンを書きました。

ここで再生し、ここでソース コードを表示できます

AI はボールの現在の速度を取得し、壁から離れた x 距離を乗算します。次に、その計算された位置に向かって上限速度で移動します。垂直方向の跳ね返りは考慮されていませんが、これは意図的なものです (AI を打ち負かすため)。

関連するスニペットは次のとおりです。

/* Update enemy based on simple AI */
enemy.update = function (delta) {
    var impactDistance, impactTime, targetY, speed;
    speed = .25; // a little slower than the human player

    if (ball.vx < 0) {
        // Ball is moving away, AI takes a nap ..
        return;
    }

    // Figure out linear trajectory ..
    impactDistance = width - ball.width - ball.x;
    impactTime = impactDistance / (ball.vx * .25 * 1000);
    targetY = ball.y + (ball.vy * .25 * 1000) * impactTime;

    if (Math.abs(targetY - (this.y + this.height/2)) < 10) {
        // AI doesn't need to move
        return;
    }

    if (targetY < this.y + (this.height / 2)) {
        // Move up if ball is going above paddle
        speed = -speed;
    }

    this.y += speed * delta;
    this.keepInBounds();
};
于 2011-01-02T15:34:38.387 に答える
2

何度か繰り返した後、パドル (視点によっては自分のものまたは AI のもの) が画面の上部または下部に近すぎる場合、必要な距離をカバーすることは単純に不可能です。パドルは簡単にボールの y 値をたどることができます。遠すぎると見逃してしまいます。

別の方法として、各ヒット後に AI を中央にリセットするか、ボールが離れている間 (つまり、対戦相手に向かって) 中央に向かって移動することができます。

もっと簡単に言えば:
- ボールが遠ざかっている間は中心に向かって移動します - ボールが近づいている間はボールの y 座標を模倣します。

ここから、y座標の模倣メカニズムをボールより遅くすることで難易度を変更できます(より一貫性があり、おそらく元の実装がどのようなものでしたか。難易度は単純な速度係数に抽象化されているため)、または各動きにランダムエラーを追加するか、それ以外は。

于 2011-01-02T09:35:37.437 に答える