A criação de inteligência artificial do jogo de Pong + compreensão básica do algoritmo de velocidade

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

  •  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.

http://pastebin.com/8wTLbH21

p.s.percebo que essa é uma grande questão e pedir muito, mas eu espero que alguém possa responder.Obrigado.

Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top