扑克程序顺子检测异常:判断方法始终返回false
嘿,碰到顺子检测一直返回false的问题确实头疼,我帮你梳理几个常见的排查方向和解决思路!
排查扑克程序顺子检测失效的核心方向
1. 先确认手牌是否做了排序
顺子检测的核心是判断点数连续,如果手牌没按点数排序,直接遍历判断肯定会出错。比如手牌是[5,10,7,6,8],没排序的话会被误判为非顺子,但排序后[5,6,7,8,10](举个正确顺子例子:[5,7,6,8,9],排序后就是连续的)。
先检查你的顺子检测方法里有没有排序逻辑,如果没有,先加上:
// 假设Card类有getRank()返回点数(比如2-14,A设为14) Arrays.sort(hand, (card1, card2) -> Integer.compare(card1.getRank(), card2.getRank()));
2. 别忘了处理A-low顺子的特殊情况
很多扑克规则里,A可以当最小牌组成A-2-3-4-5的顺子,但如果你的A点数设为14,排序后会变成[2,3,4,5,14],常规连续判断会认为不是顺子。这时候要单独加这个边界判断:
boolean isStraight = true; // 常规顺子判断:相邻点数差1 for (int i = 0; i < hand.length - 1; i++) { if (hand[i+1].getRank() - hand[i].getRank() != 1) { isStraight = false; break; } } // 单独检查A-low顺子的情况 if (!isStraight) { isStraight = (hand[0].getRank() == 2 && hand[1].getRank() == 3 && hand[2].getRank() == 4 && hand[3].getRank() == 5 && hand[4].getRank() == 14); }
3. 先排除重复点数的情况
如果手牌里有重复点数(比如两张5),那肯定不是顺子,你的检测方法有没有先做这个判断?可以用HashSet快速去重验证:
Set<Integer> rankSet = new HashSet<>(); for (Card card : hand) { if (!rankSet.add(card.getRank())) { // 存在重复点数,直接返回false return false; } } // 再执行后续的顺子判断逻辑
4. 验证测试类的循环逻辑
你用while(DeckOfCards.str == 0)循环测试,得确认:
str变量是不是在检测到顺子时会被正确设为非0值?比如你的DeckOfCards类里,检测到顺子后有没有更新str?- 每次循环new的
DeckOfCards实例,是不是正确生成了新的随机手牌并赋值到hand数组里?有没有可能发牌逻辑没把牌放进hand?
5. 手动构造顺子做测试
别光靠随机抽牌碰运气,手动构造一个确定的顺子传入检测方法,直接看返回值:
// 手动构造5,6,7,8,9的顺子 hand[0] = new Card("Hearts", 5); hand[1] = new Card("Diamonds", 6); hand[2] = new Card("Clubs", 7); hand[3] = new Card("Spades", 8); hand[4] = new Card("Hearts", 9); // 调用你的顺子检测方法 boolean checkResult = yourStraightDetectionMethod(); System.out.println("检测结果:" + checkResult);
如果手动构造的顺子都返回false,那肯定是检测方法的逻辑问题,用IDE断点一步步看每一步的判断结果,很快就能找到哪里错了。
内容的提问来源于stack exchange,提问作者Elbowgrease
相关产品推荐
相关产品推荐

