2011-08-05 15 views
6

Estoy diseñando un juego de ajedrez en Java (sin AI, solo controlado por el usuario), y todavía me estoy acostumbrando a OOP. Tengo dos preguntas.Diseñando objetos para un juego de ajedrez en Java

estaba pensando de tener, además de Game, Cell, Piece y Board objetos, un objeto de Player.

Mi pregunta es, ¿realmente lo necesito? Por supuesto que no es necesario, pero ¿se considera que una opción es un mejor diseño? Por un lado, parece que un jugador es útil para contener información sobre piezas de jugadores y debe contener métodos como takeTurn(). (Para mi implementación, también quiero hacer un seguimiento de todos los movimientos posibles, así que tendré un método getAllMoves()). Por otro lado, ¿Player no es simplemente una reorganización de los datos existentes? Cada Pieza ya tiene una indicación de a qué jugador pertenece. Y como mi juego no contiene AI, podría tener sentido que takeTurn() pertenezca a Game, en lugar de Player. Por primera vez, quizás Player solo tenga el método getAllMoves(), que utiliza sus datos pero no toma medidas.

La segunda pregunta, relevante si la respuesta a la primera pregunta es sí, es ¿cómo organizo las relaciones entre los objetos? getAllMoves() tomará como entrada una matriz de celdas; pero parece extraño que la clase Player dependa del hecho de que sus celdas coinciden (son un subconjunto de) las celdas pasadas como entrada. Se sentiría más bien si los datos divididos por jugador de las células se mantuvieran juntos con la matriz de todas las celdas de la Junta, y se actualizaran juntos, garantizando así que estén de acuerdo. Por supuesto, la garantía de que están de acuerdo existiría de cualquier manera, pero parece que el objeto Player no debería estar al tanto de la garantía que está teniendo lugar en el objeto Board.

¿Cómo manejo estas preguntas?

Gracias!

+1

Suena como si estuviera intentando un [BDUF] (http://en.wikipedia.org/wiki/Big_Design_Up_Front) - tal vez podría considerar una forma alternativa de expulsar su modelo de objetos, como [TDD] (http://msdn.microsoft.com/en-us/magazine/dd882516.aspx) – razlebe

+1

BTW Creo que diseñar un juego como el ajedrez es una muy buena forma de familiarizarse con OOP. Recuerde favorecer las asociaciones por interfaz sobre subclases directas porque estas últimas crean un acoplamiento ajustado que no siempre es necesario. –

Respuesta

2

En mi humilde opinión tener un objeto Player es un buen diseño.
Incluso puede refinarlo más tarde en una interfaz y tener una implementación de AIPlayer y HumanPlayer.
Hoy solo necesita el método getAllMoves pero más tarde es posible que necesite más. Tener un objeto te ayudará a extender tu habilidad con el jugador.

Para su segundo punto, no estoy seguro de que el Reproductor implemente directamente el método getAllMoves().

Lo delegaría en el objeto ChessGame. Jugador va a tener en este caso una referencia al juego y los delegados de los getAllMoves llaman a esta instancia del juego, así:

pseudo-código :)

bueno juego, ¿cuáles son los movimientos disponibles para esta pieza ?

+0

Estoy de acuerdo. Tener getAllMoves dentro de Player lo haría más o menos omnisciente. Existe el riesgo de que este enfoque lleve a acumular mucha lógica dentro de una clase. En la vida real, un jugador podría ser visto como una evaluación de movimientos posibles mirando el tablero. Esto podría ser transpuesto como un mensaje que refleja el pseudo-código que has dado. –

+0

¡Gracias! Pensé que un Jugador no debería tener referencia al Juego, pero creo que tiene sentido que lo haga. Otro lugar en el que estoy tropezando es la Pieza. Parece que debe almacenar la lógica para los diferentes movimientos disponibles para las diferentes piezas, es por eso que creé una clase para cada tipo de pieza. Pero, de nuevo, para determinar si puede hacer un movimiento, debe conocer las celdas circundantes. ¿Eso es algo que debería hacer el Juego o la Pieza? – user64480

+0

@ user880129, es algo realmente bueno que te hagas esta pregunta y todavía me estoy perdiendo en este tipo de consideración. En algún momento OOP nos hace pensar demasiado :) Para su caso, crearé una clase central, que actuará como un centro y capaz de responder a todas las preguntas relacionadas con el estado del juego, como: ¿esta celda es gratis, cuáles son las piezas que la rodean? mover fuera del tablero, ... Entonces la pieza solo contendrá la descripción del movimiento y la lógica pequeña. Tal vez deberías tratar de encontrar un juego de ajedrez de código abierto para ver cómo se hace. Esto puede ayudarte a construir tu propio sistema. – Guillaume

1

La cuestión de si necesita un objeto 'Player' - pregúntese si este objeto tiene alguna interacción/relación con otros objetos en su sistema. Además, ¿tiene algún dato o información de estado que desee registrar? Puedo pensar en un par de cosas que puede que quiera hacer un seguimiento de un jugador: piezas capturadas, tal vez una puntuación.

Por cierto, podría ser una buena idea construir un modelo de objetos para visualizar cómo se relacionan los objetos entre sí. Esto también le dará una mejor idea de las interfaces entre los objetos y los métodos requeridos.

+2

... nombre del jugador, color jugado –

1

¿Está familiarizado con UML y más específicamente con Diagrama de casos de uso y Secuencia? Esto suena como un ejercicio de modelización y sería una buena idea buscar también la noción de modelo de dominio.

Los actores de la aplicación de uso como Player suelen transponerse como clases (también conocidos como sustitutos). Se pueden determinar otras clases comenzando con un diagrama de secuencia aproximado para cada caso de uso con su clase Actor en un lado y una clase de sistema global en el otro.

Esta clase de sistema se puede descomponer gradualmente a medida que avanza por los diferentes mensajes. Si un método/messsage no está directamente en una sola instancia de una clase y sus atributos/estado interno, existe la posibilidad de que pertenezca a otra parte (por ejemplo, una clase BankAccount no tiene la misma responsabilidad que una clase BankAccountManager). Puede agrupar los métodos de acuerdo con la naturaleza y debería ver aparecer otras clases.

A partir de ahí debe ser un caso simple de determinar si existe alguna relación de 1 a 1, uno a muchos y muchos a muchos entre ellos. En Java, estos estarán representados por instancias únicas o Listas y direccionalidad (¿la clase A sabe acerca de la clase B o es una calle de sentido único?) Se representa por la presencia o ausencia de referencias dentro de las clases respectivas.

P.S: Tenga en cuenta que lo que describo vagamente es un enfoque de la metodología, mientras que UML simplemente se contenta con describir un sistema desde diferentes puntos de vista.

Cuestiones relacionadas