2012-02-10 10 views
6

Estoy a punto de crear la clase Player and AI Players (AIBasicPlayer, AINormalPlayer y AIHardPlayer) para mi juego de cartas (gin rummy). ¿Cuál sería el mejor enfoque OOP o patrón de diseño para crear dichas clases? Revisé algunos de los juegos de tarjeta de código abierto y comparar sus enfoques, siguiendo son los enfoques he recogido:Card Game Player Class OOP Design

***Classes** 


    1. player class only 

      public class player{ 
      } 
      public class AIPlayer{ 
      } 

    2. base class player 

      public abstract class player{ 
      } 
      public class HumanPlayer extends player{ 
      } 
      public class APlayer extends player{ 
      } 

    3. interface player 

     public interface IPlayer{ 
     } 
     public class Player implements IPlayer{} 
     public class AIPlayer implements IPlayer{} 


*** Methods** 
    takeTurn()  
    doDiscard() 
doDraw() //pick from discard pile or deck 
doKnock() 

entiendo el uso de los códigos anteriores, pero no podía decidir cuál aplicar o poner en práctica Soy nuevo en OOP o Design Pattern y su muestra de consejos y códigos sería de gran ayuda.

Respuesta

4

Elegiría la segunda opción, porque el jugador tendrá algunas funcionalidades (y datos) definidas para los jugadores regulares y de IA.

también tomar nota, también me gustaría definir una interfaz iPlayer la cual el jugador implementaría

7

Me gustaría empezar con enfoque 3, que proporciona la menor cantidad de cohesión entre las dos clases. Si encuentra que hay una gran cantidad de funcionalidades comunes, utilice el método 2, o extraiga esa funcionalidad en otras clases de las que están compuestas sus implementaciones IPlayer. Por lo general, trato de favorecer la composición sobre la herencia porque hace que su código sea más fácil de modificar cuando se refactoriza y más dinámico en tiempo de ejecución.

+0

@ ggreiner-Eso tiene sentido. ¿Qué tal el diseño de AIPlayer que tiene diferente fuerza? Quiero decir, tengo diferentes AIPlayer como AIBasicPlayer, AINormalPlayer y AIHardPlayer. ¿Qué patrón de diseño debo usar ya que tienen los mismos métodos con diferente fuerza o algoritmo? Le agradecería si pudiera proporcionar un código de muestra. – Zack

+0

@Zack en su clase AIPlayer podría hacer algo en la línea de identificar un componente de AIBehavior que determine cómo juega. De esta forma, puede usar la misma clase AIPlayer para cada dificultad y actualizar el componente AIBehavior según sea necesario. – SpartanDonut