2010-04-13 14 views
9

tengo algo que requiere una matriz de valores, similar a Pokemon:¿Hay un patrón para esto?

pokemon http://firechao.com/Images/PokemonGuide/PokemonTypeChart.PNG

tengo un objeto de clase para cada uno de los tipos, ¿existe un patrón o una buena forma de implementar esto, como una capa media o en las clases?

+1

ooohhhh, mis ojos .. – Roman

+0

¿Puedes hacerlo no tan brillante, por favor? – Roman

+0

¿De verdad necesitan ser clases? ¿Puedes usar tipos enumerados? No tengo suficiente información para asegurarme de darle una buena respuesta. ¿Podría explicar un poco más lo que está tratando de lograr? – senfo

Respuesta

5

Sí, pruebe el patrón de diseño Decorator.

sugerencia: acaba de crear una clase Normal con todas las estadísticas que necesita. A continuación, cree una clase Decorator para cada fila de la matriz: FireDecorator, SteelDecorator, que aplica el multiplicador para ataque/defensa.

bono # 1: usted puede construir fácilmente un "carácter cortafuego de acero", de forma dinámica (la intención del patrón)

bono # 2: cuando se agrega otro personaje, dicen que el "gigante ", que acaba de añadir una clase, sin tocar cualquier otra cosa

+0

-1, este es un ejemplo perfecto de cómo sobreescribir algo. –

+1

@Doc depende de cómo quiera usar esta tabla.Si es solo una mesa, sí, exagerado. Si no, lo anterior es una respuesta legítima. – Finglas

+0

Tengo una fuerte sensación de que incluso si el OP quiere más que una mesa, esta solución es excesiva. Y para agregar un 'Giant', uno tiene que agregar dos clases: un Giant y un GiantDecorator, por lo que el bonus # 2 es incorrecto. –

0

puede utilizar 2 mapas (mapa en java, en otros idiomas puede tener otro nombre): 1 para

Attacking-->Defending y uno para Defending-->Attacking.

Consideremos atacar -> Ejemplo de defensa. El mapa contendrá tipos de ataques como claves y matrices de tipos defensores como valores. Por ejemplo:

Fuego -> [Fuego, Agua, Planta, Hielo, Insecto, Roca, Dragón, Acero]

+0

He editado una falta de ortografía menor, a menos que realmente haya querido decir * defender * de lo que me disculpo. :( –

+1

@Anthony No puedo editar su comentario, pero creo que quería decir "entonces". –

0

Si usted tiene una clase separada para cada "cosa" que estos tipos calificar (su pokemon o lo que sea) las clases podrían contener una estructura hash/mapa/diccionario estática que da qué multiplicadores hay para atacar a los demás. Tal hash representaría una fila de la tabla. Si realmente necesita la búsqueda inversa, simplemente haga una más que almacene la columna de información.

1

Un diccionario usa los nombres del atacante (Fuego, Hielo, etc.) como clave que contiene diccionarios que usan los nombres del defensor como claves y los multiplicadores como valores.

3

Es un problema básico de despacho múltiple. Desafortunadamente, la mayoría de los idiomas no admiten envíos múltiples.

Así que probablemente usaría un mapa de mapas. El mapa externo asigna ataques a mapas de defensas, que a su vez mapean defensas a puntajes/efectos/lo que sea.

Puede usar el patrón Visitor, pero eso se vuelve engorroso rápidamente.

En Python, suponiendo que no está utilizando mucha subclasificación (por ejemplo, no hay subclases de Ice), puede utilizar un diccionario de mapeo (attack,defense) tuplas para calificar. Esa sería una solución bastante limpia y sería compatible con una variedad de idiomas (todo lo que necesita es una clase Pair y la capacidad de representar tipos de ataque como objetos, ya sea a través de un objeto de clase o algo así como una enumeración).

+0

gracias, estaba pensando en esto, pero no me sentía limpio – Timmy

7

Por qué hacerlo tan complicado - En aras del mantenimiento, haga que se vea como se ve. Una matriz bidimensional funcionará bien y, dado que es estática, le proporcionará el mejor rendimiento de búsqueda: solo necesita un camino para pasar de Nombre/Tipo a índice de matriz.

+0

gracias, omito la solución de matriz, pero no sé si hay fue un mejor diseño por ahí – Timmy

0

Un patrón de mediador podría hacer el truco. Es más una solución de capa media que una solución en clase.

http://www.dofactory.com/Patterns/PatternMediator.aspx

  • En el ejemplo anterior, Colleague será su Type.
  • ConcreteColleague0 habrá Normal, ConcreteColleague1 habrá Fire, ConcreteColleague2 habrá Water, ConcreteColleague3 habrá Grass ...
  • Mediator se proporciona una interfaz con el método de setAttacker(Type attacker), setDefender(Type defender) y fight(). Se todos implementarse en el ConcreteMediator. Significa que el defensor de atributo de clase y el atacante deben estar en el ConcreteMediator
  • ConcreteMediator ocultará la implementación de su matriz. Puede ser un mapa de mapa - diccionario de diccionario para algunos idiomas -. También puedo ser un solo mapa donde la clave está hecha de la concatenación de los tipos de atacante y defensor como factor["fire_fire"] = 0.5, factor["fire_water"] = 0.5, factor["water_fire"] = 2, etc. Si la asociación no existe en la matriz, entonces obtiene el factor por defecto 1. Además de obtener el factor de daño , puede aplicar daño.

OMI ventajas son:

  1. Si agregar un nuevo tipo, entonces se obtiene el factor de daño por defecto. Por lo tanto, agregar un nuevo tipo no implica desarrollo, excepto si el predeterminado no es suficiente.
  2. Usted puede hacer mucho más que obtener un factor de daño, puede aplicarlo y así sucesivamente.
  3. Podría desarrollar otras ConcreteMediator - es decir, relaciones - que pelear entre atacante y defensor. Por ejemplo, steal(), observe(), etc. Si agrega otros ajustadores al mediador, el alcance de las relaciones será más amplio.
Cuestiones relacionadas