Cómo hacer una IA que pueda jugar un juego simple como Mario o Pokemon

Trabajé durante un año o dos en una IA que podía jugar los juegos originales de Pokemon de primera generación. El juego de Pokemon se ejecutaría en un emulador en una PC, y la IA escanearía la imagen desde la pantalla del emulador, tomaría decisiones basadas en ella y luego enviaría entradas de pulsación de teclas al emulador.

No fue un proyecto simple, y nunca lo terminé realmente.

La IA consistía en múltiples capas de comportamiento que se ejecutaban una encima de la otra. En la base había un código que tomaría una captura de pantalla del emulador, lo dividiría en mosaicos y compararía cada mosaico con una matriz para descubrir qué había en cada punto de la pantalla. Los juegos de Pokémon de primera generación utilizaron un modo de visualización en el que la pantalla se dividía en mosaicos repetidos para los mapas del mundo y la interfaz de usuario, con algunos sprites y otros efectos gráficos colocados en la parte superior. El nivel base del código generaría una matriz de qué número de mosaico había en cada punto de la pantalla, además de seleccionar la ubicación de los sprites móviles y algunos otros bits de datos.

Además de eso, tenía código para detectar la ubicación de ventanas flotantes, detectar mensajes y descifrar texto en esas ventanas. También había algo de lógica para determinar qué tipo de pantalla se mostraba, si estaba viendo una pantalla de combate, inventario, selección de pokemon, pantalla de mundo exterior, etc.

Luego vino el código de navegación GUI. Esto era capaz de decir qué ventanas se mostraban, dónde estaba el cursor y, cuando se le daba un objetivo, podía desplazarse por un menú y seleccionar una opción.

Tenía un trozo de código cuyo trabajo era hacer un seguimiento del estado del juego, recordando el inventario de artículos del usuario y qué pokemon había en la fiesta. Esto reunió información de la GUI y podría enviar comandos al controlador de la GUI para verificar el inventario y la pantalla de la parte para obtener esta información.

También había un controlador de combate bastante bueno, que podía detectar cuándo comenzó un combate, determinar contra qué Pokémon estábamos luchando y leer información de HP y estado de la pantalla. Ejecutaría un algoritmo predictivo complejo de las próximas rondas de combate y determinaría qué movimiento produciría la mejor oportunidad de ganar si se usa a continuación. Incluso fue lo suficientemente inteligente como para escapar, o usar una Pokebola si estaba en una batalla contra un Pokémon salvaje que aún no había atrapado. También había una función para usar objetos de curación, pero tuve problemas para hacer que funcionara bien: a menudo se encontraba con un ciclo de usar una Poción cada vez que se lastimaba, y luego el oponente simplemente lo lastimaba nuevamente, lo que resultaba en un bucle sin fin hasta que se agoten todas las pociones.

Nunca pude escribir el código de navegación global o la estrategia general del juego. Me gustaría, pero no he tenido tiempo de trabajar en este proyecto en los últimos años. Esta parte es realmente bastante complicada: no es solo una cuestión de búsqueda de caminos, la IA realmente necesitará comprender que hay muchas ubicaciones en el juego que están bloqueadas hasta que ciertos eventos hayan sucedido, o hasta que se obtengan ciertos poderes, recuerde qué ha sucedido y planifica un camino general a través del juego.