Sto implementando un semplice gioco "Gioca a carte a destra" (altrimenti noto come superiore/inferiore). Nel caso in cui non l'abbia incontrato prima che le regole siano davvero semplici. Viene utilizzato un singolo seme di carte (ad esempio cuori). Una carta viene pescata alla volta e l'obiettivo è quello di indovinare correttamente se il valore nominale della carta successiva sarà superiore o inferiore al valore nominale della carta precedentemente pescata.Java - Consigli di progettazione per il gioco semplice
La logica del gioco non è particolarmente complessa, non ne sono preoccupato. Ho ideato un design, ma non ne sono completamente soddisfatto. Ci sono alcune aree in cui sono sicuro che potrebbe essere migliorato, ed è quello che vorrei ricevere il tuo consiglio. Ecco un'interfaccia per la classe (commenti per la comprensione ulteriore, non reale i commenti):
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);
}
Come si può vedere è tutto piuttosto intuitivo e semplice. Ecco i miei problemi:
Non voglio che il costruttore disegni automaticamente una carta. Ciò significa che inizialmente non esiste una "carta precedentemente disegnata". Ho un valore Prediction
nell'enumerazione Prediction
ma, poiché non esiste una "carta disegnata in precedenza", i metodi getNumberCardsHigher()
e getNumberCardsLower()
non possono restituire valori sensati (non possono anche restituire valori sani quando sono state disegnate tutte le carte del mazzo).
Ovviamente, potrei semplicemente lanciare un'eccezione, ma ciò sembra eccessivo, soprattutto perché tutte le chiamate ai metodi devono essere racchiuse in try/catches. Sono anche scontento di restituire un valore negativo, poiché ciò potrebbe facilmente portare ad alcuni errori se qualcuno dimentica/non può essere disturbato a controllarli.
Tutti i suggerimenti sono benvenuti!
Non penso abbia senso per entrambi i metodi restituire 'card.count' in questo caso. Questa soluzione suggerirebbe che ci sono 13 carte più in alto e 13 carte in meno, il che implica 26 carte in totale, anche se ci sono solo 13 carte in un seme e nel gioco. Anche se sappiamo cosa succede immaginiamo di presentare queste informazioni a un utente. Sembra un comportamento profondamente insoddisfacente. – Peter
@Peter: il mio ragionamento è il seguente: una carta è sia inferiore sia superiore all'assenza di una carta. Questa è una di quelle situazioni in cui due stati opposti sono uguali rispetto al concetto di nulla. Non mi sembra affatto intuitivo, ma è solo la mia opinione. Quando non ci sono più carte, entrambi dovrebbero restituire 0, quindi anche in quel momento sarebbero uguali. All'inizio, dovrebbero quindi restituire entrambi il contrario di 0, in questo caso card.count. – JRL