Hablar sobre como programar una IA.

Started by Hokutoy, October 22, 2010, 03:46:32 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Hokutoy

Buenas!
Llevo bastante tiempo KO por varios temas  y alejado de alguno de mis projectos momentaneamente... pero eso es otra historia.
Ahora me apetece hacer un juego de cartas basado en TRIPLE TRIAD (el mini juego de cartas del Final Fantasy 7) y se me plantean varias dudas para cuando tenga que empezar a crear la IA del la "cpu".

Partiendo de la base de que NO soy programador con estudios alguien me puede explicar mas o menos como se tendría que hacer la IA? No hablo de picar nada de codigo... hablo de la metodología.

Depues de pensar bastante en como se tendría que hacer he llegado a un par de ideas/conclusiones... leerlas y opinar en que se puede mejorar.

Espero que halguien conozca el juego de cartas que comento... sino da igual hablo de cosas muy basicas.

IA:
Cuando le toca "tirar" a la maquina esta tiene siempre 5 cartas en la mano por lo que habrà que evaluar los resultados de jugar cada carta en cada posicion posible... calculando "que pasaría sí" en un simulacro de tirada, evaluando el resultado obtenido según unos criterios concretos (cartas conseguidas con la tirada, posiciones de defensa, proxima tirada) y asignando un coeficiente numerico (0-100) para calibrar lo buena que es cada tirada.
Para no hacer a la CPU demasiado invencible o perfecta se puede obligar a elegir (dependiendo del modo de dificultad) un rango concreto de coeficiente de tiradas (Easy: 0-50,  Normal: 25-75, Hard: 75-100).

Esto es mi teoría sobre como debería ser la IA... lo dificil es hacerlo jejeje.
Me he dejado alguna premisa o razonamiento recomendado? Como lo hace la IA de por ejemplo  un juego de ajedrez? Alguna sugerencia?

Asias!




DCelso

Esto es un tema muy complejo, las IAs.
A ver una buena IA es una IA formada híbridamente por muchas técnicas de resolución de problemas. Por ejemplo dos formas de resolver la ia del ajedrez podrían ser las siguiente:
1.- tener una base de datos con todas las partidas jugadas hasta el momento, comprobar la posicion de todas las fichas de la mesa y buscar en la base de datos la partida que más se asemeje a las fichas actuales de la mesa y que de como resultado que las fichas que lleva la máquina son las ganadoras, y entonces seguir ese movimiento. Al siguiente turno repites.
Esto no te asegura ganar porque depende de los datos de tu base de datos y de la proximidad al juego actual.
2.- técnica de la poda de árboles, si te das cuenta cada movimiento crea una decisión, por ejemplo si mueves un caballo puedes moverlo a 8 sitios distintos nada mas, pues esta técnia consiste en probar todas las convinaciones de movimientos de tus fichas y ver cual es el movimiento que mejor queda para atacar y que no te coman, claro esto si lo piensas en un solo turno no crea mucho arbol, pero si repites esto para cada movimiento en un siguiente turno pues creas ya muchas ramas para cada nodo, y si vuelves a repetir para un tercer turno se multiplica, entonces cada vez que entramos en profundidad se compleja más el arbol y le costará mas cpu al ordenador calcular un movimiento, al final empiezas a podar y quedarte con las opciones más probables que te ayuden a la victoria, entonces aquí ya entra un poco el riesgo porque tienes que crear una tabla de probabilidades que harán que el algoritmo decida una rama u otra, lo que hará más facil o más dificil de ganar al ordenador (esta técnica la usan casi todos los programas de ajedrez en la que hay poca cantidad de almacenamiento de información ya que no requiere base de datos)
Pues esta como pega tiene que a niveles de profundidad elevados es lentísima.

Hay muchas más técnicas para resolver el ajedrez, pero quedémonos con esas dos.

La solucion ideal es la mezcla de las dos, es decir, buscar la partida guardada que más se acerce al momento actual de la mesa y después si no hay ninguna igual y pillaste la que más se acercó pero sin ser igual del todo, aplicarle la poda de árbol.

Pues nada, con esto quiero decir que las IAs son complejísimas y que una buena opción es dificil de encontrar, tienes que ir haciendo unas fáciles e ir acomplejándolas a medida de que entiendas las fáciles.

La peor IA y más facil que puedes hacer es la técnica del azar :D, en la que ante una decisión de qué ficha mover usas el azar (rand) para moverte.
De todas formas lo que tu comentas no es todo parte de una IA, tu haz mezclado lo que son las reglas del juego, leyes y entorno de desarrollo del juego con la IA, la IA solo es el compendio de decisiones y movimientos que debe de tomar un jugador manejado por el ordenador para llevar a cabo la realización de un problema ateníendose a las normas, reglas, leyes y entorno en el que se desarrolla la partida.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Danielo515

Este es un tema que siempre me ha interesado mucho, y me fascina un montón.

Pero siempre que pregunto me dicen que estoy inlcuyendo las normas en la ia. ¿Como va si no una ia a jugar sin conocer las normas?
¿Como demonios haceis las ias tan, mmm, independientes?

A mi tu método de Ia me parece muy válido, y es el único que se me ocurre a mí para todos los juegos que he hecho, menos uno que tengo en desarrollo ;P

Windgate

Hay estándares de IA para programar prácticamente cualquier problema "sencillo". Cuando digo "sencillo" me refiero a casi cualquier juego con unas reglas bien definidas, especialmente los de tablero.

El caso del ajedrez puede considerarse complejo, pero básicamente hay una estructura de datos global con el tablero y las piezas de cada equipo, y para cada turno hay un cierto número de posibilidades.

Tradicionalmente la IA se basa en considerar todas las posibilidades de movimiento, y para cada una de ellas, determinar la que mejor se aproxima a la solución (En el caso del ajedrez es el jaque mate). Son algoritmos que pueden encontrarse fácilmente por ahí, uno de los mejores es el A*.

Hay otros casos más complejos como el tema de videojuegos shoot'em up. Ahí se utilizan otras tecnologías como las redes neuronales. Si hablas con Grisendo, él programó unas redes neuronales para el Worms de forma que las lombrices aprendían de su experiencia de juego, siendo capaces de ajustar mejor su potencia y ángulo de disparo en función de sus aciertos/fallos a la hora de disparar.

La IA es todo un mundo... Soy partidario de que a la hora de diseñar y programar un juego haya una o más personas en cuestión dedicadas a ese aspecto, mientras que otras tantas se dedican al resto de temas que no son pocos.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

Pensaba que el A* era sólo para búsqueda de caminos, pero nunca había pensado en él como una búsqueda del camino óptimo ante las ramificaciones de posibilidades en el ajedrez (debo de dejar de ber Numb3rs ^^U).

Pero estoy de acuerdo que es necesario tener algo de info sobre diseño de IA, porque es algo fundamental en los juegos (generalmente, es el principal motivo por el que descarto proyectos). No explicar sólo los métodos, sino por qué se debe usar uno y no otro, o cómo se debe aplicar a determinados tipos de juegos.

De hecho, hay bastante material sobre metodología para la programación de videojuegos del que no se habla en ningún libro, y para los DIV-like es que no hay: la programación orientada a procesos es algo tan "especial" que requiere de una metodología distinta a la normal y no hay nada, salvo el "manual de programación avanzada" de DIV (y los ejemplos de demás tutoriales y bennupack).
Tengo pendiente un manual al respecto, sencillo, con lo que aprendí en el último juego, aunque aun me tengo que documentar (y de momento, aun me duelen los dedos tras escribir en tiempo record mi último "libro" ;D).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)