Создание искусственного интеллекта для игры в понг + базовое понимание алгоритма скорости

StackOverflow https://stackoverflow.com//questions/11706756

  •  13-12-2019
  •  | 
  •  

Вопрос

Я делаю игру в понг для своего класса по разработке программного обеспечения, и мне, вероятно, следует сказать, что это домашнее задание, поэтому мое понимание ограничено.и у меня возникли некоторые проблемы с созданием ИИ для моего весла NPC.Я использую Kivy и Python.

В настоящее время я могу создать невозможно победить ИИ, сделав это:

#ai
self.player2.center_y = self.ball.y 

где self.player2.center_y - координата y для NPC (он перемещается только по оси y) и self.ball.y координата y мяча.Я следовал руководству на сайте Kivy, чтобы создать основу игры.

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

Проблема с руководством, которому я следовал, заключается в том, что оно не объясняет все.Я считаю, что мог бы создать функцию скорости, сказав"Every x seconds, the paddle will move x pixels in the y axis."

Вот как подается мяч согласно руководству по киви:

def serve_ball(self, vel=(10,0)):
    self.ball.center = self.center
    self.ball.velocity = vel

Хорошо, сейчас я попробую это понять... vel=(10,0)): вероятно, означает, переместите 10 пикселей X и 0 пикселей Y, назначьте это ball.velocity, и очевидно, что он контролирует скорость...

class PongApp(App):
    def build(self):
        game = PongGame()
        game.serve_ball()
        Clock.schedule_interval(game.update, 1.0/300.0)
        return game

Clock.schedule_interval(game.update, 1.0/300.0) Что касается этого, можно ли с уверенностью предположить, что...это скорость, с которой движется мяч?то есть10 пикселей x и 0 y каждые 1/300 секунды?Если я изменю его на что-то вроде 1/20, оно будет двигаться намного медленнее...поэтому я бы так предположил.

Теперь мне нужно создать функцию для хранения ИИ...возможно

def AI(self):
    self.AI_Speed = self.ball.velocity - 10

self.player1. относится к моему веслу.

И да..Теперь я застрял.Я понятия не имею, как я могу использовать эту скорость для управления перемещением весла.У кого-нибудь есть идеи?А поскольку мой вопрос, скорее всего, крайне неоднозначный, я предоставлю исходники игры на случай, если вам понадобится лучшее понимание.Спасибо.

http://pastebin.com/8wTLbH21

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

Это было полезно?

Решение

Поскольку это такой большой вопрос, я не проверял это или что-то в этом роде, но похоже, что вам нужна какая-то функция, которая перемещает ИИ (я назову ее self.player2.move()).Если вы вызовете эту функцию в game.update(), вы сможете постепенно перемещать ракетку ИИ ближе к тому месту, где она должна находиться, чтобы ударить по мячу.

Некоторый базовый псевдокод для self.player2.move():

figure out if ball is above or below paddle
move self.AI_Speed units in the direction of the ball

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

Это поможет вам выйти из тупика?

Другие советы

Благодаря seaseaotternerd мне удалось написать что-то, что создаст превосходный ИИ.

if self.ball.y < self.player2.center_y:
    self.player2.center_y = self.player2.center_y - 3
if self.ball.y > self.player2.center_y:
    self.player2.center_y = self.player2.center_y + 3

Я получаю положение шаров по оси y, и если оно меньше центра ракетки NPC, я просто каждый раз перемещаю NPC на 3y вниз, пока оно не станет таким же или больше.То же самое, если оно больше центра весла NPC, я просто увеличиваю его.

Затем это определяет скорость весла (3 положения на 1/300 секунды) и позволит мне увеличить сложность для более сложных режимов.

Спасибо!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top