如何在数组中存储扑克牌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
相关产品推荐
相关产品推荐

