Получить значение из Enum в Java - PullRequest
0 голосов
/ 14 апреля 2020

Ниже приведены два класса колод и карт. они используются для игры в блэкджек, и поэтому я пытаюсь получить значения карт. значения в настоящее время хранятся в перечислении, однако я не могу понять, как получить значения из перечисления.

Вот шаги, которые я попробовал: 1. Создайте класс руки, который разыгрывает две карты из колоды, создав экземпляр класса и затем используя метод deck.deal. 2. Попытайтесь получить значения рангов из раздаемых карт. Вот где мой подход терпит неудачу. Я пытался получить значения из Enum, но я просто не могу получить к ним доступ. Например, если 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



    }


}

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Я разобрался с решением в конце. В основном модификаторы доступа были неправильными. в классе Card я изменил Rank и Suit на publi c, а затем смог получить доступ к getRankvalue.

0 голосов
/ 14 апреля 2020

Вы должны создать геттеры в классе Card для «Suit» и «Rank», чтобы получить к ним доступ, например:

public Suit getSuit() {
   return suit;
}

public Rank getRank() {
   return rank;
}

Теперь со своего основного вы можете позвонить:

myhand.getCard1().getSuit().getSuitValue();
or
myhand.getCard1().getRank().getRankValue();
...