首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#中的卡片洗牌

C#中的卡片洗牌
EN

Stack Overflow用户
提问于 2009-07-19 19:20:28
回答 9查看 60.6K关注 0票数 16

我正在尝试为一个项目编写一个代码,该代码列出一副纸牌的内容,询问用户想要洗牌多少次,然后再洗牌。它必须使用一种方法通过System.Random类创建两个随机整数。

以下是我的类:

Program.cs:

代码语言:javascript
运行
复制
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Deck mydeck = new Deck();
            foreach (Card c in mydeck.Cards)
            {
                Console.WriteLine(c);
            }
            Console.WriteLine("How Many Times Do You Want To Shuffle?");

        }
    }
}

Deck.cs:

代码语言:javascript
运行
复制
namespace ConsoleApplication1
{
    class Deck
    {    
        Card[] cards = new Card[52];
        string[] numbers = new string[] { "2", "3", "4", "5", "6", "7", "8", "9", "J", "Q", "K" };
        public Deck()
        {
            int i = 0;
            foreach(string s in numbers)
            {
                cards[i] = new Card(Suits.Clubs, s);
                i++;

            }
            foreach (string s in numbers)
            {
                cards[i] = new Card(Suits.Spades, s);
                i++;

            }
            foreach (string s in numbers)
            {
                cards[i] = new Card(Suits.Hearts, s);
                i++;

            }
            foreach (string s in numbers)
            {
                cards[i] = new Card(Suits.Diamonds, s);
                i++;

            }
        }

        public Card[] Cards
        {
            get
            {
                return cards;


            }
        }
    }  
}

Enums.cs:

代码语言:javascript
运行
复制
namespace ConsoleApplication1
{        
    enum Suits 
    {
        Hearts,
        Diamonds,
        Spades,
        Clubs
    }
}

Card.cs:

代码语言:javascript
运行
复制
namespace ConsoleApplication1
{
    class Card
    {
        protected Suits suit;
        protected string cardvalue;
        public Card()
        {
        }
        public Card(Suits suit2, string cardvalue2)
        {
            suit = suit2;
            cardvalue = cardvalue2;
        }
        public override string ToString()
        {
            return string.Format("{0} of {1}", cardvalue, suit);
        }
    }
 }

请告诉我如何让牌洗得像人想要的那样多,然后列出洗过的牌。

EN

Stack Overflow用户

发布于 2021-09-30 00:52:38

在Card类中使用枚举。

代码语言:javascript
运行
复制
public class Card
{
    public Suit Suit { get; set; }
    public CardValue CardValue { get; set; }
}

public enum CardValue 
{
    Ace = 1,
    Two = 2,
    Three = 3,
    Four = 4,
    Five = 5,
    Six = 6,
    Seven = 7,
    Eight = 8,
    Nine = 9,
    Ten = 10,
    Jack = 11,
    Queen = 12,
    King = 13
}

public enum Suit
{ 
    Clubs,
    Hearts,
    Spades,
    Dimonds
}

完成后,您就可以创建一个PlayersHand类

代码语言:javascript
运行
复制
public class PlayersHand
{
    public List<Card> Cards { get; set; }
}

现在,您已经创建了两个类并使用Enum进行了支持,现在只需从牌组中为每个玩家提供帮助,这只是一个纸牌列表。

代码语言:javascript
运行
复制
List<Card> deck = new List<Card>();

        // 52 cards in a deck, 13 cards per suit.
        foreach (Suit suit in Enum.GetValues(typeof(Suit))) 
        {
            foreach (CardValue cardValue in Enum.GetValues(typeof(CardValue))) 
            {
                Card card = new Card
                {
                    Suit = suit,
                    CardValue = cardValue
                };
                deck.Add(card);
            }
        }

// Shuffle using random replace.
        for (var i = deck.Count-1; i > 0; i--)
        {
            Random rnd = new Random();
            var j = rnd.Next(0, i);
            var temp = deck[i];
            deck[i] = deck[j];
            deck[j] = temp;
        }
            
        // THESE ARE THE SETTINGS
        int NumberOfPlayers = 4;
        int NumberOfCardsPerPlayer = 5;

        // NEW UP A LIST OF PLAYER HANDS
        List<PlayersHand> hands = new List<PlayersHand>();
        for (var i = 1; i <= NumberOfPlayers; i++)
        {
            PlayersHand newHand = new PlayersHand()
            {
                Cards = new List<Card>()
            };
            hands.Add(newHand);
        }

        // HERE IS THE TRICK TO DEALING OUT THE TOP CARD
        int deal = 0;

        // GOING AROUND THE TABLE 5 TIMES BECAUSE EACH PLAYER HAS 5 CARDS
        for (var i = 0; i < NumberOfCardsPerPlayer ; i++)
        {
            // FOR EACH PLAYER GET THE TOP CARD USING THE 'DEAL' INT
            for (var p = 0; p < NumberOfPlayers; p++) 
            {
                var player = hands[p];
                player.Cards.Add(deck[deal]);
                // INCREMENT DEAL
                deal++;
            }
        }

这种方法对我很有效。

票数 0
EN
查看全部 9 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1150646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档