Как предсказать траекторию мяча в игре в пинг-понг для предсказания весла AI?

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

В этой игре у меня есть мяч, и я могу прочитать его координаты x и y на доске, а затем снова прочитать его в следующей итерации, что позволит мне вычислить скорость в направлениях x и y.

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

До сих пор я думал о переменных, которые мне дали: размер стола в направлениях x и y, положение мяча «в настоящее время» и раньше, чтобы получить его скорость в направлениях x и y. Мое первое предположение состоит в том, чтобы найти способ рассчитать, попадет ли мяч в стены или в сторону ворот ИИ?


person digeridoo    schedule 10.04.2020    source источник
comment
Это выглядит как забавный проект, но вам нужно немного продвинуться вперед, прежде чем кто-либо здесь сможет помочь. Начните программировать его, и когда у вас возникнет конкретная проблема с кодом, опубликуйте его здесь для получения помощи!   -  person Alan    schedule 10.04.2020


Ответы (1)


Существует более прямой способ сделать это вместо повторного raycasting:

def predict(x, y, vx, vy, h, b):
    """
    :param x: ball x position
    :param y: ball y position
    :param vx: ball x velocity
    :param vy: ball y velocity
    :param h: the field height
    :param b: the y position the prediction is for
    :return: ball x position at y = b
    """
    m = vy / vx # slope
    c = -x * m + y # y-intercept
    val = (m * b + c) % (2 * h)
    return min(val, 2 * h - val)

Теперь шаг за шагом

m = vy / vx # slope
c = -x * m + y # y-intercept
val = (m * b + c)

Простая линейная функция, показывающая текущий путь мяча.

Это работает, но только если мяч никогда не попадает в боковую стенку.

Модель

Представьте, что по обе стороны от исходного были поля одинаковой высоты, уходящие в бесконечность.

Теперь «количество отскоков» стало «количеством клеток, которые проходит мяч».

Кроме того, если количество отскоков четное, расстояние от нижней границы ячейки, в которую он попадает, до точки удара совпадает с высотой, на которую фактический мяч попал бы в реальной ячейке.

Следовательно

(m * b + c) % (2 * h)

Чтобы покрыть и нечетные отскоки, вам нужно отразить график вокруг h.

Вот графическое объяснение:

Графическое объяснение

А так как нерелевантным является график со значениями выше h, вы берете минимум.

Возможные проблемы

В некоторых языках % является оператором остатка, но не в python.

Если прогнозы в некоторых случаях отрицательные, добавьте это.

val = ((m * b + c) % (2 * h) + 2 * h) % (2 * h)

Эта функция зависит от «точного» столкновения.

Итак, если отказы обрабатываются подобным образом,

if y not in range(0, y_max):
    vy *= -1

прогнозы будут немного неверными.

Если вы можете изменить основную игру, используйте

if y < 0:
    y *= -1
    vy *= -1
elif y > y_max:
    y = 2 * y_max - y
    vy *= -1

divide by zero exception будет выброшено, если vx равно 0, но поскольку в этом случае мяч никогда не ударится о стену, это должно обрабатываться логикой движения мяча.

person Zirrboy    schedule 06.09.2020