Estoy tratando de tener una idea de cómo diseñar y pensar de una manera orientada a objetos y quiero obtener algunos comentarios de la comunidad sobre este tema. El siguiente es un ejemplo de un juego de ajedrez que deseo diseñar de manera OO. Este es un diseño muy amplio y mi enfoque en esta etapa es solo identificar quién es responsable de qué mensajes y cómo los objetos interactúan entre sí para simular el juego. Por favor señale si hay elementos de mal diseño (alto acoplamiento, mala cohesión, etc.) y cómo mejorarlos.Diseño orientado a objetos para un juego de ajedrez
El juego de ajedrez tiene las siguientes clases
- Junta
- jugador
- pieza
- Plaza
- Chessgame
La Junta se compone de cuadrados y así Junta se puede hacer responsable de crear y administrar Square ob objetos. Cada pieza también está en un cuadrado, por lo que cada pieza también tiene una referencia al cuadrado en el que se encuentra. (¿Esto tiene sentido?). Cada pieza es responsable de moverse de una casilla a otra. La clase de jugador contiene referencias a todas las piezas que posee y también es responsable de su creación (¿Debería el jugador crear piezas?). El jugador tiene un método takeTurn que a su vez llama a un método movePiece que pertenece a la pieza Class que cambia la ubicación de la pieza desde su ubicación actual a otra ubicación. Ahora estoy confundido sobre de qué exactamente es responsable la clase de la Junta. Supuse que era necesario determinar el estado actual del juego y saber cuándo terminó el juego. Pero cuando una pieza cambia su ubicación, ¿cómo debe actualizarse la placa? ¿debería mantener una matriz separada de cuadrados en los que existen piezas y que recibe actualizaciones a medida que las piezas se mueven?
Además, ChessGame crea inicialmente el tablero y los objetos del jugador que a su vez crean cuadrados y piezas respectivamente y comienzan la simulación. En pocas palabras, esto podría ser lo que el código en Chessgame puede parecer
Player p1 =new Player();
Player p2 = new Player();
Board b = new Board();
while(b.isGameOver())
{
p1.takeTurn(); // calls movePiece on the Piece object
p2.takeTurn();
}
no tengo muy claro de cómo se actualizará el estado de la junta. ¿Debería la pieza tener una referencia al tablero? ¿Dónde debería estar la mentira de la responsabilidad? ¿Quién tiene qué referencias? Por favor ayúdenme con sus entradas y señale los problemas en este diseño. Deliberadamente, no me estoy centrando en ningún algoritmo ni en otros detalles del juego, ya que solo me interesa el aspecto del diseño. Espero que esta comunidad pueda proporcionar información valiosa.
comentario nitpicky: p2 no debe llamar 'takeTurn()' si el movimiento de P1 termina el juego. Comentario menos quisquilloso: me parece más natural llamar a los jugadores 'blanco' y' negro'. –
De acuerdo. Pero como dije, estoy más interesado en los aspectos de diseño y en qué objetos deberían ser responsables de qué acciones y quién tiene qué referencias. – Sid