2011-12-29 37 views
5

Senaryo:
Tüm oyun kartlarını standart bir güvertede içeren bir numaraya sahip olmak istiyorum. Bu örnek için jokerleri göz ardı edin. YazmaDöngü numaralarını döngü ile numaralandır

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

yanlış geliyor.

ben takım elbise ve yüz kendilerini çeteleler olan takım elbise ve yüz alanları içeren bir sınıf olarak kart tanımlayan kabul ettik bu

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

gibi bir şey yapabilmek istiyorum. Ancak diğer senaryolarda (örneğin kırmızı ve siyah takım elbise sahip olan jokerlerde) bu, geçersiz kart nesnelerinin oluşturulmasına izin verir (örneğin, elmasların jokerleri veya kırmızı bir 10).

Kendini yanıtlayın:
Görünüşe göre kendi sorumu yanıtlamak için yeterli sayıda yanıtım yok.

 
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

Belki de bir 'enum' istediğin şey değildir. CLUBS_3 olarak 3 kulübe başvurmanız gerekiyor mu? – Paul

+0

Evet, kesinlikle - özel kurucu, SUIT ve FACE için ayrı enumlar. –

cevap

1

Ben enum kullanılarak yapılabilir sanmıyorum ama biz enum olarak implementclass can. Aşağıdakine benzer bir şey yapabilirsin.

Uygulamalar:

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++; 
      } 
     } 
     } 
} 

DÜZENLEME: kartının counter ayarlayın. Daha önceki dizin için NullPointerException atardı fazla 15.

USAGES:

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

ÇIKIŞ:

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

Enil'leri takım elbise ve yüz için kullanırdım, ama bence (yüz, takım) yöntemi ile birleştirilmiş ortak bir salt okunur koleksiyon gitmek için doğru yol. –

+0

her iki şekilde de yapabilirsiniz (bir kart için enum veya düz sınıf kullanarak) yönteme bakın: http://stack.google.com/support/8626670/java- adresindeki genel statik Kart örneği (Sıra sırası, Takım elbise) ... enum-or-kodlama-ile-sayılar/8627079 # 8627079 –

0

İki Çeteleler yapmak söyleyebilirim: Her yüz için bir ve her kart için diğeri. Bu nedenle, Card Enum'da her bir enumun iki özelliği vardır: kart sayısı (bu amaç için sade sayılar kullanmıyorsanız başka bir numara oluşturabilirsiniz) ve yüz enumunun bir örneği olan yüz. Bu sorunu çözmek gerekir.

+0

Hala 52 kartını manuel olarak numaralandırmak zorunda kalacağım, bu kaçınmaya çalışıyorum. Kolay anlaşılırlık vb. Için kaynak miktarını azaltmak istiyorum. –

0

Oldukça iyi çalışıyor gibi görünen sıra, takım ve kart için bir numara kullandım. Bu cevabı şu kod için bakın: Java: Enum or encoding with numbers?

+0

Bağlandığınız parmak incinmesi, kaçınmak istediğim şeydir. –