Java如何返回枚举值和名称(卡片)

时间:2017-05-17 02:58:18

标签: java oop enums playing-cards

我正在创建一个二十一点游戏,我试图找出如何处理该卡并让它显示价值和名称。我选择两个属性的原因纯粹是基于逻辑的,当涉及到将Ace作为1或11时,Haven已经达到了这一点,但我只想知道如果有人想知道的话。这是我到目前为止所拥有的。我感谢任何帮助!我将错误列为以下评论

import java.util.Random;
public class CardDeck {
public enum Cards {
    ACE_SPADES (1, 11),
    ACE_HEARTS (1, 11),
    ACE_CLOVES (1, 11),
    ACE_DIAMONDS (1, 11),
    TWO_SPADES (2, 2),
    TWO_HEARTS (2, 2),
    TWO_CLOVES (2, 2),
    TWO_DIAMONDS (2, 2),
    THREE_SPADES (3, 3),
    THREE_HEARTS (3, 3),
    THREE_CLOVES (3, 3),
    THREE_DIAMONDS (3, 3),
    FOUR_SPADES (4, 4),
    FOUR_HEARTS (4, 4),
    FOUR_CLOVES (4, 4),
    FOUR_DIAMONDS (4, 4),
    FIVE_SPADES (5, 5),
    FIVE_HEARTS (5, 5),
    FIVE_CLOVES (5, 5),
    FIVE_DIAMONDS (5, 5),
    SIX_SPADES (6, 6),
    SIX_HEARTS (6, 6),
    SIX_CLOVES (6, 6),
    SIX_DIAMONDS (6, 6),
    SEVEN_SPADES (7, 7),
    SEVEN_HEARTS (7, 7),
    SEVEN_CLOVES (7, 7),
    SEVEN_DIAMONDS (7, 7),
    EIGHT_SPADES (8, 8),
    EIGHT_HEARTS (8, 8),
    EIGHT_CLOVES (8, 8),
    EIGHT_DIAMONDS (8, 8),
    NINE_SPADES (9, 9),
    NINE_HEARTS (9, 9),
    NINE_CLOVES (9, 9),
    NINE_DIAMONDS (9, 9),
    TEN_SPADES (10, 10),
    TEN_HEARTS (10, 10),
    TEN_CLOVES (10, 10),
    TEN_DIAMONDS (10, 10),
    JACK_SPADES (10, 10),
    JACK_HEARTS (10, 10),
    JACK_CLOVES (10, 10),
    JACK_DIAMONDS (10, 10),
    QUEEN_SPADES (10, 10),
    QUEEN_HEARTS (10, 10),
    QUEEN_CLOVES (10, 10),
    QUEEN_DIAMONDS (10, 10),
    KING_SPADES (10, 10),
    KING_HEARTS (10, 10),
    KING_CLOVES (10, 10),
    KING_DIAMONDS (10, 10);

    public final int faceValue1;
    public final int faceValue2;

    private Cards(int faceValue1, int faceValue2) {
        this.faceValue1 = faceValue1;
        this.faceValue2 = faceValue2;
    }

    public String toString() {    //  error: non-static method name() cannot 
                                         be referenced from a static context
        return Cards.name();
    }

    public int getFaceValue1() {
        return faceValue1;
    }

    public int getFaceValue2() {
        return faceValue2;
    }
}
Cards[] deck;

public CardDeck() {
    deck = new Cards[52];
    int i = 0;
    while(i<52) {
        for(Cards card : Cards.values()) {
            deck[i] = card;
            i++;
        }
    }
    shuffle(deck);                              
}
//This will return the first card after shuffling.
public Cards deal() {
    Cards[] cardReturn = new Cards[1];
    cardReturn[0] = deck[0];                 
    Cards[] tempArr = new Cards[deck.length - 1];    
    for(int i=1; i<deck.length; i++) {
        tempArr[i-1] = deck[i];         
    }
    deck = new Cards[tempArr.length];    
    deck = tempArr;                      
    return cardReturn[0];
} 

//this shuffles the deck
public void shuffle(Cards[] deckToShuffle) {
    int index;
    Cards[] temp = new Cards[1];
    Random random = new Random();
    for (int i = deckToShuffle.length - 1; i > 0; i--) {
        index = random.nextInt(i + 1);
        temp[0] = deckToShuffle[index];     
        deckToShuffle[index] = deckToShuffle[i];
        deckToShuffle[i] = temp[0];     
      }
     deck = deckToShuffle;
}       
}

1 个答案:

答案 0 :(得分:2)

简单:不要打电话

 Cards.name()

但只是

 name() 

获取您的返回值。

除此之外:你做得太过分了。你想要两个枚举,一个用于卡片值,一个用于卡片套件。然后你有一个卡片类,有两个字段来保持价值和适合。

在一个枚举中将所有值的时间设置为4,这将使您的代码变得比它应该的复杂得多。

将值字段设为public并使用getter方法也没有意义。更好地将领域变为私有。

最后,我不喜欢将它们称为面值1和2的命名。但我现在没有更好的主意。