Как экстраполировать позицию в понг? - PullRequest
1 голос
/ 03 апреля 2011

Хорошо, у меня есть еще один вопрос, связанный с понгом.Сейчас я пытаюсь улучшить «ИИ».Я прочитал в интернете, что должен предсказать x и y мяча и переместить туда весло.

Вот мои уравнения.enter image description here

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+b2.a1 b1 b2 a2 это вещи, которые я рассчитывал раньше.И это не работает: P Что не так?

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

Кажется, вы на правильном пути.По сути, вы хотите выяснить, где будет положение шариков, когда оно достигнет места, где находится весло.

Вы можете легко сделать это, найдя скорости x и y и отследив, где находятся верхняя и нижняя стенки.are.

Чтобы найти скорость x и y, вы в основном определяете, как далеко шарик прошел в направлении x и направлении y за заданный интервал времени.Итак, допустим, что вы находите местоположение (100 (x), 50 (y)) в момент времени t = 0 ... затем вы видите, что в момент времени t = 1 мяч находится в точке (110, 65), это означает, что мячперемещение 10 (пикселей) за единицу времени в направлении x и 15 (пикселей) за единицу времени в направлении y.

Итак, давайте установим размер нашей комнаты, чтобы использовать ее для справки.давайте сделаем нашу комнату 200 (х) на 150 (у), чтобы самое дальнее весло было на 200, а самое близкое на 0 на х ... и основание комнаты на 150, а вершина - 0 наy.

Если ваше весло на x = 200, вам понадобится (200-110)(pixels)/10(pixels per time).Теперь, когда вы знаете, сколько времени понадобится мячу, чтобы достичь весла, вы можете выяснить, где находится шар на оси Y.Используя весло на x=200, мы обнаружим, что потребуется еще 9 единиц времени, чтобы достичь весла.Таким образом, мы просто умножаем количество времени на скорость изменения в направлении y, чтобы определить, насколько далеко шар движется в направлении y.Таким образом, при быстром вычислении мы получаем, что шар переместился на 135 (пикселей) по оси y.

Но мы можем оглянуться назад и увидеть, что наша комната имеет высоту всего 150 пикселей.Мы начали с y=65, а 65 + 135 - это 200, что превышает наш предел в 150. Таким образом, у нас должен быть отскок.Таким образом, мы можем определить, когда мяч достигнет y = 150, просто используя линейное уравнение в виде y = mx + b.Где наш m - это скорость y, а наш b - начальная точка y.Х измеряется в единицах времени, а у - в наших единицах расстояния.

Итак, мы знаем, что наш y, где происходит столкновение, находится на y=150, поэтому мы включаем его вместе с m как нашей скоростью перемещения и нашим b, который является нашей исходной позицией y.

150=(15)(x)+65

Мы можем быстро решить для х, чтобы получить 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 весла, наша позиция y будет в100, и это - то, где мы можем ударить по мячу с веслом.

Надеюсь, это все правильно, пытаясь закончить это быстро перед сном.Я могу ответить на любые другие вопросы об этом, что у вас есть.Это все, что вам нужно понять - это математика и физика, вам нужно будет интерпретировать это на любом языке, который вы намереваетесь использовать.

0 голосов
/ 06 апреля 2011

Несколько лет назад я написал функцию для расчета направления движущейся цели в качестве обмана для клона "Missile Command", который кто-то написал. У вас другая ситуация, поэтому эта методология не совсем применима, но ваша проблема похожа, поэтому ее просмотр может быть вам полезен.

Я только что искал это старое сообщение на форуме, и удивительно, что код все еще там:

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 раз в приведенном выше коде, но количество раз, которое вам нужно будет сделать, будет различным; достаточно времени, чтобы быть точным, но не слишком часто, чтобы замедлить выполнение программы) на правильном ведении, чтобы определить, куда стрелять. В моем коде я рисую красную точку на месте, но, очевидно, вы можете делать с информацией все, что захотите, как только выясните координаты.

...