ELO 330 Programación de Sistemas
"ULTIMATE CHESS ARAGORN 3.0"
Luis Bahamondes
José Pablo Fuenzalida
El Ajedrez es un juego de tablero con origen presumiblemente en la india. Es un juego de estrategia bélica y posicionamiento que muestra el enfrentamiento entre dos facciones opuestas. En la actualidad es considerado un deporte y es muy valorado debido a su contribución al desarrollo intelectual y por ser a la vez un juego entretenido, social, y terapéutico.
El proyecto busca: El ajedrez se juega sobre un tablero de $8x8$ casillas de colores alternados (generalmente negro y blanco). En cada casilla puede ir sólo una pieza, por lo que el juego cuenta con 64 posiciones posibles. Cada facción tiene 16 piezas. 8 peones, 2 torres, 2 caballos, 2 alfiles, una reina y un rey. Cada pieza se posiciona en una casilla en específico al inicio de cada partida y cada una tiene también una regla única de movimiento, y si esta se lo permite, una pieza puede posicionarse sobre una pieza enemiga, eliminándola del juego. El objetivo del ajedrez es someter al rey enemigo, lo que se logra al amenazarlo de muerte de tal forma que no tenga escapatoria ni forma de ser protegido. Este proyecto consiste en montar un servidor de Ajedrez en Aragorn, de tal manera que dos usuarios puedan conectarse a él vía TCP y disfrutar de una partida a través de la consola del terminal. En los tiempos actuales se ha hecho visible la precaria salud mental de los estudiantes universitarios en general. Este proyecto busca acercar un entorno de recreación a los estudiantes de electrónica y telemática, aportando además al desarrollo intelectual de los mismos, mientras toman un descanso de sus estudios o largas jornadas de trabajo.1.Sincronización de procesos
2.Comunicación entre procesos remotos
3.Modelo cliente-servidor
4.Desarrollo de un servidor concurrente
5.Diseño y manejo de un protocolo de capa aplicación
6.Manejo de lenguaje de programaci ́on
7.Desarrollo, diseño y trabajo de una aplicación orientada a objetos
8.Trabajo en GIT
9.Preparar documentación de un sistema de software
Una parte importante de este proyecto es la utilización del modelo iterativo e incremental, por lo que se opta por dividir el proyecto en etapas de desarrollo acumulativo que irán cumpliendo pequeños objetivos específicos.
La planificación de este proyecto considera dividirlo en etapas de desarrollo que van agregando funcionalidad de a poco le van agregando funcionalidad y complejidad.Etapas:
- Etapa 1: Creación de objetos básicos.
- Etapa 2: Ampliación en la cantidad y complejidad de los objetos mediante herencias, interfaces y métodos mas complejos.
- Etapa 3: Creación de hilos y conexión con cliente.
- Etapa 4: Enlazamiento funcional basico de las distintas clases del juego.
- Etapa 5: Comunicación entre juego y clientes.
- Etapa 6: Coordinación de los hilos del Srever.
- Etapa Futura: Crear interfaz gráfica que permita .
la visualización mas amigable con el usuario- Etapa Futura: Implementar para multiples juegos simultanteos entre indefinidos pares de cientes.
- Etapa Futura: Enlazamiento funcional completamente depurado de las distintas clases del juego.
Se propone un diseño que contempla un programa servidor que corre en una máquina remota, como Aragorn. El programa principal de este servidor se encarga de escuchar por el socket las conexiones de los clientes. Este programa atiende solo a dos clientes simultáneos, y cada vez que uno de ellos entabla comunicación, lo dirige a un nuevo Thread que se encarga de atenderlo hasta el final de la partida.
El servidor maneja también un Tread que se encarga del juego en sí. El objeto Juego se encarga de simular el juego del ajedrez, lo que incluye a los jugadores y al tablero. Este objeto trabaja de forma sincronizada con los otros hilos del servidor para recibir las instrucciones de movimiento de los clientes, procesarla, y efectuar el movimiento requerido o pedir que se envíe la información nuevamente si hubo algún error.
El objeto Tablero posee un arreglo de 8 arreglos de 8 casillas cada uno, representando así el tablero dejuego. Este se encarga de obtener el String que imprimen finalmente los clientes, de validar los movimientos solicitados por los jugadres, y de mantener actualizadas las casillas que posee cada Jugador. El objeto Casilla guarda sus propias coordenadas y el objeto Pieza que está sobre ella, siendo la pieza Vacío la pieza por defecto si es que no hay ninguna. Dado que el objeto Pieza se subdivide en varias sub-clases, y cada una de ellas sobre escribe el método ValidarMovimiento(), que es el que posee las reglas de hacia dónde se puede mover una pieza, el objeto Casilla se encarga de verificar que instancia de hijo de Objeto es Pieza. El objeto Pieza hereda a multiples hijos, donde cada uno corresponde a una pieza del ajedrez en particular. Cada una almacena su valor, su color, su nombre y sigla para imprimirse
Como valor agregado, cada cliente ve el tablero desde una perspectiva diferente. Las piezas propias estan abajo y las piezas del oponente estan arriba. Las coordenadas tambien son diferentes para cada jugador, de modo que ambos reconocen la casilla 'A1' como la casilla inferior derecha en la que se encuentra inicialmente su propia torre, y la casilla 'D8' es la casilla en que ambos pueden ver al rey enemigo
En las distintas etapas realizadas se adjuntan los respectivos diagramas UML
A continuación se presenta el diagrama de máquinas de estado para el funcionamiento del programa:
A continuación se muestra un ejemplo en un servidor local para el juego de Ajedrez entregado por consola como se tiene en las primeras etapas. Se realiza el supuesto en esta primera etapa que no se cometen errores al momento de realizar jugadas de igual forma se imprime en la consola del servidor el estado del juego a modo de prueba. Se permite "comer" piezas y se consideran los movimientos clasicos como válidos, en cualquier otro caso el juego presentará un bug dado que aun no se considera verificación de movimiento, a nivel de cliente servidor, solamente a nivel de servidor.
Al realizar este preyecto surgieron diversas dificultades de distinta índole, a continuación se detallan algunas de ellas.
1) Coordinación: El uso de hebras es de gran utilidad para dar la posibilidad de conectar varios clientes al mismo momento, sin embargo fue complejo el corrdinar 3 hebras para el envio de datos y recepcion de las jugadas. Se utilizaron los metodos wait y notify para coordinar las hebras.
2) Diseño: El juego del Ajedrez es un juego bastante mas complejo de lo que parece a simple vista. Hubo varias difucultades para plantear un modelo que lograse no solo emular el juego, sino que tambien traspasar las preguntas provenientes de los clientes al mismo. La solucion vino de la mano con la creacion del diagrama de clases, en el que se decidio crear la clase Jugador para administrar mensajes que recibiria Juego desde de los Thread del servidor que se comunican con los clientes en lugar de hacer que los clientes interactuen directamente con el tablero, lo que permitio especializar cada clase en su propia tarea.
Dado que el ramo actual trata de manejo de servidores, comunicaciones, procesos, e hilos, decidimos darle una prioridad mas baja a lo que es ;a resolucion de problemas propios del diseño orientado a bojetos del juego en si.
1) Jaque mate: El juego no es capaz de detectar el jaque mate, dado que este puede evitarse de muchas formas y el diseño actual no es capaz de cubrirlas todas.
Para la creación de este proyecto se hizo uso del entorno IDE de Visual Studio Code versión 1.37.1 que resulta muy funcional para programar en JAVA, gracias a la gran cantidad de plugins que posee y que tiene compatibilidad con distintos sistemas operativos.
Se hizo uso de las funcionalidades de GitLab que hacen eficiente el desarrollo de código para trabajo en equipo. Tambien, el IDE utilizado posee herramientas muy útiles y versatiles para el desarrollo con repositorios GIT.
<<<<<<< HEADEl proyecto puede ser descargado desde aquí
=======El proyecto puede ser descargado desde aquí