Wdrażam prostą grę "Zagraj w swoje karty w prawo" (zwaną inaczej wyższą/niższą). Jeśli nie natkniesz się na to, zanim zasady będą naprawdę proste. Wykorzystywany jest jeden zestaw kart (na przykład kier). Jedna karta jest losowana na raz, a celem jest prawidłowe odgadnięcie, czy wartość nominalna następnej karty będzie wyższa lub niższa od wartości nominalnej poprzednio pobranej karty.Java - Porady dotyczące projektowania prostych gier
Logika gry nie jest szczególnie skomplikowana, nie martwię się o to. Wymyśliłem projekt, ale nie jestem z niego całkowicie zadowolony. Jest kilka obszarów, w których jestem pewien, że można je ulepszyć, i to jest to, co chciałbym uzyskać od twojej porady. Oto interfejs dla klasy (komentarze do dodatkowego porozumienia, a nie prawdziwe komentarze):
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);
}
Jak widać to wszystko jest dość oczywista i prosta. Oto moje problemy:
Nie chcę, aby konstruktor automatycznie narysował kartę. Oznacza to, że początkowo nie ma "poprzednio narysowanej karty". Mam wartość NO PREDICTION
w enum Prediction
, ale ponieważ nie ma "wcześniej narysowanej karty", metody nie mogą zwracać prawidłowych wartości (nie mogą również zwracać normalnych wartości, gdy wszystkie karty z talii zostały narysowane).
Oczywiście mógłbym po prostu wyrzucić wyjątek, ale to wydaje się przesadą - zwłaszcza, że wtedy wszystkie wywołania metod muszą być zapakowane w try/catches. Jestem również niezadowolony z tego, że zwracam wartość ujemną, ponieważ może to łatwo doprowadzić do błędów, jeśli ktoś zapomni/nie będzie mógł się tym zająć.
Wszystkie sugestie są mile widziane!
Nie wydaje mi się, aby obie metody zwracały "card.count" w tym przypadku. To rozwiązanie sugerowałoby, że jest 13 kart wyższych i 13 kart niższe, co oznacza, że 26 kart jest ogólnie dostępnych, mimo że w grze jest tylko 13 kart w grze. Chociaż wiemy, co się dzieje, wyobraź sobie prezentowanie tej informacji użytkownikowi. Wydaje się to być bardzo niesatysfakcjonującym zachowaniem. – Peter
@Peter: Moje rozumowanie jest następujące: karta jest zarówno niższa, jak i wyższa niż brak karty. Jest to jedna z tych sytuacji, w których dwa przeciwstawne stany są równe w odniesieniu do pojęcia nicości. Nie wydaje mi się to sprzeczne z intuicją, ale to tylko moja opinia. Gdy nie ma już kart, obie powinny zwrócić 0, więc na tym etapie będą równe. Na początku oba powinny zwracać przeciwne 0, w tym przypadku card.count. – JRL