Captura la bandera

De OpenDataLab
Saltar a: navegación, buscar

Página de las características de la plataforma CTF-UHU

Descripción del proyecto[editar]

El proyecto a desarrollar se puede encajar, principalmente, dentro del proyecto docente del área de de Ciencias de la Computación e Inteligencia Artificial. Éste va a consistir en el desarrollo de una plataforma multiagente donde poner en práctica todas las ideas y algoritmos desarrollados durante los estudios de Grado en Ingeniería Informática.

En concreto, para la asignatura de Inteligencia Artificial, los alumnos lo usarán para experimentar con los principales algoritmos de búsqueda estudiados.

Para la asignatura Sistemas Inteligentes, los alumnos podrán desarrollar por completo un agente software, o varios, para poner en práctica los conocimientos aprendidos en la asignatura.

Sobre la plataforma, se desarrollará en Java. Simulará el juego "Capture the Flag". El servidor será un agente sofware JADE. Recibirá jugadores y simulará las partidas. También se desarrollará un agente gráfico, para ver la partida. La comunicación entre agentes se basará en la biblioteca JADE. La parte gráfica se desarrollará mediante la biblioteca PROCESSING.

Objetivos: - Estudio y desarrollo de la plataforma base y arquitectura del sistema.

- Integración con entorno gráfico.

- Desarrollo de esquemas de programación.

- Elaboración de algunas prácticas "tipo".

- Redactar documentación del funcionamiento del sistema.

- Implantación de la plataforma en la web.


GitHub[editar]

https://github.com/Saviatron/Plataforma_CTF_UHU


Vídeo funcionamiento[editar]

Demostración funcionamiento Plataforma


Versión y estado[editar]

El proyecto está actualmente en la versión 9.1.

Esta versión es completamente estable y tiene todas las funcionalidades pensadas inicialmente.


El estado de desarrollo es 99%, ya que siempre será posible seguir añadiendo funcionalidades.

Implementadas[editar]

- Agente Servidor inicial. Se han planteado los comportamientos.

- Agente Monitor inicial. Se han planteado los comportamientos.

- Agente Jugador inicial. Se han planteado los comportamientos.

- El Agente Servidor lee los mapas, se han desarrollado los comportamientos básicos.

- El Agente Servidor recibe y administra Agentes Monitores.

- Se ha establecido la conexión entre Agente Servidor y Agente Monitor. Se muestra la partida por pantalla.

- Cambiar de JFrame a processing 2, luego a processing 3. Esto implica que PApplet no hereda de Applet, debido a eso, no se puede incrustar en JFrame.

- El PApplet no tiene constructor con parámetros, para ello: InitMapa().

- La solución es crear 2 ventanas: GUI_Interactuar (Para ver los jugadores, cambiar camaras, y elegir entre 2D y 3D). GUI_Mapa (Ventana del sketch donde se representará la partida).

- Dibujar el mapa en 2D con processing.

- Dibujar el mapa en 3D con processing.

- Agente Jugador básico funcionando.

- El Agente Servidor ya recibe y gestiona las acciones de los Agentes Jugadores.

- Realizar procesador de lenguajes (Parser) para comunicar mapa:

       La gramática realizada finalmente para el primer mensaje HandleInform será: 
       
       handleInform : orientacion "," vision_parcial "," ancho_mapa "," alto_mapa "," posX "," posY "," num_eq "," mapa "\n" (linea)*
       orientacion : Boolean
       vision_parcial : Boolean
       ancho_mapa : Integer
       alto_mapa : Integer
       num_eq : Integer
       mapa : ( " " | "#" )*
       linea : token "," equipo "," posX "," posY "\n"
       token : "entrada" | "jugador" | "muerte" | "base" | "bandera"
       equipo : Integer
       posX : Integer
       posY : Integer
       La gramática realizada finalmente para el mensaje de cada Tick será: 
       
       tick : (linea)*
       linea : token "," equipo "," posX "," posY "\n"
       token : "entrada" | "jugador" | "muerte" | "base" | "bandera"
       equipo : Integer
       posX : Integer
       posY : Integer


- Corregir texturas 2D y 3D.

- 2 SimpleAchieveREResponser (FIPARequest): Solucionado con plantilla de mensajes, una para jugadores y otra para monitores.

- Arreglar bucle para leer acciones de HashtTable, en el comportamiento Tick.

- Pasar nombre de jugadores a GUI_Interactuar.

- Primera versión 3D: Graficos en 3D simples Pelotas, cubos y triangulos.

- Ir adaptando jugadores a los cambios en el servidor, y a varios equipos.

- Monitor para cada pc con jugadores. Independiente del servidor.

- Archivo Config externo. (API Properties)

       servidorConfig.cfg: como su nombre indica, es el fichero de configuración del servidor.
       
       NOMBRE_SERVICIO = Nombre del servicio que ofrece el agente Servidor (String)
       TIPO_SERVICIO = Tipo de servicio que ofrece el agente Servidor (String) MAPA= Nombre del fichero .txt del mapa (String)
       CONTENIDO = Nombre del fichero .ini de los elementos iniciales del mapa (String)
       ORIENTACION_RELATIVA = Tipo de orientación de la rotación de la acción. true para relativa, false para absoluta (Boolean)
       TICKS = Cantidad de ticks sin enviar acción para ser desconectado (Integer)
       DESCONEXION = Activar o desactivar la desconexión de los jugadores (Boolean)
       MAX_JUGADORES_EQ = Número de jugadores máximo por equipo. Recomendado ~5 (Integer)
       NUM_EQUIPOS = Número de equipos. Recomendado 2 (Integer)
       TiempoTick = Tiempo entre ticks. Recomendado ~500 (Integer)
       TASA_RECHAZO = Probabilidad de rechazo de la conexion. Recomendado ~0.5 (Integer)
       VISION_PARCIAL = Comunicar tablero completo o solo parte visible (Boolean)
       ALCANCE = Número de casillas al frente que verá el jugador con visión parcial (Integer)
       ANCHO = Número de casillas a los lados que verá el jugador con visión parcial (Integer)
       monitorConfig.cfg: como su nombre indica, es el fichero de configuración del monitor.
       
       SERVIDOR = Indicamos true si queremos conectar al servidor, false si queremos leer una partida de fichero (Boolean)
       PARTIDA = Si queremos leer una partida, indicamos su nombre. Si no, este parámetro será ignorado. "Partida.txt" (String)
       IS3D = Indicamos true si queremos visualizar en 3D, false si queremos visualizar 2D. (Boolean)
       SOUND = Indicamos true si queremos música de partida. (Boolean)

- Desconectar monitor

- Animaciones entrada y muerte de jugadores.

- Enviar mensaje GameOver a monitores

- Probar monitores externos desde otro PC.

- Montar archivos .bat y .jar

- Corregir varios jugadores con bandera. se debe a que hay varios jugadores en la misma casilla, problema procedente por la falta de un break; en un switch.

- Realizar copias de seguridad.

- Varias acciones para un jugador en el mismo tick. Debido a anteriores acciones en hashtable no eliminadas. Esto generaba también el error de MAX_Jugadores. La solución ha sido eliminar por fuerza bruta recorriendo el array de jugadores y eliminando por nombre. Al morir un jugador, se eliminaba el Objeto de la lista. Al volver a entrar, se crea otro objeto con el mismo nombre. Habia veces que no se eliminaba correctamente, por ello eliminamos por nombres. Ademas, estos 2 distintos objetos con el mismo nombre, es lo que creaba conflictos en la hashtable asignando 2 posiciones al mismo jugador en un mismo tick.

- Cargar .obj en 3D, optimizando el tiempo de carga eliminando texturas y aplicando en tiempo de ejecución el color. Solo disponemos de 5 segundos para cargar las figuras en 3D.

- Aplicar texturas con textureMode(PConstant.NORMAL). Pero podría ser mas lento, no abusar.

- Añadir opción 2D-3D en GUI_Interactuar.

- Añadir varias opciones cámaras en GUI_Interactuar.

- Redimensionar pantalla del sketch al iniciar.

- Opción 2D mantenida debido a restricciones de pc.

- Hacer cámara fija

- Hacer cámara controlada por el raton

- Mapa lineal en lugar de bidimensional. Sigue sirviendo? Añadir a monitor y jugador?

- Redimensionar las 2 ventanas y posicionar correctamente para varios equipos.

- Si añadimos redimensionamiento en tiempo real al sketch, redimensionar casillas y jugadores.

- Nueva estructura del mapa: 2 ficheros: .txt para paredes y .ini para contenido. Solo pasamos el mapa 1 vez, luego solo comunicamos el contenido.

- Modo sin monitor, guardar partida en .txt

- Estadísticas de la partida.

- Skybox en processing

- Añadir sonidos. Hacer visibles acontecimientos.

- Poner botones del Play... etc...

- Estadísticas. quien es el ganador número de tics jugados número de bajas por equipos.

- Lista de jugadores y sus bajas.

- Esquema de pasos de mensajes.

- Cámara por teclado

- Meter carpeta figuras dentro del .jar

- Añadir opción 2D-3D en config.

- Ordenar librerías externas.



- Beta finalizada.



- Poner nombre al equipo. El primer jugador que cambie el nombre del equipo.

- Opción para deshabilitar sonido del monitor.

- Cámara por jugadores. Más o menos, hay que terminar de cuadrarla por posición. Se elegirá un jugador de la lista de los actuales.

- Añadir orientación a jugadores (solo se mueven adelante) . Orientación relativa o absoluta. Se elige en Servidor.cfg. Se ha creado la clase Accion.java. El servidor recibe: int,String (Absoluta) o int,int (Relativa) -> desplazamiento,orientacion Si (desp>1) -> desp=1 Relativa: si (!grados%45) -> INCORRECTA Absoluta: si (¡orientacion==[N,NE,E,SE…]) -> INCORRECTA Si (desp==0) -> NULA Si recibe “ABANDONAR” -> Abandonar Orientación inicial -> 0 == N -45º -> 360-45 , 405º -> 405%360 Deberia rotar si desp==0? Por ahora no. Añadir opción de despl=-1 (atrás)? Se podría quitar opción, ya que se diferencia en int o String? - Sombras y luces en processing (Terminar, arreglar fallos) Por ahora no!

- Ficheros partida y estadística siempre abiertos. Si el servidor no acaba como es debido se pierde todo. Ultima voluntad o abrir y cerrar siempre? Java.Util.Logging no sirve, escribe fecha… -> Abrir y cerrar cada vez que escriba.

- Mapa parcial: Solo se le enviará al jugador una porción del tablero en cada tick. Configurable desde ServidorConfig.

- Hacer esquema rellenable de jugadores (jugador esqueleto) PARA PRACTICA IA LABERINTO

- Hacer Agente Jugador con comportamiento basado en Sistema Difuso mediante XFuzzy.

- Agentes Monitores y Agentes Jugadores adaptados a todos los cambios del Agente Servidor.

- Implantación de la Plataforma en Internet. Desarrollo de la Base de Datos inicial.

- Ejecución de la plataforma en la Base de Datos local. Todo correcto, arreglado fallos de finalización.

Pendientes[editar]

• Redimensionar tablero y casillas a pant. Completa

• Mejorar jugadores

• Añadir elementos al juego. (Vida, daño, paredes moviles, recursos)

       Vida y daño ya añadidos.

• Hacer figuras con menos detalles -> eficiencia

Ideas[editar]

De cara al futuro, aunque la plataforma se ha desarrollado por completo, cumpliendo todos los objetivos propuestos, aún se puede ampliar:

• Cabe la posibilidad de desarrollar otro tipo de juego mediante otro tipo de objetos, acciones, agentes…

• Hasta ahora, en la percepción de los agentes jugadores, solo se percibe el tablero y sus objetos. Con el objetivo de desarrollar una plataforma más completa, se podrían añadir otros tipos de percepción, simulando otros tipos de sensores. Por ejemplo, zonas de temperaturas elevadas, de las que podemos percibir las temperaturas. Además, podríamos percibir sonidos de jugadores alejados.

• La plataforma desarrollada hasta ahora funciona por ticks. Gracias a la libertad que nos ofrece JADE mediante el paso de mensajes asíncronos, se podría desarrollar una lógica de juego en tiempo real que no esté marcada por ticks.

• Respecto al tablero, se ha desarrollado con casillas cuadradas. Se podría desarrollar otro tipo de tablero, por ejemplo, hexagonal, o incluso de campo abierto, sin casillas. Por supuesto, cabe la posibilidad de desarrollar un juego en 3D, cuyo tablero incluya diferentes alturas.

Autoría[editar]

Autor del proyecto: Javier Martín Moreno.

Tutor del proyecto: Gonzalo Antonio Aranda Corral.


Firmado[editar]

--Javier.martin816 (discusión) 11:49 20 jun 2019 (CEST)