Desarrollo de una IA para un juego

Iniciado por AndroidPlayer, Junio 20, 2011, 09:13:22 PM

Tema anterior - Siguiente tema

AndroidPlayer

Buenas.

Estoy programando en FreeBasic un juego en el que se enfrentarán entre dos y seis magos, uno de ellos el jugador humano, y los otros controlados por el ordenador.
La finalidad es destruír a todos los demás magos mediante hechizos e invocaciones (no es necesario destruír todas las invocaciones de un mago. Con matar el mago es suficiente).
Mezcla elementos de diferentes tipos de juegos: estrategia como un RTS, elementos de juegos RPG, y elementos de juegos tipo Roguelike (partes del juego serán al azar). El juego será por turnos, y en cada turno, el jugador primero podrá realizar un hechizo, y luego mover su mago y/o criaturas invocadas.
No existen puntos de vida, si no probabilidades de matar y de defender, con tiradas de dados. Así por ejemplo, un dragón hará 10 tiradas de dados para defender, mientras que un ratón hará una tirada de dados de ataque. Si el defensor obtiene más puntos en la defensa que el atacante, entonces es que no le sucederá nada.
Lo mismo para los hechizos de daño: tienen una serie de tiradas de dados, por ejemplo, bola de fuego podrían ser 5 dados.


Ya está gran parte terminado, pero ando atascado en lo que es la creación de una IA que sea buena, o al menos que sea algo "espabilada".


Lo que necesito es la opinión del público acerca de la IA que he diseñado, o incluso propuestas diferentes también me podrían ser de gran ayuda.


Los enemigos podrán tener cuatro tipos de comportamiento: muy defensivo, defensivo, agresivo o muy agresivo.


Tal y como he diseñado la IA, de momento es lo siguiente:

Al realizar un hechizo, si la IA es "muy defensiva", realizará el hechizo que le ofrezca mayor protección posible SÓLO SI alguno de los enemigos tiene más poder defensivo que ella.
Lo mismo para la que es "defensiva", pero realizará el hechizo menos defensivo que tenga.
Las IAs ofensivas serán lo mismo, pero a la inversa.
En caso de que la IA sea la que tiene más poder defensivo (en caso de ser una IA defensiva), pues realizará un hechizo que aumente su poder de ataque.
Lo mismo para las IAs ofensivas, pero al revés.

Y ahora viene la parte del movimiento:
las IAs siempre intentarán acercar su mago y las criaturas invocadas a un enemigo que se ha seleccionado previamente (es decir, no cambiar de enemigo cada turno).
Antes de moverse, se comprueba que la casilla a la que se va a mover no puede ser atacada por un monstruo o por un hechizo enemigo. Si no se puede mover a esa casilla, se busca otra, hasta encontrar una que esté más cerca del mago enemigo. Si no hay ninguna que no esté amenazada, entonces se mueven las criaturas cerca del mago enemigo en las casillas que existan enemigos menos poderosos posible.

Si la IA es defensiva, pues sus criaturas atacan los monstruos enemigos con más fuerza de ataque (para reducir el ataque total del mago enemigo y así poder defenderse mejor)
Si la IA es agresiva, se mueven las criaturas hacia los enemigos con más fuerza de defensa para destruírlos (y así para evitar que se pueda defender).

Si por el camino hacia el objetivo hay criaturas de otros magos diferentes (o incluso otro mago que no es el objetivo), se destruyen si se puede, siguiendo las reglas de antes.




Eso es básicamente lo que tengo diseñado. Sé que no es gran cosa y que tiene algunos fallos, pero de momento está en fase experimental que aún tendría que ser mejorada.


También he pensado en usar algún tipo de IA de ajedrez con las necesarias adaptaciones, pero de las que he visto son demasiado complejas y largas como para incluírlas en el juego.

¿Algun consejo, sugerencia u opinión?

Sami

Una pregunta AndroidPlayer, ¿las IAs cómo se programan? Quiero decir, ¿cómo es una implementación básica o su especificación básica? Todavía no he estudiado nada de eso pero me pica mucho la curiosidad. ¿Va con heurísticas? ¿Análisis por casos?
Soy el mayor de los frikis!

Eye del Cul

Cuando era crío intenté programar en BASIC un comecocos para mi Amstrad CPC. Y precisamente la parte que se me atragantó fue hacer que los fantasmas persiguieran eficazmente al jugador. IAs como la de Civilization o Master of Magic ni siquiera llego a imaginar cómo funcionan.
«Porque buscar a alguien patético en Internet es como buscar caballos en un establo: encontrarás alguno, seguramente» -- Phobos Anomaly

Valor Rojo

Este parece ser un caso para mi escaso conocimiento de estudiante de sistemas informáticos de primer año.

Vale, primero lo primero: ya está el código terminado? es funcional? Porque si es así, deberías enviarnos la beta con tu juego, para ir probando la IA, y decirte si hay o no hay problemas con respecto a eso, toma en cuenta que si quieres multijugador la IA debe saber que un jugador humano puede reaccionar diferente a una IA

EL DUUUM ES LA RESPUESTA A TODO SHIAAAY TAY ZARPAOOOO

Sami

#4
Cita de: Eye del Cul en Junio 20, 2011, 10:46:20 PM
Cuando era crío intenté programar en BASIC un comecocos para mi Amstrad CPC. Y precisamente la parte que se me atragantó fue hacer que los fantasmas persiguieran eficazmente al jugador. IAs como la de Civilization o Master of Magic ni siquiera llego a imaginar cómo funcionan.

Es que siendo amateur (si es que no habías estudiado nada) cuesta el doble... y a mí se me ocurre cómo podría ir pero porque el caso del comecocos es super fácil y porque he estudiado casos parecidos... todo lo que sea programar sobre una matriz casi que se simplifica mucho xDDDD

EDIT: Sobre mi pregunta de antes me refería con una IA medio compleja como la que intenta implementar AndroidPlayer

Por cierto, para que os lancéis a programar juegos en Basic... ¿tiene alguna facilidad especial? ¿Es un lenguaje orientado a objetos y lo programáis así? Es que hay también otros lenguajes, por ejemplo Java, que son bastante fáciles y orientados a objetos, que suelen ser ideales para programar videojuegos
Soy el mayor de los frikis!

AndroidPlayer

Cita de: Sami en Junio 20, 2011, 10:22:15 PM
Una pregunta AndroidPlayer, ¿las IAs cómo se programan? Quiero decir, ¿cómo es una implementación básica o su especificación básica? Todavía no he estudiado nada de eso pero me pica mucho la curiosidad. ¿Va con heurísticas? ¿Análisis por casos?

No creas que soy experto en el tema. De hecho ni soy programador ni informático, aunque en mis años en la universidad he tenido que aprender cosas como programación. Me he leído algunos libros y documentos por mi cuenta, pero no te creas que sé como un informático.

Ya respondiendo a tu pregunta: pues realmente depende de lo que quieras hacer, la IA será de una manera u otra. Si por ejemplo quieres hacer un pac-man, la IA realmente es muy básica: pathfinding (búsqueda de rutas), escapar cuando los fantasmas son vulnerables y "atacar" si no lo son.
Lo de análisis por casos, según tengo entendido, es la manera más básica de crear una IA, pero la que menos "inteligencia" ofrece, ya que con ella la IA toma decisiones basada en casos predefinidos, por ejemplo: el jugador tiene 10 tanques, entonces yo, la IA, construyo uno más para ser más fuerte. Algo así sería. Si te das cuenta, en este caso la IA siempre irá por detrás de lo que hace el jugador. No puede "aprender" de sus errores ni de los del jugador.

Hay otro tipo, que ahora no me acuerdo cómo se llama, que es algo parecido a los casos, pero la lista de casos la construye y modifica la propia IA. Ejemplo: el jugador tiene 10 tanques. Yo, la IA, voy a empezar a construír 11, para ser más fuerte. Nos enfrentamos en la batalla, y pierdo. ¿Qué ha ido mal? El jugador tenía sus tanques mejorados con más alcance. Entonces, yo, la IA, la próxima vez mejoraré los tanques también.
Lo mismo sucedería para los éxitos de la IA: si algo va bién, pues se le asigna un valor de "éxito", y cada vez que ocurra esa misma situación, se aplicará la misma solución. Así todo el tiempo hasta que el valor de éxito de dicha solución se tan o más bajo que otras soluciones para el mismo problema.

Como ves este otro tipo de IAs pueden aprender mediante la experiencia, aunque siempre estarán también por detrás del jugador. Si éste cambia de estrategia, pues la IA estaría de nuevo como al principio.


Y un tercer modelo sería algo así como la heurística con casos o como un análisis de objetivos de forma recursiva: se establece un objetivo final, el cual se subdivide en pequeños sub-objetivos jerarquizados, pero a la inversa. Por ejemplo: destruír la civilización enemiga. Para ello necesitamos: destruír todos sus edificios. Para esto, tenemos que destruír todas sus tropas. Para eso tenemos que construír X número de tropas. Para esto tenemos que construír un cuartel. Para esto tenemos que conseguir X recursos lo más rápido posible. Para ésto necesitamos X recolectores. Para esto necesitamos X recursos iniciales.

En este caso, también se ofrece a la AI una base de datos con casos, por ejemplo, si el enemigo tiene más tropas que la IA, entonces ésta no va a poder alcanzar el objetivo final. Por lo tanto, necesitará construír tropas hasta que sea más fuerte que el enemigo.



Cita de: Eye del Cul en Junio 20, 2011, 10:46:20 PM
Cuando era crío intenté programar en BASIC un comecocos para mi Amstrad CPC. Y precisamente la parte que se me atragantó fue hacer que los fantasmas persiguieran eficazmente al jugador. IAs como la de Civilization o Master of Magic ni siquiera llego a imaginar cómo funcionan.

Te animo a que lo intentes de nuevo.
Un comecocos es bastante fácil. Para lo que es la IA, necesitarás crear un sistema de búsqueda de ruta (en inglés "pathfinding"). Tendrás que buscar la ruta desde cada uno de los fantasmas hasta el jugador, por la ruta más corta. Hay varias maneras de hacerlo, pero la más sencilla es usando una matriz de distancias: es una matriz, en tu caso de 2 dimensiones, que contiene la distancia en cuadrados/celdas que hay desde el fantasma que se va a mover, hasta todas y cada una de las celdas que hay en la matriz (que representa el tablero de juego), PERO teniendo en cuenta los elementos que bloquean, por ejemplo, paredes. Quizás este documento te ayude: https://svn.sable.mcgill.ca/sable/courses/COMP763/oldpapers/yap-02-grid-based.pdf


Cita de: Sami
EDIT: Sobre mi pregunta de antes me refería con una IA medio compleja como la que intenta implementar AndroidPlayer

No, la IA que intento crear es muy sencilla. Sólo se contempla cúando hacer hechizos ofensivos, cuándo defensivo, y cuándo y hasta dónde mover.
IAs complejas, por ejemplo, las tienes en el juego FEAR, en el que los enemigos buscan sitios donde esconderse, deciden qué ruta es la mejor para atacar al jugador, etc...


Cita de: Valor Rojo en Junio 20, 2011, 11:29:09 PM
Este parece ser un caso para mi escaso conocimiento de estudiante de sistemas informáticos de primer año.

Vale, primero lo primero: ya está el código terminado? es funcional? Porque si es así, deberías enviarnos la beta con tu juego, para ir probando la IA, y decirte si hay o no hay problemas con respecto a eso, toma en cuenta que si quieres multijugador la IA debe saber que un jugador humano puede reaccionar diferente a una IA

Falta la IA por implementar, ya que de momento sólo la estoy probando en un programa aparte para ver cómo funciona.
Ya le he hecho unos retoques.


Cita de: Sami
Por cierto, para que os lancéis a programar juegos en Basic... ¿tiene alguna facilidad especial? ¿Es un lenguaje orientado a objetos y lo programáis así? Es que hay también otros lenguajes, por ejemplo Java, que son bastante fáciles y orientados a objetos, que suelen ser ideales para programar videojuegos

A mi me enseñaron en la universidad la sintaxis de Basic con TurboBasic, y como me pareción fácil y bastante potente pues no me he molestado en aprender otras cosas, aunque ahora estaba pensando en leer alguna cosilla de LUA.

No sé si todos los Basic lo ofrecen, pero FreeBasic, aunque no es orientado a objetos, sí permite el uso de características de lenguajes orientados a objetos. Por ejemplo, dentro de un UDT puedes definir constructores, destructores, sus propias funciones, definir operadores, herencia...
Lo único que falta es el polimorfismo, pero que alguien en el foro de FreeBasic ha conseguido simular.