2011-12-29 9 views
5

Scenariusz:
Chcę mieć wyliczenie zawierające wszystkie karty do gry w standardowej talii. W tym przykładzie zignoruj ​​jokery.Wylicz instancję wyliczeniową pętlą

Pisanie

enum Cards { 
    SPADE_1(0, 1), 
    SPADE_2(0, 2), 
    etc. 

czuje się źle.

Chciałbym móc zrobić coś takiego

enum Card { 
    for (int suit=0; suit<4; suit++) { 
     for (int face=1; face<13; face++) { 
      new Card(suit, face); 
     } 
    } 
} 

Mam badanym definiowania karty jako klasa zawierającym garnitur i twarz pól, gdzie garnitur i twarz są same teksty stałe. Jednak w innych scenariuszach (takich jak jokery o czerwonych i czarnych kolorach) pozwoliłoby to na tworzenie nieważnych obiektów kart (np. Jokera z brylantami lub czerwonego 10).

Self-odpowiedź:
Najwyraźniej nie mam wystarczającej liczby przedstawicieli, aby wysłać odpowiedź na moje własne pytanie.

 
I'm not sure if it's considered good form to answer my own question, but @Paul just gave me a brainwave. 

Declare Card to have a private constructor, and use a 
    static Card getCard(suit, face) 
method to validate combinations before returning them. 
+3

Być może 'enum' nie jest tym, czego chcesz. Czy naprawdę potrzebujesz odnosić się do 3 trefl jako CLUBS_3? – Paul

+0

Tak, absolutnie - prywatny konstruktor, oddzielne wyliczenia dla opcji SUIT i FACE. –

Odpowiedz

1

Nie sądzę, można to zrobić za pomocą enum ale możemy implementclass jak enum. możesz zrobić coś jak poniżej.

Wdrożenia:

public class Card { 
    private int suit; 
    private int face; 

    private Card(int suit, int face){ 
     this.suit = suit; 
     this.face = face; 
    } 

    public int getSuit(){ 
     return this.suit; 
    } 
    public int getFace(){ 
     return this.face; 
    } 
    public static Card[] cards = new Card[52]; 

     static{ 
     int counter =0; 
     for (int i=0; i<4; i++) { 
      for (int j=0; j<13; j++) { 
       cards[counter] = new Card(i, j); 
       counter++; 
      } 
     } 
     } 
} 

EDIT: ustawić counter karty. Wcześniej byłoby rzucić NullPointerException dla indeksu więcej niż 15.

USAGES:

System.out.println("face of the card:"+Card.cards[10].getFace()); 
System.out.println("suit of the card:"+Card.cards[10].getSuit()); 

WYJŚCIE:

face of the card:7 
suit of the card:3 
+0

Używałbym wyrażeń na garnitur i twarz, ale myślę, że publiczna, tylko do odczytu kolekcja w połączeniu z metodą get (face, suit) jest właściwą drogą. –

+0

możesz to zrobić w dowolny sposób (używając enum lub zwykłej klasy dla karty) zobacz metodę: publiczna instancja karty statycznej (pozycja rangi, kolor skafandra) ... w http://stackoverflow.com/questions/8626670/java- enum-or-encoding-with-numbers/8627079 # 8627079 –

0

powiedziałbym zrobić dwa stałe teksty: jeden dla każdej powierzchni, a drugi dla każdej karty. Tak więc w Card Enum każda enum ma dwie właściwości: liczbę kart (możesz zrobić jeszcze jedno wyliczenie, jeśli nie używasz w tym celu zwykłych liczb) i twarz, która jest instancją wyliczenia twarzy. To powinno rozwiązać problem.

+0

Wciąż będę musiał wyliczyć wszystkie 52 karty ręcznie, czego właśnie próbuję uniknąć. Chcę zmniejszyć ilość źródła dla łatwiejszego zrozumienia itd. –

0

Użyłem wyliczenia dla pozycji, koloru i karty, która wydawała się działać całkiem nieźle. zobacz tę odpowiedź dla kodu: Java: Enum or encoding with numbers?

+0

Ciężar zranienia palcem, z którym się łączysz jest dokładnie tym, czego staram się unikać –

Powiązane problemy