1

わかりました、別のポン関連の質問があります。今、私は「AI」を改善しようとしています。インターネットで、ボールの x と y を予測し、そこにパドルを移動する必要があることを読みました。

これが私の方程式です。 ここに画像の説明を入力

y=ax+b
a1=(y1-y2)/(x1-x2) - a of the circles line, x1, y1 are taken before movent and x2 y2 after.
b1=y1-ax1

次に、pos 0 0 や画面の高さ、幅などの定数を使用して、パドルの移動ラインの座標を計算しました。

交点を計算するために、次の式を作成しましたa1x4+b1=a2x4+b2a1 b1 b2 a2前に計算したものです。そして、それは機能しません:P 何が問題なのですか?

4

2 に答える 2

3

あなたは正しい方向に進んでいるようです。基本的に、パドルがある場所に到達したときにボールの位置がどこになるかを把握する必要があります。

これは、x速度とy速度を見つけて、上壁と下壁がどこにあるかを追跡することで簡単に実行できます。

xとyの速度を見つけるには、基本的に、設定された時間間隔でボールがx方向とy方向にどれだけ移動したかを調べます。したがって、t = 0で(100(x)、50(y))の位置を見つけたとしましょう...次に、t = 1でボールが(110、65)にあることがわかります。これは、ボールがx方向に単位時間あたり10(ピクセル)、y方向に単位時間あたり15(ピクセル)移動します。

それでは、参考のために使用する部屋のサイズを設定しましょう。部屋を200(x)x 150(y)にして、最も遠いパドルが200になり、最も近いパドルがxの0になります...そして部屋の底が150になり、上部が0になります。 y。

パドルがにある場合はx = 200、そこに到達するのに時間がかかり(200-110)(pixels)/10(pixels per time)ます。ボールがパドルに到達するのにかかる時間がわかったので、ボールがy軸のどこにあるかを把握できます。パドルを使用すると、パドルx=200に到達するまでにさらに9単位の時間がかかることがわかります。したがって、時間にy方向の変化率を掛けて、ボールがy方向にどれだけ移動するかを求めます。したがって、簡単に計算すると、ボールがy軸上で135(ピクセル)移動したことがわかります。

しかし、振り返ってみると、私たちの部屋の高さはわずか150ピクセルであることがわかります。で開始しy=65、65 + 135は200であり、これは制限の150よりも大きいです。したがって、そこでバウンスする必要があります。y = 150したがって、y = mx + bの形式の一次方程式を使用するだけで、ボールがいつ到達するかを見つけることができます。ここで、mはy速度、bは開始y点です。Xは時間の単位で測定され、yは距離の単位で測定されます。

したがって、衝突が発生するyがであることがわかっているy=150ので、移動速度としてmを、元のy位置であるbをプラグインします。

150=(15)(x)+65

xをすばやく解いて、5および2/3単位の時間を取得できます。これで、パドルに当たるまでの合計時間からこれを差し引くことができます(9 units)-(5 and 2/3 units) = (3 and 1/3 units of time)。バウンス後、y速度は負になりますが、単純なバウンスを想定すると同じ速度になります。したがって、y=mx+b方程式を再度使用できますが、ここでボールの最終的なy位置を決定します。

y=(-15)(3 and 1/3)+150

yはボールの最後のy位置であり、速度の15は負になり、時間は上からの跳ね返り後の時間です。画面の下部から開始しているため、bは150です。これをすばやく解決することで、y=100になっていることがわかります。

したがってx = 200、パドルのx位置、またはx位置にいるとき、y位置は100になり、これがパドルでボールを打つことができる場所であることがわかります。

これがすべて正しいことを願って、寝る前にこれを早く終わらせようとします。私はあなたが持っているこれについてのこれ以上の質問に答えることができます。これはすべてあなたが理解するための数学と物理学にすぎません。あなたはこれをあなたが使用しようとしているどんな言語にも解釈する必要があるでしょう。

于 2011-04-05T04:46:34.933 に答える
0

何年も前に、誰かが書いた「ミサイルコマンド」クローンのチートとして、移動するターゲットを導くことを計算する関数を書きました。状況が異なるため、この方法論は完全には適用できませんが、問題は似ているため、これを見ると役立つ場合があります。

その古いフォーラムの投稿を検索したところ、驚くべきことにコードがまだ残っています。

Function Cheat()
  Color 255,0,0
  For M.Meteor = Each Meteor
    distance#=M\m
    x#=(M\Vector\x*distance)+M\ox
    y#=(M\Vector\y*distance)+M\oy
    For i=1 To 6
      distance=M\m+M\speed*Sqr((x-gunx)*(x-gunx)+(y-guny)*(y-guny))/bulletspeed
      x=(M\Vector\x*distance)+M\ox
      y=(M\Vector\y*distance)+M\oy
    Next
    Oval x,y,4,4
  Next
End Function

(そのコードを理解するのが本当に難しい場合は、申し訳ありません。かなりわかりにくい Basic の方言で書かれています。)

基本的には、ちょっとした三角法を使って、ターゲットを直接撃った場合にショットがパスを横切るまでにターゲットがどこにあるかを計算します。次に、計算を繰り返しますが、今度は、前の計算で決定した場所で発砲した場合、ターゲットがどこにあるかを把握します. これを数回繰り返します (上記のコードでは 6 回ですが、実行する必要がある回数はさまざまです。正確になるには十分な回数ですが、プログラムの実行が遅くなるほど頻繁ではありません)。正しい先導で、どこを撃つかを決定します。私のコードでは、その場所に赤い点を描いていますが、座標が分かれば、その情報でやりたいことが何でもできることは明らかです。

于 2011-04-06T02:06:12.213 に答える