2011-12-29 2 views
5

Сценарий:
Я хочу иметь перечисление, содержащее все игровые карты в стандартной колоде. В этом примере игнорируйте джокеров.Enumerate enum-instance with loop

Запись

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

чувствует себя неправильно.

Я хотел бы быть в состоянии сделать что-то вроде этого

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

Я рассмотрел определение карты в качестве класса, содержащего костюм и лицо полей, где костюм и лицо сам являются перечислениями. Однако в других сценариях (например, джокеров с красными и черными костюмами) это позволит создать недействительные объекты карты (например, шутник из бриллиантов или красный 10).

Самостоятельный ответ:
По-видимому, у меня недостаточно ответов, чтобы опубликовать ответ на мой вопрос.

 
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

Возможно, 'enum' - это не то, что вы хотите. Вам действительно нужно обратиться к 3 клубам как CLUBS_3? – Paul

+0

Да, абсолютно - частный конструктор, отдельные перечисления для SUIT и FACE. –

ответ

1

Я не думаю, что это может быть сделано с помощью enum, но мы можем implementclass в enum. вы можете сделать что-то вроде ниже.

Реализации:

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: установить counter карты. Ранее было бы бросить NullPointerException для индекса более 15.

USAGES:

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

ВЫВОД:

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

Я бы использовал перечисления для костюма и лица, но я думаю, что публичная доступная только для чтения коллекция в сочетании с методом get (face, suit) - это правильный путь. –

+0

вы можете сделать это в любом случае (используя enum или обычный класс для карты) см. Метод: публичный статический экземпляр карты (ранжирование, костюм костюма) ... в http://stackoverflow.com/questions/8626670/java- enum-or-encoding-with-numbers/8627079 # 8627079 –

0

Я бы сказал сделать два перечислений: один для каждого лица, и другой для каждой карты. Таким образом, в Card Enum каждое перечисление имеет два свойства: количество карточек (вы можете сделать еще одно перечисление, если вы не чувствуете использование простых чисел для этой цели), и лицо, которое является экземпляром переименования лица. Это должно решить проблему.

+0

Мне все равно придется перечислять все 52 карты вручную, чего я пытаюсь избежать. Я хочу уменьшить количество источников для более легкого понимания и т. Д. –

0

Я использовал перечисление для ранга, костюма и карты, которые, казалось, работали достаточно хорошо. см. этот ответ для кода: Java: Enum or encoding with numbers?

+0

Тому пальца, с которым вы связаны, именно то, что я пытаюсь избежать –