¿Qué entendemos por inteligencia artificial?
Para este texto voy a centrarme en la IA que representa al
oponente. Quedan fuera de está delimitación todos aquellos sistemas que
simulan el “entorno”. Por ejemplo, si en un juego de estrategia tenemos
una simulación económica, eso lo consideramos como parte del “juego”
igual que los menús o los indicadores en pantalla. Vamos a referirnos
como “IA” al código que interactúa con el resto de sistemas del juego
como un jugador más. Haciendo un símil con un juego de tablero (que se
podría aplicar directamente a los juegos de estrategia), la IA es otro
jugador que mueve piezas del tablero.
¿Qué “piezas” mueve la IA? Pues cualquier personaje que no controle
el jugador. La mayoría de los personajes no jugadores tienen una IA por
simple que sea, aunque solo sea estar quieto en un punto y contestar al
jugador. Los juegos de estrategia son un caso interesante, porque
tenemos 2 tipos de IA: Una es nuestro oponente, que es una IA “jugador”
que se encarga de enfrentarse a nosotros, pero la otra es la IA de cada
una de las unidades, mucho más simple, porque no tienen que tomar
decisiones complejas ya que sigue las instrucciones del jugador o de la
IA “madre”.
Que la máquina juegue al juego
Una casa no se empieza por el tejado, y el código de la IA de un
juego es algo parecido. El primer paso con cualquier juego es hacer que
nuestro agente sea capaz de interaccionar con el juego. En el caso de un
juego 3D, antes de modelar el comportamiento que tendrá nuestro enemigo
tenemos que ser capaces de movernos a través del nivel y ejecutar las
acciones que sean necesarias: disparar, cubrirse, recoger armas, etc.
La búsqueda de caminos (o pathfinding) es un problema computacional
complejo pero, afortunadamente para los programadores, bastante
estudiado y hay un montón de artículos con algoritmos más o menos
eficientes según las condiciones. En muchos casos, el trabajo a hacer es
extraer la estructura del nivel y utilizar alguno de estos métodos para
encontrar el mejor camino del punto A al punto B. Esto es lo sencillo,
luego toca caminar. Para conseguir que se mueva nuestro agente, además
de ir actualizando su posición según se va moviendo, hay que ir
enlazando la animación de caminar (o correr), las de girar y, en algunos
casos, algunas más complejas como subir escaleras o abrir puertas.
A partir de aquí, el tipo de cosas que tenemos que programar
depende del juego que estemos desarrollando. Para empezar hay que
implementar algún sistema para que la IA sea capaz de “percibir” el
mundo del juego. De momento, solo tenemos un agente que está en un punto
y puede ir a otro punto del mapa. Podemos hacer un bot que pasee por el
nivel, quizás hasta podamos matarlo, pero él no hará nada. Necesitamos
ser capaces de saber, por ejemplo, que la IA ha detectado un enemigo,
que le están disparando desde atrás o que le quedan 100 puntos de vida.
Finalmente, hay que ser capaces de ejecutar otras acciones, la más
importante, atacar (o disparar). Normalmente, esto no suele representar
demasiado trabajo ya que ya se han implementado para el propio jugador.
Lo único que se suele necesitar tunear en esta parte es el “grado de
precisión” de la IA. A un nivel puramente técnico se puede refinar
muchísimo la IA para que no falle ningun tiro ya que conocemos (o
podemos utilizar) todas las variables necesarias para asegurarnos que la
bala impacte. Más adelante os hablo de esto.
Con todo este trabajo, hemos conseguido tener un embrión de IA en
nuestro juego. Un ser salvaje que vaga por el mapa, entiende su
alrededor y, quizás, dispara cuando ve a un enemigo. Pero nosotros
queremos algo un poco más interesante. Algo que no se lance hacia
nosotros como un loco.
Que la máquina compita en el juego
Me he adelantado un poco en mi anterior descripción: “la IA dispara cuando ve a un enemigo”. Este comportamiento ya tiene un grado de sofisticación. Hay varias formas de programar una inteligencia artificial. La forma “simple” sería con “maquinas de estado”. Nuestro agente tiene una serie de estados “buscar objetivo”, “disparar”, “perseguir”, etcétera, y una serie de condiciones para pasar de uno a otro. De esta forma, el comportamiento que hemos descrito antes consistirá en que, cuando vemos un enemigo mientras estamos “buscando objetivo” pasamos a “disparar”, cuando se aleja demasiado pasamos a “perseguir” y si se va de rango o muere, pasamos a “buscar objetivo”.Una forma más potente, y que nos sirve para IAs más complejas, es utilizar sistemas basados en reglas. Los programadores o los diseñadores escriben un montón de reglas y la IA evalúa cual es la regla que se parece más a su situación actual y la ejecuta. El trabajo consiste en, una vez tenemos este sistema funcionado, añadir muchísimas reglas para conseguir una IA competitiva.
Para esto necesitamos ser capaces de percibir la máxima información posible, para poder escribir reglas de forma más precisas. Por ejemplo, ¿cuanta vida le queda al enemigo? ¿con que arma va equipado? ¿es más poderoso el rifle o la escopeta? ¿hay una cobertura libre cerca? Conforme se va refinando la IA empiezan a aparecer eventos que queremos tratar o información que necesitamos. Cuanto más trabajo se puede invertir en desarrollar la IA más reto puede plantearle al jugador.
Un refinamiento extra y que, según el juego es bastante importante, es la colaboración entre IA. No sólo para presentar el mayor reto posible, sino porque (según el juego) podrían estorbarse entre ellos. Si una IA esta buscando un botiquín de vida y otra esta cerca, puede decidir no cogerlo para que lo use la otra. O, aun mejor, protegerlo y, si se acerca el jugador, robarselo.
La maquina hace trampas
¿Cuántas veces habran pensado que la máquina os hacía trampas? Pues
a veces sería verdad, pero el proceso de desarrollo ideal intenta
evitar hacer trampas. Este consiste en desarrollar la IA “perfecta” y
luego ajustar la dificultad hacia abajo. Cualquier otro sistema suele
percibirse como injusto (porque lo es).
¿Cómo se ajusta hacia abajo? Básicamente se suelen poner
modificadores de forma que la IA no acierte el 100% de veces sino que,
por ejemplo, pueda fallar el disparo. Muchas veces, estos modificadores
son necesarios, paradójicamente, para aumentar la dificultad. Sin estos
porcentajes la IA será “perfecta” pero también completamente
determinista. Hacer que, por ejemplo, en una misma situación tenga
varias acciones posibles hace que sea más difícil predecir la IA a la
vez que le puedes dar “personalidad” a los bots. Por ejemplo, en la
misma situación un soldado con rifle de asalto puede dar más prioridad a
buscar cobertura y un soldado con escopeta (o con armas cuerpo a
cuerpo) puede priorizar acercarse al jugador.
Pero, claro, esto es lo ideal. A la hora de programar, los
desarrolladores simplemente se limitan a las cosas que se quieren que la
IA use. Pero si tenemos poco tiempo, a veces no tenemos tiempo de hacer
un sistema para predecir la estrategia del jugador y le damos a la IA
su posición o las unidades que está construyendo, de forma que le
podamos presentar batalla.
Y, a veces, ni así tenemos una IA suficientemente buena. En esos
casos, los diseñadores ya se preocuparán de darles una ventaja extra;
por ejemplo, aumentando el daño que hacen los enemigos, su vida, u
otorgándoles recursos adicionales en juegos de estrategia.
Para terminar, me gustaría recordaros que la mejor IA es la que
parece inteligente, no la que lo es realmente. Todos nos maravillamos en
1998 cuando los enemigos de Half-Life nos flanqueaban y tiraban una
granada. Pero eso solo era humo y espejos. Con el uso inteligente de
scripts puedes “engañar” al jugador, organizando los encuentros de
forma que una IA no necesite improvisar demasiado.
Fuente: http://www.eurogamer.es/