Estoy implementando un juego simple "Juega tus cartas correctamente" (también conocido como juego superior/inferior). En caso de que no te hayas encontrado antes, las reglas son realmente simples. Se usa un solo palo de cartas (por ejemplo, corazones). Se saca una carta a la vez y el objetivo es adivinar correctamente si el valor facial de la siguiente carta será mayor o menor que el valor facial de la carta dibujada previamente.Java - Consejos de diseño para el juego simple
La lógica del juego no es particularmente compleja, no me preocupa eso. Se me ocurrió un diseño, pero no estoy del todo contento con él. Hay algunas áreas en las que estoy seguro de que podría mejorarse, y en eso me gustaría que me aconsejara. Aquí está una interfaz para la clase (comentarios adicionales para la comprensión, los comentarios no reales):
public interface PlayYourCardsRight {
/**
* Get the number of cards remaining with higher face values than the previously
* drawn card
* @return
*/
public abstract int getNumberCardsHigher();
/**
* Get the number of cards remaining with lower face values than the previously
* drawn card
* @return
*/
public abstract int getNumberCardsLower();
/**
* Get all cards that have already been drawn in the order they were drawn in
*
*/
public abstract List<Card> getPlayedCards();
/**
* Simple prediction algorithm - if there are more cards left in the deck with
* lower face values than the previous card, then predict 'Lower', if there
* are more cards left in the deck with higher face values then predict
* 'Higher', if there are equal numbers of higher/lower cards pick 'higher' or 'lower'
* at random
*
* Prediction is an Enum (Higher/Lower/None)
*
*/
public abstract Prediction getPrediction();
/*
* Draw the next card at random
*/
public abstract void nextRound();
/**
* Specifiy what the next card should be
*
* @param card
*/
public abstract void nextRound(Card card);
}
Como se puede ver que es todo bastante explica por sí mismo y simple. Aquí están mis problemas:
No quiero que el constructor dibuje automáticamente una tarjeta. Esto significa que inicialmente no hay una "tarjeta dibujada previamente". Tengo un valor NO PREDICTION
en la enumeración Prediction
pero, como no hay una "tarjeta dibujada previamente", los métodos getNumberCardsHigher()
y getNumberCardsLower()
no pueden devolver valores sanos (tampoco pueden devolver valores sanos cuando se han dibujado todas las cartas del mazo).
Obviamente, podría simplemente lanzar una excepción, pero eso parece exagerado, especialmente porque todas las llamadas a los métodos tienen que ser envueltas en try/catch. Tampoco estoy contento con devolver un valor negativo, ya que eso podría generar fácilmente algunos errores si alguien olvida o no puede controlarlos.
Todas las sugerencias son bienvenidas!
No creo que tenga ningún sentido que ambos métodos devuelvan 'card.count' en este caso. Esta solución sugeriría que hay 13 cartas más altas y 13 cartas más bajas, lo que implica 26 cartas en general, a pesar de que solo hay 13 cartas en un palo y en el juego. Aunque sabemos lo que está pasando, imaginamos presentar esta información a un usuario. Parece un comportamiento profundamente insatisfactorio. – Peter
@Peter: mi razonamiento es el siguiente: una tarjeta es más baja y más alta que la ausencia de una tarjeta. Esta es una de esas situaciones donde dos estados opuestos son iguales con respecto al concepto de la nada. No parece contradictorio para mí, pero esa es solo mi opinión. Cuando no quedan cartas, ambas deberían devolver 0, por lo que también serían iguales en esa etapa. Al principio, ambos deberían devolver el opuesto de 0, en este caso card.count. – JRL