从Java枚举中检索值

问题描述 投票:0回答:1

下面是Deck和Card这两个类。这些被用于二十一点游戏,因此我试图获取卡的价值。值当前存储在枚举中,但是我似乎无法弄清楚如何从枚举中获取值。

以下是我尝试过的步骤:1.通过创建该类的实例,然后使用方法deck.deal,创建一个从卡片组中发出两张牌的手牌类。2.尝试从已发牌中获得等级值。这是我的方法失败的地方。我试图从枚举中获取值,但是我似乎无法访问它们。例如,如果deck.deal给了我5个俱乐部和6个红心,我似乎无法得到这些卡并运行Rank.getvalues方法。

这里最好的方法是什么?

public class Deck {

    private final Stack<Card> deckCards;


    public Deck() {
        this.deckCards = initDeck();
    }

    private Stack<Card> initDeck() {

        final Stack<Card> deckCards = new Stack<>();
        for (final Card.Suit suit : Card.Suit.values()) {
            for (final Card.Rank rank : Card.Rank.values()) {
                deckCards.push(Card.getCard(rank, suit));
            }
        }
        Collections.shuffle(deckCards);
        return deckCards;
    }

    public Optional<Card> deal() {
        return this.deckCards.empty() ? Optional.empty() :
                Optional.of(this.deckCards.pop());
    }

}
public class Card implements Comparable <Card> {

    private final Rank rank;
    private final Suit suit;

    private final static Map<String, Card> Card_Cache = initCache();

    public static Map<String, Card> initCache(){
        final Map<String, Card> cache = new HashMap<>();
        for(Suit suit: Suit.values()){
            for(Rank rank: Rank.values()){
                cache.put(cardKey(rank, suit), new Card(rank,suit));
            }
        }

        return Collections.unmodifiableMap(cache);
    }

    public static Card getCard (final Rank rank, final Suit suit){

        final Card card = Card_Cache.get(cardKey(rank, suit));

        if(card != null){
            return card;
        }

        throw new RuntimeException("Invalid card!");

    }

    private static String cardKey(final Rank rank, final Suit suit) {
        return rank + " of " + suit;
    }

    public Card(Rank rank, Suit suit) {
        this.rank = rank;
        this.suit = suit;
    }

    @Override
    public String toString() {
        return String.format("%s of %s", this.rank, this.suit);
    }

    @Override
    public int compareTo(Card o) {
        final int rankComparison = Integer.compare(this.rank.getRankValue(), o.rank.getRankValue());

        if(rankComparison != 0){

        }
        return Integer.compare(this.suit.getSuitValue(), this.suit.getSuitValue());
    }

    enum Suit{
        diamonds(1),
        clubs(2),
        hearts(3),
        spades(4);


        private final int suitValue;

        Suit(final int suitValue){
            this.suitValue = suitValue;
        }

        public int getSuitValue(){
            return this.suitValue;
        }

    }

    enum Rank{two(2), three(3), four(4), five(5), six(6),
        seven(7), eight(8), nine(9), ten(10), jack(11),
        queen(12), king(13), ace(14);

        private final int rankValue;

        Rank(final int rankValue){
            this.rankValue = rankValue;
        }



        public int getRankValue(){
            return this.rankValue;
        }

    }

public class Hand {

    private Optional<Card> card1;
    private Optional<Card> card2;
    Deck mynewdeck = new Deck();

    public Hand() {
        this.card1 = mynewdeck.deal();
        this.card2 = mynewdeck.deal();
    }

//    public String getvalue(){
//        get
//    }

    public Optional<Card> getCard1() {
        return card1;
    }

    public void setCard1(Optional<Card> card1) {
        this.card1 = card1;
    }

    public Optional<Card> getCard2() {
        return card2;
    }

    public void setCard2(Optional<Card> card2) {
        this.card2 = card2;
    }
}

下面是我的主班。其中包含一系列尝试(似乎都无效),以访问Hand类给我的牌的等级值。希望这可以使我的尝试和方法更加清晰

public class Main {


    public static void main(String[] args) {

        Hand myhand = new Hand();



        System.out.println(myhand.getCard1());
        System.out.println(myhand.getCard2());
        System.out.println(myhand.getCard1(Card.Rank.valueOf();// incorrect

        Card mytestcard = new Card(Card.Rank.seven, Card.Suit.spades);
        System.out.println("this is the card value " + Card.Rank.valueOf(Card.Rank.seven.toString()));
        // incorrect


        String myfirstcard = (myhand.getCard1().toString()); // incorrect
        System.out.println(Card.Suit.valueOf(myfirstcard)); // incorrect



    }


}
java class enums blackjack trygetvalue
1个回答
0
投票

您应该在Card类中为“ Suit”和“ Rank”创建吸气剂以访问它们,例如:

public Suit getSuit() {
   return suit;
}

public Rank getRank() {
   return rank;
}

现在您可以从您的主要联系人打电话:

myhand.getCard1().getSuit().getSuitValue();
or
myhand.getCard1().getRank().getRankValue();
© www.soinside.com 2019 - 2024. All rights reserved.