PythonJogaPong — Parte 2 Capturando teclas pressionadas e salvando dados de treino
Esse post faz parte de uma série onde explico o projeto PythonJogaPong, que usa redes neurais para jogar o jogo clássico de atari Pong. Veja também as outras partes: Parte 1 Parte 3 Parte 4
Para que a rede a neural possa saber quais ações tomar durante o jogo, ela precisa ser “ensinada” com dados reais. Então precisamos de rotinas para capturar nossos movimentos durante o jogo para que possamos ensinar nossa neural network. Para isso vamos usar dois arquivos:
- https://github.com/pilotorobo/pongplay/blob/master/pressed_keys.py
- https://github.com/pilotorobo/pongplay/blob/master/get_train_data.py
Aqui definimos a função para capturar as teclas pressionadas. Precisamos da lib numpy
e da lib cv2
(opencv). Vamos utilizar o módulo win32api
que faz parte do pacote pywin32. Ela utiliza o método GetAsyncKeyState
para verificar cada tecla que está pressionada. O código 38 é a seta para cima do teclado, o código 40 é a seta para baixo, e a função ord(“Q”)
retorna o código da letra Q. Queremos verificar apenas essas teclas pois usamos a tecla Q para finalizar o programa e as setas para movimentar as barras. Utilizamos a comparação down_pressed==up_pressed
porque caso as duas teclas tenham o mesmo estado, soltas ou pressionadas, a barra não se movimentará, então interpretamos como um caso só.
A rotina desse arquivo é utilizada para gravar os movimentos do jogador e o estado dos objetos do jogo a cada instante. Utilizamos a cada instante a função get_screen features
para capturar a tela do jogo e seus atributos e a função get_key_pressed
para saber qual tecla está sendo pressionada neste momento. Antes de começar gravar qualquer ação, a rotina permite que o usuário ajuste a tela do jogo dentro do range da tela auxiliar, já que só será capturado o que estiver dentro desta tela auxiliar. Após isso, ao pressionar as teclas para cima ou para baixo, a flag saving_data
setará e a rotina de gravação entrará em ação. Juntamos os dados da tela e da tecla pressionada no mesmo vetor train_data_point
e após isso adicionamos essa variável no buffer train_data_buffer
. Para terminarmos a gravação e salvar os dados em um arquivo, apenas pressionamos a tecla Q. Os dados de treino serão salvos em um arquivo .npy. Sem segredos.