Bienvenido a Nuestra Plataforma de Aprendizaje On-Line

Con mas de una decada de experiencia en Capacitacion Laboral, nuestra plataforma le da la bienvenida a nuestro sistema de capacitacion laboral bajo la forma de cursos autoasistidos de formacion profesional.
  • Libro-Cursos en PDF

    • Al comprar nuestros cursos en ebooks a traves de nuestra tienda on-line adquiere un curso practico autoasistido para completar su formacion profesional.Ebooks en PDF
  • Cursos ON-LINE

    • Capacitese en nuestro sistema de aulas virtuales con asistencia personalizada y tutores profesionales para potenciar sus conocimientos teoricos con practicas.Cursos Tecnicos
  • Recursos GRATIS

    • En esta web podra conseguir informacion, libros en PDF, articulos y videos gratuitos asi como cursos autogestionados para actualizar sus conocimientos tecnicos gratis.Recursos Gratuitos

Curso de juegos (9)


Curso “Programación de Juegos”

Curso Gratuito
Entrega 9. La generación de bots enemigos en el juego


Como mencioné en la nota de Inteligencia Artificial (Nota 9), hoy vamos a ver cómo programar enemigos que se muevan de manera independiente al jugador.

La idea era programar 3 tipos de enemigos:

1.    Enemigos sin IA (los que abordamos en esta nota)
2.    Enemigos con un nivel de IA que permita seguimiento del jugador
3.    Enemigos con un nivel de IA que predice los movimientos del jugador

Sin duda el tercer ejemplo es el más interesante, pero como esto es un curso… primero es conveniente conocer en profundidad las interfaces que debemos programar para incluir jugadores tipo bots que tengan voluntad propia.

Ese será el foco de esta nota.

Es de suponer que a esta altura del curso, ya conoce la dinámica: si bien estudiamos TODO el código de los fuentes que vamos creando en el curso, en las notas me concentro principalmente en los fragmentos que son el núcleo de la nota en sí misma.

El programa base que usaremos para estudiar la implementación de enemigos es el programa 01.BAS ( puede descargarlo aqui )

Para concentrarnos sólo en los queremos explicar, recuerde repasar las notas anteriores para entender el funcionamiento general del programa, que sigue teniendo la estructura clásica de este curso de juegos:

1) Inicialización de variables, declaraciones de subrutinas y funciones
2) Dibujo de pantalla
3) Bucle de ejecución con llamadas para capturar los eventos del programa

Por supuesto, las explicaciones más profundas se concentrarán en los fragmentos de código fuente específicos.

Vamos a la idea: ¿Cómo se implementa un bot independiente del jugador?

Básicamente debemos definir algunos marcos de software específico:

a) Un mini sub-sistema que permita hacer que el bot enemigo genere un movimiento. En esta nota, el movimiento será puramente al azar, en otras notas ese movimiento al azar será influenciado por la inteligencia artificial en diferentes grados. A este subsistema le llamaré SUBSISTEMA MOVIMIENTO BOT (SSMB abreviado) para referirme a él en la nota y que usted no se “pierda” en la jerga.

b)  Un mini-subsistema de control de movimiento del enemigo, que debe seguir las mismas premisas (o muy parecidas) que la reglas seguidas por el jugador: debe moverse dentro de los limites del escenario. A este sub-sistema le llamaré SUBSISTEMA CONTROL ESCENARIO BOT (SSCEB abreviado).

c)  Un sistema de control de colisiones para el bot, porque como el jugador humano, no debe atravesar elementos sólidos de la escena. Este código también deberá decidir que hacer teniendo en cuenta los diferentes tipos de colisiones que se generen. A este código le llamaré SUBSISTEMA COLISIONES BOT (SSCB).  En estos programas de ejemplo, para no “ensuciar” la didáctica, dejaremos de lado este subsistema porque dentro de este código hay algunas cosas para aprender que me gustaría tratar casi exclusivamente: Para optimizar nuestro código, deberíamos crear un susbsistema unificado para el control de colisiones (tanto de usuario y para los bots implementados). No tiene sentido crear dos susbistemas de colisiones separado para cada jugador (a no ser que así lo amerite la naturaleza propia del juego). Hacer un sistema de colisión separado para cada jugador (bot o humano) haría perder eficiencia a nuestros programas. Es mejor unificar rutinas.

En algún punto del curso me dedicaré a explicar cómo se optimizan los códigos. Usualmente los programadores intentamos crear un prototipo operativo que funcione bien. A partir de allí intentamos optimizar las rutinas linea por linea y unificarlas en todo lo que sea posible. Pero eso es un tema que hoy no nos preocupa tratar.

SUBSISTEMA MOVIMIENTO BOT (SSMB abreviado)

Obviamente el sistema de hard no “entiende” las premisas de mover un objeto, por lo que debemos pensar y diseñar como hacer que el ordenador o computadora genere un movimiento dentro de nuestro escenario. Todo esto dentro del marco matemático requerido por el sistema (que sólo comprende números).

En nuestro caso, pensemos….. el movimiento se hace en 2D, vale decir adelante, atrás, derecha, izquierda: ¿Cómo hacer que la computadora mueva al bot en un espacio bidimensional?

La idea es sencilla. Mire esta grafica:

El enemigo (en un escenario 2D) debería moverse en 8 direcciones posibles a partir de cualquier punto del tablero.

Lo único que debemos hacer es identificar cada dirección de manera inequívoca para indicarle al sistema hacia donde mover el sprite-bot de nuestro ocasional oponente. Podríamos hacerlo de este modo:

De este modo asignamos un número a cada dirección posible. Como los lenguajes de programación incorporan funciones para generar numeros al azar, simplemente debemos programar el generador de numeros al azar del lenguaje para que genere un número comprendido entre las posibilidades que nosotros mismos determinemos.

En este caso en particular, para nuestro juego debemos indicarle al sistema que genere un número entre 1 y 8 para determinar en qué dirección se moverá nuestro bot. Sencillo ¿no le parece?

Esta es la técnica más popular y rápida para permitir al sistema comprender los movimientos de jugadores humano o bots dentro de los juegos. Existen otras, por supuesto, pero básicamente creo que es la más eficiente y rápida de implementar.

Esta misma técnica se puede emplear para movimientos en 3D. Se van asignando números a todos los puntos del espacio en los que se pueda mover un jugador.

Vea la próxima imagen. Ahí vemos un ejemplo de un jugador que se mueve sobre un piso, en el cual tiene libertad de movimientos en 2D pero también puede moverse espacialmente hacia arriba (saltando, por ejemplo como un MarioBros 3D ). En este caso el programador no incluye movimientos hacia abajo porque el sprite no puede atravesar el piso.

En la proxima figura, se aprecia un escenario que brinda movimientos totales en 3D (todas las direcciones posibles) al jugador o bot. El “enrejado” numerico de las direcciones y movimientos rodea al jugador como si fuera un cubo de rubik, llenando así todas las posibilidades.

Como puede ver, la técnica no es difícil. Vamos a estudiar ahora el código del programa 04a.bas:

Dentro del bloque DO-LOOP que controla la recursividad de nuestro programa tenemos el bloque de instrucciones que detecta la tecla presionada por el jugador humano. (NOTA: si no conoce el término recursividad… ya lo sabe: ¡a los libros! Jeje).

Como el movimiento del bot es independiente del humano, trabajamos la detección de teclas KeyPress = UCASE$(INKEY$) del modo habitual al que venimos trabajando desde el programa 01.bas en adelante, es decir: con un bloque de instrucciones IF-THEN-ELSEIF-ELSE. Si no lo recuerda en detalle, vea las notas anteriores.

Después del control de teclas, se actualiza la pantalla (los datos y también el sprite del jugador humano). Y a partir de allí, la parte del código que nos interesa:

El SSMB (SubSistema de Movimiento del Bot) está formado sólo pur un par de líneas:

      RANDOMIZE TIMER
      Azar = INT(RND(1) * 8) + 1'genera numero entre 1 y 8

La linea que dice RANDOMIZE TIMER inicializa el sistema de generación de números al azar que trae incorprado su lenguaje de programación para que genere una semilla numérica que no se repita ciclo a ciclo. Recuerde que el bucle recursivo DO-LOOP se repite indefinidamente y en cada repetición, el sistema generará un número. Si no lo inicializáramos “refrescándolo” con una semilla variable, el sistema tendería a generar siempre (o varias veces el mismo número).

¿No lo entendió? No importa: se lo explico en terminos humanos: RANDOMIZE le indica al sistema que genere un número al azar. El problema de los cerebros de silicio es que son tontos elevados a la décima potencia. Y no tienen la imaginación suficiente para generar números al azar. Es decir… tienden a “pensar” los mismos números una y otra vez. Por eso su lenguaje de programación lo “instruye” diciéndole: debes generar un número pero que esté basado en una semilla.  Algo así como decirle a usted “piense un número entre 1 y 100”. En el caso de esta línea de código, el número se basa (la “semilla”) en el reloj de tiempo real del sistema (TIMER).

Como el TIMER varia permanentemente (el tiempo no se detiene… desafortunadamente para los viejos como yo…), el sistema genera un número basado en una semilla variable, lo que hace que se parezca más al azar porque siempre tiende a variar. No es azar al 100% pero es suficiente para lo que necesitamos.

La segunda línea tiene el objeto de ordenarle al sistema que (dentro de ciertos parámetros) el número generado esté dentro del rango de movimientos que hemos planificado (en nuestro caso entre 1 y 8).

El número generado entre 1 y 8 se almacena en la variable AZAR. Para ser utilizada posteriormente.

No era tan complicado ¿verdad?

Este trabajo se hace ciclo a ciclo del DO-LOOP por lo que tenemos un movimiento por ciclo.

Cuando ejecute el programa 04a.bas verá que el movimiento es MUY RAPIDO y el bot revolotea como mosquito, a una velocidad ultra rápida. Eso lo controlaremos con una solución implementada en el programa 04b.bas pero no lo veremos ahora. Quiero que se concentre en este par de temas por son cruciales en el programa. Veremos como controlar el “revoloteo” del bot más abajo.

SUBSISTEMA CONTROL ESCENARIO BOT (SSCEB)

El proximo bloque de instrucciones, contenidas en la estructura SELECT-CASE es el SSCEB.

El razonamiento es simple: el bot se mueve, pero debemos controlar que no salga de los límites del escenario.

Estos límites están controlados por variables que no varían (CONSTANTES):

   CONST MnFila = 3                        'minima fila
   CONST MxFila = 20                      ‘maxima fila
   CONST MnCol = 1                        ‘minima columna
   CONST MxCol = 80                      ‘maxima columna

Recordemos como trabajan estas variables: controlan que los movimientos (de todos los elementos móviles del juego – humanos y bots-) se mantengan dentro de los límites del escenario. Vel el grafico que aclara este concepto:


El bloque SELECT-CASE funciona de modo simple:

El bloque debe trabajar con las variables Ef y Ec porque estas variables contienen la posición actual del enemigo:

   Ec = xx                      'contiene la columna en la que esta posicionado el bot
   Ef = xx                      'contiene la fila en la que está posicionado el bot

Dependiendo del movimiento generado por el SSMB, se analizará puntualmente cada movimiento.

La sentencia “CASE x” analiza el movimiento generado que está contenido en la variable AZAR para controlar que no sea un movimiento que saque de los limites del tablero al bot en cuestión. Veamos una de las instrucciones y usted analizará después las otras:

CASE 1: en el caso que se haya generado un movimiento al cuadrante [1] o si lo prefiere “arriba a la izquierda”, el sistema analiza estas condiciones: 

            IF (Ef - 1) >= MnFila THEN Ef = Ef - 1:  ELSE Ef = MnFila                   ‘primer analisis
            IF (Ec - 1) >= MnCol THEN Ec = Ec - 1:  ELSE Ec = MnCol                  ‘segundo analisis

Para moverse al cuadrante superior izquierdo, el sistema debe hacer lo siguiente:

1. Tomar la posición actual de fila del bot y restarle una unidad (Ef-1)
2. Tomar la posición actual de columna del bot y restarle una unidad (Ec-1)

Esas son las dos condiciones que evalua la opción CASE 1 de la estructura SELECT-CASE.

Como a un programador novato puede resultarle algo difícil de leer, vamos a “desplegarlas” un poco para entender la lógica del análisis. Se las escribo de un modo menos críptico (pero recuerde que trabajan igual escritas en un modo u otro):

‘primer analisis: ¿que pasa si a la posición actual de la fila del bot
‘se le resta una unidad?
IF (Ef - 1) >= MnFila THEN
                ‘si al restarle una unidad, el número de fila no es más chico
                ‘que el valor minimo de la fila, la operación es viable
                ‘porque la nueva posición está dentro de la pantalla habilitada
                Ef = Ef – 1
ELSE
                ‘en caso contrario significa que el valor sacaría de la pantalla
                ‘al bot, por lo tanto se le asigna el valor mínimo impidiendo que
                ‘salga de pantalla
                Ef = MnFila
 END IF

‘segundo analisis: ¿que pasa si a la posición actual de la columna del bot
‘se le resta una unidad?
 IF (Ec - 1) >= MnCol THEN
                ‘si al restarle una unidad, el número de columna no es más chico
                ‘que el valor minimo de columna, la operación es viable
                ‘porque la nueva posición está dentro de la pantalla habilitada
                Ec = Ec – 1
ELSE
                ‘en caso contrario significa que el valor sacaría de la pantalla
                ‘al bot, por lo tanto se le asigna el valor mínimo impidiendo que
                ‘salga de pantalla
                Ec = MnCol
END IF

La estructura SELECT-CASE analiza una a una las ocho posiciones posibles que puede generar el subsistema de movimiento SSMB. Esto se hace en cada opción CASE 1, CASE 2, CASE 3, etc.
Toda esta estructura analiza el cambio de valor de la variable AZAR y define finalmente los valores corregidos de la posición actual del bot (almacenados en Ef y Ec).

La validación tiene por fin hacer el cálculo y en caso de que el bot quiera “salirse” de la pantalla, evitarlo porque el sistema lo que hace es asignarle la operación o simplemente le asigna el valor máximo o mínimo permitido, con lo que se evita que el bot salga de los límites definidos de la pantalla.

Le dejo a usted el análisis de las otras opciones CASE X, pero básicamente el razonamiento es el mismo.

Toda la estructura SELECT-CASE puede ser sometida a un análisis de optimización de código, pero es una tarea que también le dejo pendiente. Preferí escribirla de ese modo por la didáctica de la lección.

Con esto, quedan explicadas las interfaces y componentes de software que necesitamos para crear (al menos) un bot que acompañe al jugador humano.

Por supuesto que estas técnicas sirven para crear tantos bots como sean necesarios en el juego. Quizá lo plantearemos en otras notas.



Regulando la velocidad del bot en el programa 04b.bas

Ahora le planteo jugar libremente con el juego del programa 04a.bas y lo primero que notará es la velocidad extremadamente alta con la que se mueve nuestro bot.

En el programa 04b.bas la idea es generar un mini-sistema de control de velocidad del contrincante que permita ajustar la velocidad del bot y llevarlo a diferentes niveles de velocidad que permitan ajustar la misma a la velocidad del equipo que ejecuta al programa.

Si analiza el bucle DO-LOOP, verá que la posición del bot es ajustada en cada ciclo de ejecución del buble (de ahí que se mueva como un mosquito furioso). La idea del control de velocidad, entonces, pasa por hacer que el sistema mueva al bot no en todos los ciclos de ejecución del bucle DO-LOOP, sino sólo en algunos ciclos.

Para eso, vamos a necesitar primero un par de variables de ajuste:

                CicloMx = 50                 'se ajusta para modificar posición cada 50 ciclos DO-LOOP
                CicloAc = 1                    'inicializacion del contador de ciclos

Para lograr el efecto deseado vamos a hacer lo siguiente: la variable CicloAc es un contador incremental (incrementa en uno su valor en cada ciclo DO-LOOP). Cuando lleva al mimso valor de la variable CicloMx, ajusta la posición del bot (es decir lo mueve). Al terminar de moverlo, se setea nuevamente a uno y vuelve a incrementarse con cada ciclo de ejecución.

Con los valores iniciales, el sistema ajusta (o mueve) la posición del bot una vez cada 50 ciclos. Esta velocidad es regulable (el usuario cuenta con las teclas [+] para aumentar la velocidad y [-] para disminuir la velocidad de movimiento del bot.

Dentro del bucle DO-LOOP ahora usted encontrará la estructura

IF CicloAc >= CicloMx THEN / END IF

Que justamente evalúa el ciclo actual y sólo ejecuta los bloque de instrucciones que forman parte del SSCEB  y del SSMB, determinando ahora que se ejecuten sólo cuando la condición se cumple.

En todo momento el usuario puede ajustar la velocidad del movimiento porque el programa detecta la presión de teclas con

KeyPress = UCASE$(INKEY$)

y evalúa con estas nuevas opciones ELSEIF la presión de las teclas de control de velocidad, que son las teclas + (para incrementar) y – para decrementar la velcidad:

      'mas lento
      ELSEIF KeyPress = "-" THEN
                 CicloMx = CicloMx + 1
                 IF CicloMx > 300 THEN CicloMx = 300
               
      'mas rapido
      ELSEIF KeyPress = "+" THEN
                 CicloMx = CicloMx - 1
                 IF CicloMx <= 1 THEN CicloMx = 1

Parece paradójico que para aumentar la velocidad tenga que decrementar la variable CicloMx, pero tenga en cuenta que es un control inverso: al disminuir la cantidad de ciclos en los que que no mueven al bot, el resultado es que el bot se mueve más lento porque el sistema escanea y modifica su posición más frecuentemente (¿recuerda el concepto de frecuencia?).

Pruebe los programas. Modifíquelos, vea que pasa cuando lo modifica, sea proactivo: toque, lea pruebe, modifique.

Póngase a tono si aún no lo hizo porque dentro de poco viene lo mejor: hemos estudiado en estas pocas lecciones los principios fundamentales de variable, controles, interfaces y  sistemas de software necesarios para implementar juegos dinámicos y con jugadores autómatas.

En la próxima nota crearemos un bot con el primer nivel de inteligencia artificial. Verá como un simple juego de texto se transforma en un proyecto sumamente interesante.

Hasta la próxima.


Descarga el programa04a.bas (sin control de velocidad) desde aquí

Descarga el programa04b.bas (con control de velocidad) desde aquí

DescargaQbasic+DosBox desde aquí


----------------------------------------------------------------------

  Curso Gratuito de Programación de VideoJuegos

  1. Introducción

  2. A quienes va dirigido el curso
  3.Temario del curso / Herramientas
  4.Primer programa (codigo fuente) 
  
  ----------------------------------------------------------------------
Share:

Curso de juegos (8)


Curso “Programación de Juegos”

Curso Gratuito
Entrega 8. La I.A. (Inteligencia artificial) en los juegos


Uno nota el desarrollo mas o menos profundo de un juego a través de la inteligencia artificial ( IA ) que se aplique en ellos. En esta nota hablaremos de la IA. Probablemente la nota salga un ciento por ciento teórica, pero es importante que entienda la teoría para llegar a la práctica.

Un problema que sufrimos todos los programadores es el de la ansiedad crónica… Tendemos a escribir código aún cuando no dominamos la teoría… de ahí la mediocridad creativa en los programadores actuales. Tenga paciencia y lea estas líneas de teoría para programar como los mejores… jaja.

Entrando en el tema: la arquitectura actual de los sistemas permite simular comportamientos independientes al humano y de ese modo compartir la partida con diversos bots (robots) virtuales que hacen más divertido jugar. Mientras más IA tengan los bots mejor será el juego… y más adictivo también.

Para mucho programadores iniciales (y no tanto), la IA es un tema oscuro y difícil. Pero siguiendo el estilo descontracturado de estas notas, voy a explicarle exactamente lo que es la IA y como se puede aplicar a los juegos de un modo práctico y, por supuesto, con un ´código fuente.

Para empezar, como es mi estilo de dar clases, voy a simplificar muchísimo los términos y conceptos porque como programador de base que soy, las intelectualidades no me sirven. A usted tampoco.

Parte del problema de la IA actual es que los programadores se han perdido tanto en la maraña teórica que proponen en la bibliografía los autores de IA, que han perdido el espíritu de aventura de los que programábamos en los 80… Se han vuelto perezosos intelectualmente y como no aplican razonamiento, dependen de los famosos lenguajes de IA y motores de inferencia, siendo incapaces de desarrollar su propio motor de IA.

Eso no le pasará a usted (que lee estas líneas)… porque entenderá al 100% la IA y la aplicará al 100% en sus juegos… o aplicativos… dependiendo de la magia de su imaginación… como todo buen programador de base o de propósito general.

Vamos al grano: ¿Qué es la IA?

Podemos definirla de muchas maneras, pero a nosotros nos interesa la IA aplicada a juegos.
Hay miles de hojas escritas.. miles de autores… miles de libros vendidos. Lo cierto es que la clave de la IA la hemos tenido los programadores de juegos desde los años 80… pero nadie nos ha prestado atención y los intelectualoides de la IA nunca tomaron en serio los juegos. Hoy en día están empezando a darse cuenta de su error… o por lo menos algunos de ellos.

Mi Definición: La IA es la capacidad de tomar decisiones que tiene un sistema basándose en datos previamente almacenados. Esas decisiones pueden tender a hacer una descripción global del conjunto de eventos, sintomas y signos analizados (sistema IA diagnosticador) o hacer un cálculo probabilístico de esos eventos, sintomas y signos para determinar comportamientos futuros (sistema IA predictivo).

Esto… desde el punto de vista que nos interesa por ahora (juegos). Como mencioné, hay otras definiciones pero en esto se basa TODA  la IA.

Fácil…..  ¿Qué no….? Bueno… lo llevaremos al plano cotidiano:

Ejemplo: Usted no metería los dedos en el enchufe de 220 volts… ¿no es así? (a menos que sea idiota… o tenga algún problema grave en la esfera intelectual… o sea un niño sin conocimientos o experiencia… o...o…o… etc)

¿Por qué no lo haría?

  1. Porque sabe que es peligroso (tiene conocimiento o alguien se lo dijo)
  2. Porque ya lo hizo y le dio una “patada” (tiene experiencia previa)
  3. Porque nunca antes estuvo frente a un conector 220 y por eso nunca hizo la prueba  
  4. O nunca se le ocurrió que podía meter sus dedos en el agujero (le falta imaginación o proactividad) 
NOTA >>> si usted califica en los puntos 3 o 4 : POR FAVOR NO META LOS DEDOS NI NADA METALICO EN EL CONECTOR DE 220 VOLTS.

Siempre habrá alguien que opine con más o menos proposiciones o quiera entablar una polémica al respecto de estos puntos. Dejemos las discusiones inútiles a los post-graduados intelectualoides que todavía discuten la IA y aún no la desarrollan al 100%.

PRIMERO: para que haya IA se necesita un conjunto de información que sirva de base para tomar decisiones (los puntos 1 y 2 reflejan información). El conocimiento en un sistema de IA es una base o un banco de datos o un conjunto de ellos. Se llama “Base de Conocimiento”.
(si no sabe la diferencia entre base de datos y banco de datos… a estudiar…)

SEGUNDO: para que haya IA no basta la información, debe haber un sistema que seleccione la información necesaria para que el sistema pueda tomar una decisión (un mega sistema del tipo IF-THEN-ELSE). A eso se le llama “Motor Inferencial”. Este motor inferencial puede programarse para distintos objetivos (Diagnosticar / Predecir, etc). El motor inferencial está formado por “reglas”.

Nuestra regla sería: 

    IF “con el dedo toco el conector de 220” THEN

        “me electrocuto. Game over.”

    ELSE “ingreso algo metálico al conector de 220”

        “también me electrocuto. Game over.”

    END IF


En el primer gráfico le muestro como funciona el sistema de IA: el motor inferencial debe tener un sistema de consulta. Cuando la consulta entra en el sistema, el motor inferencial determina que información debe recolectar para generar una respuesta.

Sencillo.

Si entendió hasta aquí todo lo que escribí, es usted un experto en alrededor del 50% de lo que es la IA.
 


Todo lo demás en un sistema de IA es un complemento para que estos dos elementos (motor inferencial y base de conocimientos”) funcionen moderadamente bien y se comunique con el exterior razonablemente bien.

Sistema de consulta

Por ejemplo: se puede programar una analizador sintáctico para procesar la consulta. El analizador sintáctico también se conoce como parser.

Si el parser trabaja con un lenguaje técnico específico pre-programado con reglas de escritura, sería algo así como el analizador sintáctico usado en SQL o en mi programa SQL Connector.

Estos analizadores sintácticos son muy sencillos de implementar y se conocen desde hace décadas. Cuando usted programa en su entorno IDE, tiene incorporado un analizador sintáctico. Puede ver un ejemplo de parser para lenguaje de programador en mi compilador VPBasic.

Si el parser trabaja con lenguaje humano, se le llama “procesador de lenguaje natural”. Estos son un poco (sólo un poco, no mucho) más complejos porque deben reaccionar a diferentes modos de expresión.

Le doy un ejemplo: supongamos que se comunica con su novia (a la que quiere mucho) y a través de un mensaje le puede expresar una idea de diversos modos:

-Te amo
-I love you
-Love
-TQM

Su novia (que cuenta con un cerebro humano) tardará una mínima fracción de segundo en entenderlo sin problemas. Y entiende que es el mismo mensaje no importa como lo exprese. Porque su novia cuenta con una mega computadora que procesa en paralelo millones de mensajes al mismo tiempo y a una super velocidad imposible para las computadoras actuales. Tampoco requiere de un sistema de refrigeración de millones de dolares basado en tanques de nitrógeno para pensar (para los que dicen ¿y las computadoras cuánticas…?)

Pero estas opciones le “rompen la cabeza” a un minúsculo cerebro de silicio de 1.000 nucleos que sin importar el precio… depende de un programa cuyo parser debe analizar todas estas escructuras y puede tardar mucho tiempo en “darse cuenta” del sentido del mensaje. Y si no está programado para analizar la frase que usted usó… simplemente no lo entiende.

Sistema de respuesta

Es más facil, porque puede generar frases a partir de un programa pre-establecido por el programador, que sigue sus propias reglas y elimina el componente aleatorio para responder monolíticamente según lo programen.

Entonces ¿Qué hace compleja de implementar a la I.A.?

Como podrá ver, la IA no es tan difícil de implementar. Cualquier lenguaje programa IF-THEN-ELSE, por lo tanto usted puede aplicar IA en cualquier lenguaje. Pero existen un conjunto de problemas en muchas áreas de la IA.

Veamos algunos (no todos, solo algunos para darnos una idea). Usted puede analizar otros factores. Obviamente la clave es el programador. Con un buen programador usted analizará multiples problemas externos, pero si tiene un programador mediocre… no hay solución posible que sea satisfactoria.

Veamos esos problemas técnicos…. El motor inferencial puede trabajar más o menos eficiente dependiendo de algunos factores clave:


  1. El nivel del lenguaje usado. Mientras más de alto nivel sea el lenguaje, la traducción a lenguaje máquina tarda más ciclos de reloj. De ahí el intento de crear lenguajes específicos para implementar IA 
  2. La rapidez del algoritmo. Depende de la experiencia del programador pero esto también choca con el límite del bajo nivel. Dependiendo de la estructura de bajo nivel del compilador que se use las instrucciones y funciones de toma de decisión del alto nivel pueden incluir más o menos ciclos de reloj una vez creado el ejecutable.
  3. La cantidad y calidad de la información recoletada en la base de conocimientos. A mayor información analizada, menos rapidez pero mayor efectividad del análisis. Esto depende del diseño del algoritmo y de como se crean las reglas de conocimiento del motor de inferencia.


Si lo piensa un poco, se dará cuenta que cada motor inferencial requiere de un diseño de base de conocimiento especialmente diseñada para él.

Ejemplos:


  1. Información de cotización de la bolsa >>> predicciones de valores bursátiles
  2. Signos, sintomas y valores de laboratorio >>> diagnosticador médico de sindromes o enfermedades
  3. Signos y sintomas de sindromes depresivos >>> bot conversacional terpeutico psicologico
  4. Analizador de datos quinielas y loterías >>> prediccion de resultados 

 Algunos de estos ejemplos ya existen desde hace mucho tiempo. Por ejemplo, hay notas periódisticas escritas por robots desde hace varios años en prestigiosos periódicos del mundo, analizadores bursátiles que generan información en tiempo real que influyen sobre las cotizaciones de bolsa de algunas empresas… hay ejemplos para todos los gustos posibles.

Aplicación de I.A. en juegos

Le dejo toda la información para que usted investigue. Ahora vamos a lo que nos importa: como aplicar la IA en nuestros juegos.

Obviamente vamos a decir que implementaremos (por una cuestión didáctica) 3 niveles de IA

a) Nivel 0 (estrictamente sin IA). Implementaremos un bot con movimientos al azar para comenzar a ver cómo se crean interfaces de sofware que nos sirven de base para implementar técnicas de programación con enemigos activos en nuestros juegos, pero que se moverán independientemente pero sin analizar al jugador humano.
Este programa ya lo tengo armado. Sólo tenga paciencia.

b) Nivel 1 (con IA de primer nivel). En este nivel crearemos un enemigo que tendrá una tendencia a “buscar” acercarse al jugador humano para confrontarlo. Sus movimientos serán entonces programados para que se acerquen al jugador. La base de conocimientos será entonces la ubicación del jugador y el motor inferencial simplemente será el encargado de sugerirle al bot que camino tomar para acercarse al jugador.


c) Nivel 2 (con IA de segundo nivel). Aquí haremos un salto porque la idea es que el bot no sólo se acerque al jugador humano, sino que prediga que movimientos hará para anticiparse a él.  Su base de conocimiento será la información de la posición actual del jugador humano y un sistema de análisis estadistico que almacene los movimientos del jugador, detectando que posiciones son las más usadas por el humano dentro del tablero de juego. Parece complicado, pero verá que no lo es tanto. Estos son sistemas que, mientras más se juego, más inteligente se vuelve el bot porque analiza más infomración y aumenta su probabilidad de acierto. Esto se conoce como predicción de rama o juegos predictivos.

Espero haber sido claro en los conceptos. Por supuesto que estos postulados se irán aclarando en la medida que vea el código escrito y vaya implementando las soluciones propuestas.

Seguiremos usando el viejo Qbasic (por lo menos para el nivel 0). En cualquier momento “saltaremos” a un lenguaje algo más potente.

Por ahora el viejo entorno de caracteres sigue siendo útil para analizar técnicas de programación.

Hasta la próxima.

----------------------------------------------------------------------


Share:

Entradas populares

Contador

Acerca del ProfePonce

Contacta con el ProfePonce

Siguenos en Twitter

Nuestro Boletin de Seguridad en Facebook

Libros Publicados del ProfePonce

Compra Nuestros Cursos Técnicos

Nuestro Indice de Notas Técnicas

Catálogo de CCT

Promoción

Mi Ping en TotalPing.com

Descarga Nuestros PDF Gratuitos

Ingresa a Nuestra Aula Virtual

Bienvenidos a Nuestra Web

Unordered List

  • Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
  • Aliquam tincidunt mauris eu risus.
  • Vestibulum auctor dapibus neque.

Pages

Theme Support

Need our help to upload or customize this blogger template? Contact me with details about the theme customization you need.