Skip to main content

Destripando la Inteligencia Artificial

Yo, el bot.

Este mes vuelvo a la parte técnica. Aprovechando que en la sección anterior hablé de cómo se modelan y animan los personajes, he pensado que una buena forma de continuar es explicar como se les da vida.

Esta sección la dedicaremos a la Inteligencia Artificial (en adelante IA), una de las partes más conocidas (o que os sonarán más) de la programación de un juego, pero de la que quizás no se oye tanto porque no se ve en las fotos y videos (que yo recuerde solo FEAR la llegó a publicitar en su marketing).

¿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 habéis 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.

También te puede interesar