You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    }
}

修复说明

  1. 随机数修复:用randGen.nextInt(52)生成0到51的随机索引,确保抽取的是牌组内的随机有效牌。
  2. 牌组生成修复:外层循环遍历全部4个花色,内层循环从2开始生成有效点数,避免无效牌。
  3. 花色类型优化:将suit改为char类型,直接存储花色字符,解决ASCII码显示问题。
  4. Setter方法修复:正确给成员变量赋值,实现属性修改功能。
  5. 匹配逻辑可选调整:提供两种匹配逻辑选项,可根据需求切换。

内容的提问来源于stack exchange,提问作者Jenk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:50:39