Un juego solitario de cartas

Como ya vimos con el juego de la serpiente, el diseño de un juego, como el de cualquier aplicación, requiere cierto trabajo de análisis. De hecho esta fase suele ser la más importante y la más difícil.

Tenemos que diseñar el juego sobre el papel, prever todos los posibles problemas y resolverlos antes de empezar a programar.

El juego

Juego del Solitario
Juego del Solitario Con Clase

Como ejemplo haremos un solitario que normalmente se juega con una baraja española de cuarenta cartas, pero que también puede jugarse con una baraja francesa. De ella sólo tomaremos las cartas del as al siete y las figuras.

El objetivo del juego, como en casi todos los solitarios, es extraer los cuatro palos ordenadamente del as al rey. Para ello partimos del mazo de cartas boca abajo y disponemos de cuatro pilas de trabajo, que en la posición de partida tendrá una carta boca arriba cada una. También dispondremos de un montón, donde se irán acumulando, también boca arriba, las cartas que no podamos colocar. Finalmente existirán cuatro pilas de salida en las que iremos colocando las cartas ordenadas, un palo en cada pila. Las cartas del montón también se pueden colocar en las pilas de trabajo o en las de salida.

Iremos extrayendo cartas del mazo una a una directamente al montón. La carta en la cima del montón podrá ser movida a la pila de salida, si es un as o si la carta anterior ya está en la pila. También podrá moverse a una de las pilas de trabajo, si hay una carta de valor numérico inmediatamente superior de diferente palo, por ejemplo, el tres de trébol podrá colocarse sobre el cuatro de picas, pero no sobre el cuatro de trébol.

Desde las pilas de trabajo, podrá moverse la carta de la cima a otra pila de trabajo o a la pila de salida, si es posible. No podrán moverse cartas de las pilas de trabajo al montón. Tampoco se podrán mover cartas de las pilas de salida al montón ni la las pilas de trabajo.

En resumen, los movimientos posibles son:

  • Del mazo al montón.
  • Del montón a:
    • Pila de salida, si es un as (a una pila de salida vacía) o si en la pila de salida está el naipe anterior del mismo palo.
    • Pila de trabajo, si está vacía o si contiene un naipe con un número una unidad mayor y de diferente palo.
  • De una pila de trabajo a:
    • Pila de salida, si es un as (a una pila de salida vacía) o si en la pila de salida está el naipe anterior del mismo palo.
    • Pila de trabajo, si está vacía o si contiene un naipe con un número una unidad mayor y de diferente palo.

Cualquier otro movimiento no se puede realizar.

Implementación

Intentaremos que la implementación del juego esté completamente separada de la implementación gráfica. Es decir, ninguna clase que contenga mecanismos del juego contendrá instrucciones para la representación gráfica ni para la captura de acciones del usuario.

La idea es que el algoritmo del juego se pueda extraer y ajustar a otras estructuras de clases que implementen los interfaces de entrada y salida, sin que tenga que ser modificado.

Aplicando POO esto debería ser posible (aunque no tiene por qué ser fácil).