Combat AI

Avatar de Usuario
explorer
Mensajes: 524
Registrado: 10 Ene 2016 18:43
Ubicación: Valladolid, España
Agradecido : 19 veces
Agradecimiento recibido: 491 veces
Contactar:

Combat AI

Mensajepor explorer » 02 Ago 2022 18:35

El programador Nick Bild ha hecho algo sorprendente: modificar el código del juego COMBAT para la 2600 para agregarle un jugador dotado de inteligencia artificial.
https://www.youtube.com/watch?v=gU0H_XM2bXk

El proceso ha sido el siguiente: Partí del desensamblado del juego original que otros autores hicieron antes. Luego le añadí el algoritmo llamado «k vecinos más próximos» que usa ejemplos de un conjunto de datos de entrenamiento para hacer una predicción sobre cuál es la mejor acción que un tanque controlado por inteligencia artificial puede tomar.

Hay un número de problemas que solventar para meter un algoritmo de IA en una ROM de 2 KiB, en la 2600, un sistema de por sí con recursos muy escasos. Primero, un poco sobre la plataforma: la Atari 2600 tiene una CPU MOS 6507 de 8 bit corriendo a 1.19 MHz y unos miserables 128 bytes de RAM. La mayor parte de los ciclos de procesamiento se consumen en dibujar los gráficos en la pantalla. No existe búfer de vídeo; Las instrucciones de la CPU deben sincronizarse con la pantalla, y la información de los píxeles se especifica en el momento exacto en que se necesita por la televisión. Esto significa que casi toda la lógica del juego (gestión de la entrada de los joystick, detección de colisiones, disparar los misiles, sonido, etcétera) necesita encajarse en el periodo de blanqueo vertical (VBLANK) cuando no se dibuja nada en pantalla.

Desafortunadamente, no hay suficientes ciclos disponibles durante el ciclo VBLANK porque Combat los necesita para, bueno, mover Combat. Para que esto funcione, necesito más ciclos de los disponibles en un VBLANK entero, así que usar los ciclos restantes estaba fuera de cuestión. Mi solución fue secuestrar el VBLANK durante 3 cuadros por cada segundo, para ejecutar mi algoritmo de aprendizaje automático. Ya que la 2600 muestra 30 cuadros por segundo, se sigue permitiendo que la lógica normal del juego se ejecute 27 (de 30) veces por segundo. También reparto estas interrupciones de forma equilibrada (no en cuadros consecutivos), así que son complemente transparentes. No se pueden detectar diferencias en los tiempos de respuesta entre el Combat original y el Combat AI.

Eso me dio suficientes ciclos, pero todas las instrucciones y datos adicionales no entraban en la ROM de 2 KiB. Pero esto fue fácil de arreglar, ya que la 6507 puede direccionar ROM de 4 KiB, y muchos cartuchos de Atari eran de ese tamaño (o incluso de 8 KiB por medio del intercambio de bancos), así que podría simplemente modificar el código para extender el tamaño de la ROM a 4 KiB.

Para predecir la mejor acción que debe tomar el agente IA, necesito saber las coordenadas X e Y de ambos tanques. Las coordenadas Y ya estaban controladas así que aquí no había problemas, pero la Atari no controla las posiciones absolutas X de los sprites. En lugar de eso, los sprites se mueven de forma relativa a su posición actual (por ejemplo: mover 5 píxeles a la izquierda). Para solventar esto, necesito crear variables para controlar cada vez que se actualiza la posición X, y seguir manteniendo un total de todos los cambios. Para encajar esto en la lógica normal del juego necesito reclamar algunos ciclos, así que desactivé los sonidos de motor (que toma una sorprendente cantidad de instrucciones), y unas pocas cosas más que son específicas de los modos de juego diferentes al del tanque.

Finalmente, necesité insertar algún código para simular las entradas del joystick del segundo jugador basadas en las predicciones realizadas por el modelo de aprendizaje automático. Con el código que ya había eliminado, tenía los ciclos suficientes para hacer esa parte. El resultado es un Combat de 1 jugador, en que el tanque del jugador 2 te perseguirá agresivamente y disparará misiles hacia ti cuando estés dentro del radio de acción. Me he centrado completamente en el juego de tanques (variación 1), así que los aviones no están soportados en este momento.


Combat Gets A Computer Controlled Opponent Artículo en Hackaday.
Código y comentarios en Github

Avatar de Usuario
fcastellanos
Mensajes: 316
Registrado: 23 Feb 2021 14:10
Agradecido : 176 veces
Agradecimiento recibido: 65 veces

Re: Combat AI

Mensajepor fcastellanos » 02 Ago 2022 22:57

explorer escribió:El programador Nick Bild ha hecho algo sorprendente: modificar el código del juego COMBAT para la 2600 para agregarle un jugador dotado de inteligencia artificial.
https://www.youtube.com/watch?v=gU0H_XM2bXk

El proceso ha sido el siguiente: Partí del desensamblado del juego original que otros autores hicieron antes. Luego le añadí el algoritmo llamado «k vecinos más próximos» que usa ejemplos de un conjunto de datos de entrenamiento para hacer una predicción sobre cuál es la mejor acción que un tanque controlado por inteligencia artificial puede tomar.

Hay un número de problemas que solventar para meter un algoritmo de IA en una ROM de 2 KiB, en la 2600, un sistema de por sí con recursos muy escasos. Primero, un poco sobre la plataforma: la Atari 2600 tiene una CPU MOS 6507 de 8 bit corriendo a 1.19 MHz y unos miserables 128 bytes de RAM. La mayor parte de los ciclos de procesamiento se consumen en dibujar los gráficos en la pantalla. No existe búfer de vídeo; Las instrucciones de la CPU deben sincronizarse con la pantalla, y la información de los píxeles se especifica en el momento exacto en que se necesita por la televisión. Esto significa que casi toda la lógica del juego (gestión de la entrada de los joystick, detección de colisiones, disparar los misiles, sonido, etcétera) necesita encajarse en el periodo de blanqueo vertical (VBLANK) cuando no se dibuja nada en pantalla.

Desafortunadamente, no hay suficientes ciclos disponibles durante el ciclo VBLANK porque Combat los necesita para, bueno, mover Combat. Para que esto funcione, necesito más ciclos de los disponibles en un VBLANK entero, así que usar los ciclos restantes estaba fuera de cuestión. Mi solución fue secuestrar el VBLANK durante 3 cuadros por cada segundo, para ejecutar mi algoritmo de aprendizaje automático. Ya que la 2600 muestra 30 cuadros por segundo, se sigue permitiendo que la lógica normal del juego se ejecute 27 (de 30) veces por segundo. También reparto estas interrupciones de forma equilibrada (no en cuadros consecutivos), así que son complemente transparentes. No se pueden detectar diferencias en los tiempos de respuesta entre el Combat original y el Combat AI.

Eso me dio suficientes ciclos, pero todas las instrucciones y datos adicionales no entraban en la ROM de 2 KiB. Pero esto fue fácil de arreglar, ya que la 6507 puede direccionar ROM de 4 KiB, y muchos cartuchos de Atari eran de ese tamaño (o incluso de 8 KiB por medio del intercambio de bancos), así que podría simplemente modificar el código para extender el tamaño de la ROM a 4 KiB.

Para predecir la mejor acción que debe tomar el agente IA, necesito saber las coordenadas X e Y de ambos tanques. Las coordenadas Y ya estaban controladas así que aquí no había problemas, pero la Atari no controla las posiciones absolutas X de los sprites. En lugar de eso, los sprites se mueven de forma relativa a su posición actual (por ejemplo: mover 5 píxeles a la izquierda). Para solventar esto, necesito crear variables para controlar cada vez que se actualiza la posición X, y seguir manteniendo un total de todos los cambios. Para encajar esto en la lógica normal del juego necesito reclamar algunos ciclos, así que desactivé los sonidos de motor (que toma una sorprendente cantidad de instrucciones), y unas pocas cosas más que son específicas de los modos de juego diferentes al del tanque.

Finalmente, necesité insertar algún código para simular las entradas del joystick del segundo jugador basadas en las predicciones realizadas por el modelo de aprendizaje automático. Con el código que ya había eliminado, tenía los ciclos suficientes para hacer esa parte. El resultado es un Combat de 1 jugador, en que el tanque del jugador 2 te perseguirá agresivamente y disparará misiles hacia ti cuando estés dentro del radio de acción. Me he centrado completamente en el juego de tanques (variación 1), así que los aviones no están soportados en este momento.


Combat Gets A Computer Controlled Opponent Artículo en Hackaday.
Código y comentarios en Github


¿Pero las modificaciones las ha hecho respetando el tamaño original del cartucho?

Para que la modificación sea "auténtica" es necesario que respete los tamaños de los programas.

garillete
Mensajes: 1844
Registrado: 30 Oct 2010 20:58
Agradecido : 336 veces
Agradecimiento recibido: 717 veces

Re: Combat AI

Mensajepor garillete » 03 Ago 2022 07:21

Por lo que he visto ocupa mas pero ha eliminado alguna cosa como sonido y algunos modos pero bueno entra dentro de los estandares de la epoca... Hay que recordar que es de los primeros juegos y tenia poca ROM

Avatar de Usuario
explorer
Mensajes: 524
Registrado: 10 Ene 2016 18:43
Ubicación: Valladolid, España
Agradecido : 19 veces
Agradecimiento recibido: 491 veces
Contactar:

Re: Combat AI

Mensajepor explorer » 03 Ago 2022 14:15

Acabo de descubrir que no es la primera vez que alguien dota al juego con I.A.

En 2003, otro programador hizo una variación en la que el tanque enemigo tenía la habilidad de moverse por los laberintos (bueno, al menos lo intenta).

Se puede encontrar en Google buscando por Combat Tank AI Zach Matley.

http://www.oldgamesfinder.com/?q=TANK+AI&m=-8


Volver a “Atari 8 Bit”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado