Ниже приведены два класса колод и карт. они используются для игры в блэкджек, и поэтому я пытаюсь получить значения карт. значения в настоящее время хранятся в перечислении, однако я не могу понять, как получить значения из перечисления.
Вот шаги, которые я попробовал: 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
}
}