matcom / domino

MIT License
14 stars 9 forks source link

Domino

Proyecto de Programación II. Facultad de Matemática y Computación - Universidad de La Habana. Curso 2022.

El propósito de este proyecto es implementar una biblioteca de clases que permita modelar y experimentar con diferentes variantes del juego Dominó, así como diferentes estrategias de jugadores virtuales.

Usted deberá entregar una solución compuesta, al menos, por dos proyectos en el lenguaje de programación C#:

Sobre la biblioteca de clases

Su biblioteca de clases debe permitir modelar diferentes variantes del juego de dominó clásico, de forma que sea posible modificar algunos aspectos relevantes de la mecánica del juego. Usted debe permitir modificar al menos 5 aspectos relevantes de la mecánica del dominó.

Una lista no exhaustiva de los aspectos que pudiera querer personalizar son:

Note que estas son solo algunos de los múltiples elementos de las reglas del juego que pueden cambiarse. Usted tiene la libertad de decidir hasta dónde desea que sea personalizable su implementación.

Por cada uno de los elementos que son personalizables en su juego, usted debe proveer al menos dos implementaciones diferentes de dicho elemento. Por ejemplo, si permite cambiar la forma en que se calcula la puntuación final, usted puede implementar la variante clásica de sumar todos los puntos, y al menos otra variante de su invención.

Además de las reglas del juego, su biblioteca de clases también debe permitir implementar diferentes estrategias de jugadores virtuales. Usted debe implementar al menos 3 estrategias diferentes.

Algunos ejemplos posibles son:

Note que sus jugadores virtuales tienen que funcionar de forma transparente para cualquiera que sea su configuración actual. Por ejemplo, si usted implementa un jugador que siempre juega la ficha de mayor puntuación, y además implementa diferentes maneras de calcular la puntuación de las fichas, su jugador debe funcionar con cualquiera de esas variantes de calcular la puntuación, y cualquier otra variante que sea implementada en el futuro.

Sobre la aplicación visual

Para mostrar sus resultados usted debe implementar una aplicación visual que permita ejecutar una partida de dominó con cualquier combinación de todas las variantes diferentes que usted implementó, y visualizar el resultado de la partida.

La aplicación puede ser tan sencilla como una aplicación de línea de comandos (o sea, en la consola prieta), una aplicación web, una aplicación con gráficos en 3D, una aplicación móvil, etc. Queda a su decisión cuánto esfuerzo ponerle a dicha aplicación, pero al menos tiene que tener las siguientes funcionalidades.

Independientemente de la tecnología utilizada, su interfaz debe ser suficientemente flexible para que cuando cambien la estructura de las fichas, o la longitud del juego, o cualquier otro aspecto que influya en cómo se visualiza, la interfaz gráfica se adapte de forma automática.

Sobre la ingeniería de software

El propósito fundamental de este proyecto es evaluar el uso de las buenas prácticas de desarrollo de software que se han enseñado en el curso. Por tal motivo, se pondrá especial énfasis en evaluar el diseño de las clases, interfaces, y métodos, y se profundizará durante la evaluación en la justificación que usted tenga para las decisiones de diseño de software que ha tomado.

Esto tendrá mayor peso en la evaluación final que cualquier consideración sobre la funcionalidad en sí. La calidad de la interfaz gráfica, los efectos de sonido, la inteligencia artificial de los jugadores, todo eso aporta y será considerado, pero es secundario ante un buen diseño de clases que sea extensible y mantenible.

Algunos consejos:

Sobre la entrega

Dada la complejidad del proyecto, el mismo se hará en dúos. Usted tiene la posibilidad de hacerlo individualmente, pero tenga en cuenta que la complejidad será mucho mayor.

La entrega del proyecto será exclusivamente mediante un repositorio en Github.

En la raíz de su proyecto debe haber un archivo Readme.md con todas las instrucciones necesarias para ejecutar su código, así como todos los detalles de instalación (si necesitara algo más allá de .NET Core 6) y el uso de su interfaz gráfica.

Además, usted debe tener en la raíz de su repositorio un archivo de nombre Report.pdf que contendrá un reporte técnico de su proyecto. Este reporte tendrá una extensión mínima de 5 cuartillas, y ahí debe detallar su diseño de clases, exponiendo las motivaciones detrás de cada abstracción (clase, interfaz, método, etc.) así como todos los detalles de implementación que sean necesarios. Incluya fragmentos de código y capturas de pantalla para ayudar en la explicación.

Para entregar su proyecto, usted debe abrir en este repositorio un issue, donde incluirá el nombre de los miembros del equipo, el link a su repositorio, y el link directo a su archivo Report.pdf.

La evaluación se realizará en dos partes. Primero, su mentor evaluará el reporte y hará los comentarios que considere necesarios en el issue correspondiente a su proyecto. Una vez que el mentor considere que su proyecto está en condiciones de ser expuesto, le dará una cita para exponer en persona en la Facultad. El resultado de esa exposición quedará plasmado en el issue correspondiente.

La nota final será decidida por un tribunal que tendrá en cuenta las consideraciones de su mentor así como el código fuente y el reporte entregado.