Foros del Web » Programando para Internet » Javascript »

Desafío JavaScript: Inteligencia artificial

Estas en el tema de Desafío JavaScript: Inteligencia artificial en el foro de Javascript en Foros del Web. Haciendo un tutorial sobre el Pong para mi blog, decidí meterle una inteligencia artificial básica para explicar algunos conceptos sencillos más. Entonces recordé que para ...
  #1 (permalink)  
Antiguo 10/04/2013, 07:26
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Desafío JavaScript: Inteligencia artificial

Haciendo un tutorial sobre el Pong para mi blog, decidí meterle una inteligencia artificial básica para explicar algunos conceptos sencillos más.

Entonces recordé que para casi todos los lenguajes hay concursos donde la gente escribe su propia inteligencia artificial, y lo mejor, cuando hay muchos participantes, hacer un torneo de eliminación directa (o liguilla, si hay pocos) donde las IA's luchan entre sí.

Desgraciadamente, a este tipo de desafíos no puede participar cualquiera, se requiere tener algún dominio del lenguaje a utilizar y tener cierta experiencia de programador.

En mi blog no tengo, ni se espera, suficiente número de visitantes para poner en marcha este desafío, asi que pensé, qué coño, ¿por qué no lo propongo en ese nido de cabrones que me discuten cada maldita cosa que digo?

Así que aquí estoy.

Agradecería que todo aquél que se comprometa a participar responda en este post, para ver si merece la pena refactorizar el código del pong con atributos y métodos privados para evitar que los participantes hagan trampas.

El código actual del pong lo teneis aquí: http://www.jlabstudio.com/webgl/2013...oco-de-sonido/, y con él podeis empezar a programar vuestra IA, aunque con las siguientes limitaciones:

Vuestra IA sólo debería tener acceso al valor de las posiciones de las dos palas y su velocidad de movimiento, a la posición, dirección y velocidad de la pelota, y a las dimensiones que tiene el mundo. Sólo se podrá obtener esos valores, nunca modificarlos.

Como resultado, vuestra IA debería de dar una respuesta de movimiento cada vez que se le pregunte: Direccion.QUIETO si no quieres que tu pala se mueva, Direccion.ARRIBA o Direccion.ABAJO.

Hala, a ver cuántos se animan.
  #2 (permalink)  
Antiguo 10/04/2013, 19:08
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Desafío JavaScript: Inteligencia artificial

Me parece una buena idea y reto, pero ya hay un post sobre desafíos iniciado por caricatos, supongo que si se lo propones de buenas, el no tendrá ningún reparo a exponerlo. Aunque yo no soy precisamente el mas popular de estos lares para que caricatos le escuche, asi que todo pasa por que también le entre el gusanillo a idem.


Por cierto, si he entenido bien (ya estoy poniendome con esto! xD) , SOLO puedo tener acceso "legal" a los metodos accesor publicos de las coordenadas del punto que hace referencia a la position del "balon" ? , ya que me parecería mal que si se pudiera tener acceso a la velocidad de movimiento, o a datos relativos del otro jugador.


Tendrias que poder definir tambien una funcion que retorne el valor maximo de movimiento de la pala (si no hay aceleración, solo movimiento continuo) , ya que llamar a funciones que hacen movimiento instantáneo me parece poco "apetecible"

Última edición por Albuss; 10/04/2013 a las 19:21
  #3 (permalink)  
Antiguo 11/04/2013, 02:51
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Desafío JavaScript: Inteligencia artificial

En la calse PONG, dentro del método LOOP, hay este código:

Código Javascript:
Ver original
  1. var direccion2=Direccion.QUIETO;
  2.     if (ia.checked)
  3.     {
  4.         if (this.pelota.pos.y-this.pelota.lado/2 <= this.palas[1].pos.y)
  5.         {
  6.             direccion2=Direccion.ARRIBA;
  7.         }
  8.         if (this.pelota.pos.y+this.pelota.lado/2 >= this.palas[1].pos.y)
  9.         {
  10.             direccion2=Direccion.ABAJO;
  11.         }
  12.     }

Eso es la inteligencia artificial que hay ahora, y es lo que teneis que modificar. Si hay gente suficiente, refactorizaré el código, como dije, para evitar que vuestras IAs modifiquen algunos valores que no deban.

Para practicar por ahora, sustituye ese código por el tuyo. Puedes crear funciones y variables nuevas, y usarlas ahí. Y desde ahí se tiene acceso de lectura (prohibido modificar nada) a estas variables:

Todos los métodos y atributos de todas las clases son PRIVADOS, no se pueden utilizar, excepto la lista que pongo a continuación.
Todos los métodos y atributos de la clase Vector2D, que son PÚBLICOS.

Atributos accesibles para lectura por tu IA:

this.pelota.pos -> Vector2D con la posición del centro de la pelota en ese momento.
this.pelota.velocidad, ó this.pelota.vector.longitud() -> Velocidad pixeles por segundo actual de la pelota. Cada vez que choca con una pala, incrementa en 10.
this.pelota.vector -> Vector2D con la dirección que lleva la pelota.
this.pelota.lado -> Longitud del lado del cuadrado que forma la pelota. Constante.

this.palas[0 o 1].pos -> Vector2D con la posición del centro de la pala de cada jugador.
this.palas[0 o 1].ancho -> Anchura de la pala. Constante.
this.palas[0 o 1].alto -> Altura de la pala. Constante.
this.palas0 o 1].velocidad -> Velocidad pixeles por segundo de las palas. Constante.


delta -> Tiempo en segundos transcurridos desde la última vuelta del bucle.
this.canvas.width -> Anchura del mundo. Constante.
this.canvas.height -> Altura del mundo. Constante.

Todos esos datos están disponibles porque es lo que un jugador humano puede ver mientras juega. Así que una buena IA también debería ser "consciente" de ellos.

Lo único que debe modificar cada IA es la variable direccion2. Tienes que ponerle un
Direccion.QUIETO, Direccion.ARRIBA o Direccion.ABAJO según lo que quieras que tu pala haga en cada vuelta del bucle principal del juego.

Y por último quiero recalcar que no es obligatorio usarlas todas. Están accesibles para quien quiera usarlas, pero perfectamente puedes usar sólo la posición de la pelota, y la de tu pala, como la IA original.
Los códigos que hagais no los posteeis aquí, para que no os copien vuestra maravillosa idea xd. Enviádmelos por MP cuando los tengais terminados o tengais alguna duda. Lo que sí me gustaría es que la gente que esté dispuesta a participar, esriba algo, porque con sólo un participante que hay de momento, mucho campeonato no va a ver xd.

Última edición por marlanga; 11/04/2013 a las 03:10

Etiquetas: desafío, inteligencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 01:45.