Texas Hold' em识别出一对

时间:2013-01-21 21:25:46

标签: java arraylist poker

我的程序在首次检查两对之后才识别出一对,我遇到了问题。首先检查一对时它发现没问题。但是当我首先检查这两对时,检查一对它找不到它。任何帮助将不胜感激。

package card.game.simulator;

import java.util.ArrayList;

public class RankingUtility {
private RankingEnum rank;

public String getRankOfHand(ArrayList<Card> hand) {
    System.out.printf("%s\n", hand.toString());
    ArrayList<Card> rankingCards = getTwoPair(hand);
    if(rankingCards != null) {
        return "Two Pair!";
    }
    System.out.printf("%s\n", hand.toString());
    rankingCards = getOnePair(hand);
    if(rankingCards != null) {
        return "One Pair!";
    }
    System.out.printf("%s\n", hand.toString());
    return "You got nuthin...";
}

public boolean isSameSuit(ArrayList<Card> hand) {
    CardSuitEnum suit = hand.get(0).getSuit();
    for(Card card : hand) {
        if(card.getSuit() != suit) {
            return false;
        }
    }
    return true;
}

public ArrayList<Card> checkPair(ArrayList<Card> hand) {
    ArrayList<Card> checkedPair = new ArrayList<>();
    for(Card card1 : hand) {
        checkedPair.add(card1);
        for(Card card2 : hand) {
            if(!card1.equals(card2) && card1.getFace().equals(card2.getFace())) {
                checkedPair.add(card2);
                return checkedPair;
            }
        }
        checkedPair.clear();
    }
    return null;
}

public ArrayList<Card> getTwoPair(ArrayList<Card> hand) {
    ArrayList<Card> twoPair = new ArrayList<>();
    ArrayList<Card> checkedPair = checkPair(hand);
    if(checkedPair != null) {
        twoPair.addAll(checkedPair);
        hand.removeAll(checkedPair);
    }
    checkedPair = checkPair(hand);
    if(checkedPair != null) {
        twoPair.addAll(checkedPair);
        return twoPair;
    }
    return null;
}

public ArrayList<Card> getOnePair(ArrayList<Card> hand) {
    return checkPair(hand);
}
}

3 个答案:

答案 0 :(得分:5)

checkTwoPair你正在做hand.removeAll()。这是从基础ArrayList中删除它。这就是你之后没有找到它的原因。

答案 1 :(得分:3)

问题在于,在寻找两对时,您正在修改hand

   hand.removeAll(checkedPair);

因此当getTwoPair()完成时,唯一的一对已从手中删除,checkPair()不再有效。

您需要getTwoPair()非侵入性。

或者,您可以将两种方法合并为一种,根据已找到的对数,返回零,两张或四张卡片。

答案 2 :(得分:0)

当您运行getTwoPair时,您执行的第一个操作是checkPair(hand);这会找到该对(您想要的那个)将其删除,然后再次尝试检查。当此检查失败时,它将返回。

在返回之后,你留下(1)一对移除了对的手,以及(2)从getTwoPair返回的空值。这个结果会让你有一个条件导致主流继续,但由于它已被删除,因此无法找到单个对。

我建议制作要搜索的数组列表的副本。如果找不到两对,只需返回原始数组即可。如果找到两对,则返回修改后的数组。