ALE-Space Invaders: Solución al problema del controlador de teclado

ALE-Space Invaders: Solución al problema del controlador de teclado

de FRANCISCO JOSE GALLEGO DURAN -
Número de respuestas: 0

Hola a todxs:

He revisado el problema que teníamos en clase con Space Invaders. Os cuento la solución:

  • En cada iteración, vuestro agente debe llamar una y sólo una vez al método act de ALE.
    • Si no se hace la llamada, el emulador no avanza un fotograma, y no se simula nada.
  • Si se llama más de una vez, realiza sólo una de las acciones (no está claro cual).
    • En clase hacíamos act(PLAYER_A_NOOP) siempre al final, además de un act si el jugador había pulsado algo.
    • Así, a veces nuestro jugador hacia NOOP, y a veces lo que habíamos pulsado.

Así pues, en código, simplemente tenéis que hacer las comprobaciones diferentes para hacer una única llamada a act.

Ejemplo:

auto* keys = SDL_GetKeyState(nullptr);

if      ( keys[SDLK_LEFT]  ) { reward = alei.act(PLAYER_A_LEFT ); }
else if ( keys[SDLK_RIGHT] ) { reward = alei.act(PLAYER_A_RIGHT); }
else if ( keys[SDLK_SPACE] ) { reward = alei.act(PLAYER_A_SPACE); }
else                         { reward = alei.act(PLAYER_A_NOOP ); }

Así, si el jugador pulsa una tecla, se hace una acción y, si no, se hace NOOP. De esta forma se asegura que en cada turno se realiza una iteración de juego, pulse el jugador o no pulse, y no se interrumpe el control de teclado.

Ya podéis elaborar vuestro propio controlador de teclado en Space Invaders y empezad a tomar datos para entrenar. Recordad que si queréis hacer acciones simultáneas como Izquierda + Disparo tenéis que usar valores concretos (PLAYER_A_LEFTFIRE). Tenéis la tabla de acciones en local en docs/environment.md (link a la versión en github).

Un detalle interesante más:

  • Para reducir el parpadeo de las balas y poder jugar mejor, podéis activar el color averaging:
    • alei.setBool ("color_averaging", true);
    • Esto hace que lo que se ve en pantalla sea una "media" de los últimos 2 o 3 fotogramas.
  • El parpadeo es porque al juego no le da tiempo a pintar los sprites todos los fotogramas, así que se salta fotogramas.

Nos vemos el lunes con las presentaciones.

Un saludo,
Fran.