Java扑克牌随机抽取程序输出异常求助:重复输出相同匹配结果
排查并修复扑克牌匹配程序的逻辑错误
核心问题分析
- 随机数生成完全失效:
randGen.nextInt(1)只会返回0,加13后randNum1和randNum2永远等于13,导致每次抽取的都是牌组中索引13的同一张牌,必然输出匹配结果。 - 牌组生成不完整且包含无效牌:外层循环
i < 3只遍历3个花色(漏掉了C),内层循环从0开始生成,包含了value为0的无效牌(扑克牌无0点)。 - 花色显示错误:
toString直接输出suit的ASCII数值(比如'S'对应83),而非预期的花色字符。 - Setter方法逻辑错误:
setSuit和setValue没有正确修改成员变量,反而把参数设为0,完全失去作用。 - 匹配逻辑可能不符合需求:当前
isMatch只要同花色或同点数就返回true,若需求是仅同点数匹配,需调整逻辑。
修复后的代码
Main.java
import java.util.ArrayList; import java.util.Random; public class Main { public static void main(String[] args) { ArrayList<PlayingCard> deckOfCards = new ArrayList<>(52); String chrSuit = "SHDC"; Random randGen = new Random(); // 生成0-51的随机索引,覆盖完整52张牌 int randNum1 = randGen.nextInt(52); int randNum2 = randGen.nextInt(52); // 遍历全部4个花色 for (int i = 0; i < chrSuit.length(); ++i) { // 生成2-14的有效点数(2-10、J=11、Q=12、K=13、A=14) for (int x = 2; x <= 14; ++x) { PlayingCard singleCard = new PlayingCard(chrSuit.charAt(i), x); deckOfCards.add(singleCard); } } PlayingCard card1 = deckOfCards.get(randNum1); PlayingCard card2 = deckOfCards.get(randNum2); boolean blnCardsMatch = card1.isMatch(card2); if (blnCardsMatch) { System.out.print(card1.toString() + " and " + card2.toString() + " match"); } else { System.out.print(card1.toString() + " and " + card2.toString() + " don't match"); } } }
PlayingCard.java
class PlayingCard { private char suit; // 改为char类型,直接存储花色字符 private int value; public PlayingCard() { suit = ' '; value = 0; } public PlayingCard(char suit, int value) { this.suit = suit; this.value = value; } public void setSuit(char suit) { this.suit = suit; } public void setValue(int value) { this.value = value; } public char getSuit() { return suit; } public int getValue() { return value; } // 此处默认匹配逻辑为【同点数】,若需同花色/同点数都算匹配,改用注释内的逻辑 public boolean isMatch(PlayingCard rcvCard) { return this.value == rcvCard.getValue(); // 原逻辑:return this.suit == rcvCard.getSuit() || this.value == rcvCard.getValue(); } public String toString() { String str; switch (value) { case 11: str = "J"; break; case 12: str = "Q"; break; case 13: str = "K"; break; case 14: str = "A"; break; default: str = Integer.toString(value); } return suit + "," + str; } }
修复说明
- 随机数修复:用
randGen.nextInt(52)生成0到51的随机索引,确保抽取的是牌组内的随机有效牌。 - 牌组生成修复:外层循环遍历全部4个花色,内层循环从2开始生成有效点数,避免无效牌。
- 花色类型优化:将
suit改为char类型,直接存储花色字符,解决ASCII码显示问题。 - Setter方法修复:正确给成员变量赋值,实现属性修改功能。
- 匹配逻辑可选调整:提供两种匹配逻辑选项,可根据需求切换。
内容的提问来源于stack exchange,提问作者Jenk
相关产品推荐
相关产品推荐

