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

如何在数组中存储扑克牌Card对象?解决数组越界等问题

问题解决方案

1. 修复Deck类的数组越界异常

你的Deck构造函数存在两个核心问题:

  • 数组长度错误:一副标准扑克牌共52张,你创建的数组长度是51,导致最后一张牌无法存入,触发数组越界异常。
  • 花色循环范围错误:Card类的suitNumber()方法只处理1-4的花色值,但循环从0开始,会生成无效花色的牌,且对应字符串返回null。

修改后的Deck类代码:

public class Deck
{
    // 将deck设为成员变量,方便外部访问整副牌
    private Card[] deck;

    Deck ()
    {
        int index = 0;
        deck = new Card[52]; // 修正数组长度为52
            
        for (int value = 1; value <= 13; value++)
        {
            for (int suit = 1; suit <= 4; suit++) // 花色循环从1到4,匹配Card类的判断逻辑
            {
                deck[index] = new Card(value, suit);
                index++;
            }           
        }
    }   

    // 提供方法获取整副牌
    public Card[] getDeck() {
        return deck;
    }
}

2. Card类的优化与访问器方法的作用

  • 访问器方法的必要性:getValue()、getSuit()这些方法是有用的,后续你需要对牌进行逻辑判断(比如比较大小、分类)时,原始的int数值比字符串更方便处理,建议保留。
  • 冗余成员变量清理:原代码中的valueN和valueS属于冗余存储,每次调用转换方法时直接返回字符串即可,避免未赋值导致的null问题;同时补充默认分支,防止无效数值返回null。

优化后的Card类代码:

public class Card
{   
    private int value;
    private int suit;

    Card(int value, int suit) {
        this.value = value;
        this.suit = suit;
    }   

    public String valueNumber() {
        switch(value) {
            case 1: return "Ace";
            case 2: return "Two";
            case 3: return "Three";
            case 4: return "Four";
            case 5: return "Five";
            case 6: return "Six";
            case 7: return "Seven";
            case 8: return "Eight";
            case 9: return "Nine";
            case 10: return "Ten";
            case 11: return "Jack";
            case 12: return "Queen";
            case 13: return "King";
            default: return "Invalid Value"; // 补充默认分支,避免返回null
        }
    }

    public String suitNumber() {
        switch(suit) {
            case 1: return "Hearts";
            case 2: return "Clubs";
            case 3: return "Spades";
            case 4: return "Diamonds";
            default: return "Invalid Suit"; // 补充默认分支
        }
    }  

    // 保留访问器方法,供后续逻辑使用
    public int getValue() {
        return this.value;
    }

    public int getSuit() {
        return this.suit;
    }

    @Override
    public String toString() {
        return valueNumber() + " of " + suitNumber();       
    }
}

3. 数组类型选择:普通一维数组即可

不需要使用二维数组,一维数组足以存储52个Card对象。后续随机取牌时,只需生成0-51的随机整数,直接通过索引定位到目标牌,比按花色分组的二维数组更简洁高效。

4. 随机取牌示例实现

在Deck类中添加随机取牌方法,方便直接调用:

import java.util.Random;

public class Deck
{
    // 保留之前的成员变量和构造函数...
    private Random random = new Random();

    public Card drawRandomCard() {
        int randomIndex = random.nextInt(52); // 生成0-51的随机索引
        return deck[randomIndex];
    }
}

调用示例:

public class Main {
    public static void main(String[] args) {
        Deck myDeck = new Deck();
        Card randomCard = myDeck.drawRandomCard();
        System.out.println(randomCard); // 输出类似"King of Diamonds"的结果
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:20:47