PythonJogaPong — Parte 4 Controlando o jogo por uma Neural Network

Lucas Oliveira
pilotorobo
Published in
3 min readOct 25, 2017

Esse post faz parte de uma série onde explico como criar um projeto em python para jogar o clássico jogo pong automaticamente. Veja também as outras partes: Parte 1 Parte 2 Parte 3

Nesta quarta e última parte, iremos utilizar a rede criada e treinada no post anterior para inferir (isso é pedir para a rede nos dizer o que fazer) quais ações devemos tomar no jogo, ir pra cima, para baixo ou ficar parado. O código desta parte está em:

https://github.com/pilotorobo/pongplay/blob/master/infer_action.py

Então vamos a ele:

import numpy as np                       
import cv2
from screen_features import get_screen_features from pressed_keys import get_key_pressed from directkeys import PressKey, ReleaseKey from neural_net import NeuralNetwork

Primeiramente importamos os objetos necessários:

  • numpy para operações matemáticas
  • cv2 (opencv) para manipulação de imagens
  • get_screen_features para capturar a tela e localização dos objetos nela
  • get_key_pressed para capturar teclas pressionadas
  • PressKey e ReleaseKey para emular teclas pressionadas
  • NeuralNetwork para nos dizer qual ação tomar

Como esta parte do projeto não define nenhuma função nova, simplesmente juntamos tudo o que criamos anteriormente e executamos em main().

Primeiro printamos algumas informações na tela, então declaramos a flag infering para saber se já estamos inferindo as ações ou não. Em seguida criamos e carregamos a rede neural treinada e fazemos um ‘truque’ para limpar o registro de qualquer tecla pressionada anteriormente chamando o método get_key_press. Então declaramos as variáveis last_pos para serem usadas para calcular a velocidade da bola posteriormente.

Criamos um while para ficar capturando os dados da tela até que a tecla ‘q’ seja pressionada ou o programa fechado. Entre as linhas 4 e 14 capturamos a tela e a localização dos objetos, capturamos também as teclas pressionadas, em seguida criamos (ou atualizamos) a janela auxiliar com a imagem do jogo e então verificamos se a tecla ‘q’ foi pressionada. Entre as linhas 17 e 23 calculamos a velocidade da bola, gravamos a ultima posição dela e inserimos a velocidade no vetor screen features. Na linha 26 verificamos a flag infering, caso esteja setada, começamos a inferir ações da rede neural. Nas linhas 28 e 29 geramos um score de qual tecla apertar passando o feature vector para a neural network e determinamos a tecla como sendo a com maior score. Entre as linhas 31 e 42 determinamos as teclas a serem pressionadas e soltas utilizando as funções PressKey e ReleaseKey. O valor correspondente a tecla cima é 0x48 e para baixo 0x50. Importante que esses valores utilizam as teclas cima e baixo do teclado numérico, então para funcionar você deve desligar a tecla numlock. Por fim, do outro lado do bloco if da linha 26, verificamos se a tecla pressionada dentro do loop foi para cima (valor 1) ou para baixo (valor 2). Caso positivo, a flag infering é setada e no próximo loop começamos inferir os dados. Dessa forma, em todo loop o programa captura as informações da tela, passa para a neural network e ela determina qual tecla apertar para rebater a bola.

As vezes ela vai errar, mas afinal ela está copiando nosso comportamento não é? rsrs

Por fim terminamos essa série de posts sobre neural networks jogando pong. Essa abordagem pode ser utilizada para jogar outros jogos simples também (como aquele de rebater uma bolinha e destruindo as barras que eu não lembro o nome). Veja também as outras partes: Parte 1 Parte 2 Parte 3

Siga o blog para não perder nenhum post e qualquer dúvida, deixe nos comentários que terei o maior prazer em responder!

Se gostou, bata algumas palmas 👏 para nós ! e ajude outros encontrar este artigo!

--

--

Lucas Oliveira
pilotorobo

Working at the intersection of artificial intelligence and education.