【问题标题】:Java - How to evaluate the best high card hand?Java - 如何评估最好的高牌手?
【发布时间】:2019-01-28 05:11:59
【问题描述】:

我正在制作一个扑克应用程序。然而,我坚持评估高卡。 (我知道怎么拿高牌,但是如果2/3玩家的高牌一样呢?)

我的清单是有序的,所以这不是问题。问题是我不知道将 5 张牌与其他玩家的手牌进行比较的好方法。

是的,卡片按rankComparator 类排序。

我有一个简单的Player 类,其中包含一组卡片(他的手):

public class Player {

    private List<Card> cards;
    private int valueWaarde;
    private String valueAsString;
    private String name;
    private HandEval1 h1;

    public String getValueAsString() {
        return valueAsString;
    }


    public Integer getValueWaarde() {
        return valueWaarde;
    }

    public List<Card> getCards() {
        return cards;
    }

    public Player(String name){
        this.name = name;
    }

    public Player() {
    }

    public void addCard(Card c) {
        if (cards == null) {
            this.cards = new ArrayList<>();
        }

        this.cards.add(c);
    }

    public void clearCards() {
        if (cards != null) {
            cards.clear();
        }
    }

    public Map<String, Integer> valueOfHand(List<Card> cards, List<Card> cardsBoard) {
       h1 = new HandEval1(cards, cardsBoard);
       Map<String, Integer> map = h1.evaluateHand();

        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            this.valueWaarde = entry.getValue();
            this.valueAsString = entry.getKey();
        }

       return map;
    }


    @Override
    public String toString() {
        return name;
    }

}

我有一个简单的卡片类如下:

public class Card {

    private final int suitValue;
    private Rank rank;
    private Suit suit;
    private int value;

    public int getSuitValue() {
        return suitValue;
    }

    public int getValue() {
        return value;
    }

    public Rank getRank() {
        return rank;
    }

    public Suit getSuit() {
        return suit;
    }

    public enum Suit {
        h(1), c(2), d(3), s(4);

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

    public enum Rank {
        ACE(1),TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9), TEN(10),
        JACK(11), QUEEN(12), KING(13);

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

    //Constructor
    public Card(Rank rank, Suit suit){
        this.rank = rank;
        this.suit = suit;
        this.value = rank.value;
        this.suitValue = suit.value;
    }

    // methods
    public static String rankAsString(int rank){
        return String.valueOf(Rank.values()[rank ]);
    }
    public static String suitAsString(int suit){
        return String.valueOf(Suit.values());
    }

    public String getFilename()
    {
        return "resource/Cards/" + rank.value + suit + ".gif";
    }
}

我有一门课来评估我的手,“现在什么都没有了。”:

// This is my comparator class:

public class rankComparator implements Comparator<Card> {
    @Override
    public int compare(Card card1, Card card2) {

        if (card1.getRank() == card2.getRank()) {
            return card1.getSuit().compareTo(card2.getSuit());
        }
        return card1.getRank().compareTo(card2.getRank());
    }
}

【问题讨论】:

  • 我不会为你解决,因为你很亲密,但我可以给你一个提示。在你的 Card 类中实现 Ordering 接口,之后你就可以对卡片数组进行排序了
  • 我的清单是有序的。这不是问题,问题是我不知道有什么好方法可以将 5 张牌与其他玩家进行比较
  • 喜欢比较两个列表?
  • 没错!比较 2 个 ( "Integers" ) 列表,
  • 你知道如何比较两张卡片列表

标签: java poker


【解决方案1】:

您可以向 RankSuit 枚举添加一个方法,以便轻松检索枚举的 int 值。例如,您的 Rank 枚举可能是这样的:

public enum Rank {
    ACE(1),TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9), TEN(10),
    JACK(11), QUEEN(12), KING(13);

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

    public int getValue() { // Added method
        return value;
    }
}

那么您可以执行以下操作来根据他们的等级比较两只手:

public void calculateGreaterHand(List<Card> cards1, List<Card> cards2) {
    for (int i = 0; i < cards1.size(); i++) {
        if (cards1.get(i).getRank().getValue() > cards2.get(i).getRank().getValue()) {
            System.out.println("cards1 is greater");
            return;
        } else if (cards1.get(i).getRank().getValue() < cards2.get(i).getRank().getValue()) {
            System.out.println("cards2 is greater");
            return;
        }
    }
    // If code gets to this point, then the hands are equal.
}

如果这与您正在寻找的相似,请告诉我。

【讨论】:

  • 它与我正在寻找的相似。谢谢你的时间,我可以继续前进。你把我引向了正确的方向。
  • @TheRealCodeGuy 没问题。我正在向我的帖子中添加一些可能会有所帮助的内容。
  • 王牌不应该是最高的,而不是最低的吗?
  • @PaulSamsotha 它可能是最低的或最高的。在这种情况下,这取决于 OP。
  • 仅比较高牌时,A 总是被视为高牌。唯一的例外是在一些低牌或高低牌扑克游戏中,A 将被视为低牌。
【解决方案2】:

即使这只是一个爱好项目,您也可能迟早要站出来评估/比较所有可能的牌手,而不仅仅是高牌手。

这是great article about evaulating poker hands,它也有来源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多