• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c#扑克牌程序(1)一副扑克牌可以选择是否包含大小王

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

这个是《C#入门经典》第六版 中的例子,但其中没有包含大小王。我略作改动把54张扑克牌都补全。

包含一个类库和一个命令行程序。

如果要去掉大小王,

枚举类可以不变动(也可以Suit中删除“王”,同时Rank中删除“大王”、“小王”)

Card中,重写的ToString方法中,直接返回return,不做任何判断。

Deck中,删除cards数组的最后2个元素赋值,同时修改数组大小及判断数组大小的地方-2

 

 

PS:客户端只包含洗牌,未包含多人发牌,可以自己添加。

 

类库的类图如下:

 

 

枚举类Suit:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch10CardLib
{
    //public enum Suit
    //{
    //    Club,
    //    Diamond,
    //    Heart,
    //    Spade,
    //}
    /// <summary>
    /// 牌的花色 包含4种花色
    /// </summary>
    public enum Suit
    {
        梅花,
        方片,
        红桃,
        黑桃,
        王,
    }
}


枚举Rank:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch10CardLib
{
    //public enum Rank
    //{
    //    Ace = 1,
    //    Deuce,
    //    Three,
    //    Four,
    //    Five,
    //    Six,
    //    Seven,
    //    Eight,
    //    Nine,
    //    Ten,
    //    Jack,
    //    Queen,
    //    King,
    //}
    /// <summary>
    /// 牌的大小 范围:A、2、3 ...10、J、Q、K
    /// </summary>
    public enum Rank
    {
        A = 1,
        二,
        三,
        四,
        五,
        六,
        七,
        八,
        九,
        十,
        J,
        Q,
        K,
        小王,
        大王,
    }
}


Card容器类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch10CardLib
{
    public class Card
    {
        public readonly Rank rank;
        public readonly Suit suit;
        private Card()
        {
            
        }

        public Card(Suit newSuit, Rank newRank)
        {
            suit = newSuit;
            rank = newRank;
        }

        public override string ToString()
        {
           // return "The " + rank + " of " + suit + " s";
            if (suit==(Suit)4)
            {
                return string.Format("{0}", rank);
            }
            else
            {
                return string.Format("{0}{1}", suit, rank);
            }

        }
    }
}


Deck类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch10CardLib
{
    public class Deck
    {
        private Card[] cards;
    /// <summary>
    /// 生成一副有序的牌
    /// </summary>
        public Deck()
        {
            cards = new Card[54];
            for (int suitVal = 0; suitVal < 4; suitVal++)       //四种花色
            {
                for (int rankVal = 1; rankVal < 14; rankVal++)      //每个花色各13张牌
                {
                    cards[suitVal * 13 + rankVal - 1] = new Card((Suit)suitVal,(Rank)rankVal);
                }
            }
            cards[52] = new Card((Suit)4, (Rank)14);
            cards[53] = new Card((Suit)4, (Rank)15);
        }
        /// <summary>
        /// 获取牌号
        /// </summary>
        /// <param name="cardNum">牌号</param>
        /// <returns></returns>
        public Card GetCard(int cardNum)
        {
            if (cardNum >= 0 && cardNum <= 53)
            {
                return cards[cardNum];
            }
            else
            {
                throw (new System.ArgumentOutOfRangeException("cardNum", cardNum, "值必须在0~51之间。"));
            }
        }
        /// <summary>
        /// 洗牌
        /// </summary>
        public void Shuffle()
        {
            Card[] newDeck = new Card[54];
            bool[] assigned = new bool[54];
            Random sourceGen = new Random();
            for (int i = 0; i < 54; i++)
            {
                int destCard = 0;
                bool foundCard = false;
                while (foundCard == false)
                {
                    destCard = sourceGen.Next(54);
                    if (assigned[destCard] == false)
                    {
                        foundCard = true;
                    }
                }
                assigned[destCard] = true;
                newDeck[destCard] = cards[i];
            }
            newDeck.CopyTo(cards,0);        //将打乱顺序的一副牌组newDeck从0开始复制给cards
        }
    }
}


 

测试客户端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ch10CardLib;
namespace Ch10CardClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Deck myDeck = new Deck();       //调用Deck类中默认构造函数,生成一副有序的扑克牌
            myDeck.Shuffle();
            for (int i = 0; i < 54; i++)
            {
                Card tempCard = myDeck.GetCard(i);
                Console.WriteLine(tempCard.ToString());
                if (i != 54)
                {
                }
                else
                {
                    Console.WriteLine("发牌结束!");
                }
            }
            Console.ReadKey();
        }
    }
}


 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#使用MQTTnet快速实现MQTT通信发布时间:2022-07-18
下一篇:
C#程序调用非托管C++DLL文件的方法发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap