A criação de inteligência artificial do jogo de Pong + compreensão básica do algoritmo de velocidade
-
13-12-2019 - |
Pergunta
Eu estou fazendo um jogo de pong para o meu desenvolvimento de software de classe, e eu provavelmente deveria afirmar que este é o dever de casa, daí a minha limitada compreensão.e eu estou tendo alguns problemas na criação do AI para o meu NPC remo.Eu estou usando Kivy e Python.
Atualmente eu posso criar impossível vencê AI fazendo isso:
#ai
self.player2.center_y = self.ball.y
onde self.player2.center_y
é a coordenada y para o NPC (só se move sobre o eixo y) e self.ball.y
é a coordenada y para a bola.Eu segui o tutorial sobre o Kivy site para criar a base do jogo.
Agora eu não tenho nenhuma idéia sobre como eu posso criar AI que vai ser beatable.Eu sei que vai ser necessário limitar a velocidade do AI, por isso quando a bola chega tão rápido que não será capaz de agarrá-lo.A coisa é, porém, que eu, na verdade, não tem uma função de velocidade.
O problema com o tutorial que eu segui é que ela não explica tudo.Eu acredito que eu poderia fazer uma função de velocidade por dizer
"Every x seconds, the paddle will move x pixels in the y axis."
Esta é a forma como a bola é servido como por kivy tutorial:
def serve_ball(self, vel=(10,0)):
self.ball.center = self.center
self.ball.velocity = vel
Tudo bem, agora eu vou tentar entender isso... vel=(10,0)):
provavelmente significa mover-se a 10 pixels X e 0 no Y pixels, atribuir-se que para ball.velocity
, e, evidentemente, que controla a velocidade...
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)
com relação a isso, É seguro assumir que...que é a taxa em que a bola se move?i.e.10 pixels x e 0 no y, cada 1/300 segundos?Se eu mudar para algo como 1/20, move-se muito mais lento...então eu diria assim.
Agora eu preciso criar uma função para armazenar AI...talvez
def AI(self):
self.AI_Speed = self.ball.velocity - 10
self.player1.
refere-se a minha pá.
E sim..Agora eu estou preso.Eu não tenho nenhuma idéia de como eu posso usar essa velocidade para controle de mover a raquete.Alguém tem alguma idéia?E Desde a minha pergunta é mais provável extremamente ambíguo, eu vou fornecer a origem do jogo caso você precisa de uma melhor compreensão.Obrigado.
p.s.percebo que essa é uma grande questão e pedir muito, mas eu espero que alguém possa responder.Obrigado.
Solução
Uma vez que este é uma grande questão, eu não testei isso ou nada, mas parece que você quer ter algum tipo de função que move o AI (vou chamá-lo de si mesmo.player2.mover()).Se você chamar esta função no jogo.update(), então você deve ser capaz de mover o AI pá incrementalmente mais perto de onde ele precisa ser para bater a bola.
Alguns básica pseudocódigo para auto.player2.move():
figure out if ball is above or below paddle
move self.AI_Speed units in the direction of the ball
Você pode precisar ajustar o AI velocidade mais para fazer esse trabalho, mas eu acho que deve ser o direito idéia geral.Se você pensar sobre isso, o imbatível AI é basicamente apenas infinitamente rápido.
Isso ajuda você a obter o coreto?
Outras dicas
Graças a seaseaotternerd eu consegui escrever algo que faz uma beatable AI.
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
Eu obter as bolas de posição y, e se é menos do que o centro do NPC pá, eu vou simplesmente mover o NPC para baixo por 3y cada vez até que é o mesmo ou maior.Mesma coisa com se é mais do que o centro do NPC pá, eu só aumentá-lo.
Este, em seguida, define a velocidade da raquete (y 3 posições por 1/300 de um segundo) e vai permitir-me para aumentar a dificuldade para mais modos.
Obrigado!