C# 如何从Deck牌组类抽卡并将Card对象存入用户手牌List集合
问题修正与实现方案
1. 先修复Deck类的语法错误
你提供的Deck类中Shuffle方法缺少闭合大括号,先补全避免编译失败:
class Deck { private Card[] deck; private int currentCard; private const int numberofCards = 52; private Random ranNum; public Deck() { string[] faces = { "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10","Jack", "Queen", "King"}; string[] suits = { "Clubs", "Hearts", "Spades", "Diamonds" }; deck = new Card[numberofCards]; currentCard = 0; ranNum = new Random(); for (int count = 0; count < deck.Length; count++) deck[count] = new Card(faces[count % 13], suits[count / 13]); } public void Shuffle() { currentCard = 0; for (int i = 0; i < deck.Length; i++) { int j = ranNum.Next(numberofCards); Card temp = deck[i]; deck[i] = deck[j]; deck[j] = temp; } } // 补全此处缺失的大括号 public Card DealCard() { if (currentCard < deck.Length) return deck[currentCard++]; else return null; } }
Card类代码无需修改可直接正常使用。
2. 主程序抽卡逻辑实现
抽卡逻辑必须放在Deck实例化之后,建议先调用洗牌方法打乱牌序再抽卡,抽得的卡牌直接Add到userHand集合即可,以下是抽5张手牌的实现示例:
class Program { static void Main(string[] args) { List<Card> userHand = new List<Card>(); Deck deck1 = new Deck(); // 先洗牌打乱牌序 deck1.Shuffle(); // 抽5张牌存入手牌 for(int i = 0; i < 5; i++) { Card drawnCard = deck1.DealCard(); if(drawnCard != null) // 避免牌堆抽空导致的空引用异常 { userHand.Add(drawnCard); } } // 输出用户手牌 Console.WriteLine("你的手牌:"); foreach(var card in userHand) { Console.WriteLine(card.ToString()); } // 原有输出全部52张牌的逻辑可按需保留或删除 Console.WriteLine("\n完整牌组:"); for(int i = 0; i < 52; i++) { Console.WriteLine("{0,-19}", deck1.DealCard()); if ((i + 1) % 4 == 0) Console.WriteLine(); } Console.ReadLine(); } }
补充说明
- 你之前写的
GetCard是笔误,Deck类对外提供的抽卡方法为DealCard,直接调用即可 - 若需要调整抽卡数量,修改抽卡循环的终止条件即可
内容的提问来源于stack exchange,提问作者Xm Par
相关产品推荐
相关产品推荐

