C#模拟洗牌小程序

C#模拟洗牌小程序

初学C#,昨天刚刚学了C#的基础语法。其实这就是一个数组和枚举的简单应用,设计一些计数、遍历、交换简单算法。

背景:一共54张扑克牌,每一张扑克看成一个结构体,包含花色和点数两个数据成员。还要有一个构造函数,设置点数和花色。

 public struct Poke
    {
        public Poke(PokeType type, int pokeNum):this()
        {
            PokeNum = pokeNum;
            PokeType = type;
        }
        public int PokeNum;
        public PokeType PokeType;
    }

对于花色 ,只有4中所以使用枚举类型就很方便了

 public enum PokeType
    {
        Club,//黑桃
        Heart,//红桃
        Flower,//梅花
        Square,//方块
        King
    }

下面介绍程序的主体:

 static void Main(string[] args)
        {
            Poke[] pokes = new Poke[54];

            //初始化顺序的扑克牌                                                                                                               for (int pokeTypeLoop=0; pokeTypeLoop < 4;++pokeTypeLoop )
            {
                for (int pokeNumLoop = 1; pokeNumLoop <= 13;++pokeNumLoop )
                {
                    pokes[pokeTypeLoop * 13 + pokeNumLoop - 1] = new Poke((PokeType)pokeTypeLoop, pokeNumLoop);
                }
            }

            pokes[52] = new Poke(PokeType.King, 0);
            pokes[53]=new Poke(PokeType.King,1);

            //洗牌
            int moveStart = 0;
            int moveNum = 0;
            int moveEnd = 0;
            int washTime = 100000;//洗牌次数
            Random rnd = new Random();

            while (washTime > 0)
            {
                moveStart = rnd.Next() % 54;
                moveNum = rnd.Next() % 20;
                moveEnd = moveStart + moveNum - 1;

                if (moveEnd > 53)
                {
                    moveEnd = 53;
                    moveNum = moveEnd - moveStart + 1;
                }

                if (moveStart > 0 && moveNum > 0)
                {
                    //拿牌
                    Poke[] tempPoke = new Poke[moveNum];

                    for (int moveLoop = 0; moveLoop < moveNum; ++moveLoop)
                    {
                        tempPoke[moveLoop] = pokes[moveStart + moveLoop];
                    }
                    //移牌
                    for (int moveTargetLoop = moveStart - 1; moveTargetLoop >= 0; --moveTargetLoop)
                    {
                        pokes[moveTargetLoop + moveNum] = pokes[moveTargetLoop];
                    }

                    //放牌
                    for (int locationLoop = 0; locationLoop < moveNum; ++locationLoop)
                    {
                        pokes[locationLoop] = tempPoke[locationLoop];
                    }
                }

                washTime--;
            }

            //输出扑克
            for (int loop = 0; loop < 54;++loop )
            {
                Console.WriteLine("花色:{0},大小:{1}", pokes[loop].PokeType.ToString(), ConvertPokeNumToString(pokes[loop].PokeType,pokes[loop].PokeNum));
            }

            //校验洗牌结果
            Console.WriteLine("\n经校验结果如下:");
            //1.校验花色
            int[] check = new int[5];
            for (int k = 0; k < 54; ++k)
            {
                switch (pokes[k].PokeType)
                {
                    case PokeType.Club:
                        ++check[0];
                        break;
                    case PokeType.Flower:
                        ++check[1];
                        break;
                    case PokeType.Heart:
                        ++check[2];
                        break;
                    case PokeType.Square:
                        ++check[3];
                        break;
                    case PokeType.King:
                        ++check[4];
                        break;
                }
            }
            if (check[0] == 13 && check[1] == 13 && check[2] == 13 && check[3] == 13 && check[4] == 2)
                Console.WriteLine("花色无误!");
            else
            {
                Console.WriteLine("花色发生了错误!");
                Console.WriteLine("黑桃:{0}张  梅花:{1}张  红心:{2}张  方片:{3}张  王牌:{4}张", check[0], check[1], check[2], check[3], check[4]);
            }//校验花色完毕

            //2.校验点数
            int[] checkNum = new int[14];
            for (int j = 0; j < 54; ++j)
            {
                if (pokes[j].PokeType == PokeType.King)
                    checkNum[13]++;
                else
                    checkNum[pokes[j].PokeNum - 1]++;
            }
            int n = 0;
            for (n = 0; n < 13; ++n)
            {
                if (checkNum[n] != 4)
                {
                    Console.WriteLine("扑克点数发生错误!");
                    break;
                }
            }
            if (n == 13)
            {
                if (checkNum[n] != 2)
                    Console.WriteLine("扑克点数:王牌发生错误!");
                else
                    Console.WriteLine("点数无误!");
            }//校验点数完毕
            Console.ReadKey();
        }

         public static string convertToString(PokerType type)
        {
            switch (type)
            {
                case PokerType.Club:
                    return "黑桃";
                case PokerType.Block:
                    return "方片";
                case PokerType.Flower:
                    return "梅花";
                case PokerType.Heart:
                    return "红心";
                case PokerType.King:
                    return "王牌";
                default:
                    throw new ArgumentException("扑克类型参数无效");
            }
        }
        public static string ConvertPokeNumToString(PokeType type,int num)
        {
            if (num == 0 && type == PokeType.King)
                return "小王";
            if (num == 1 && type == PokeType.King)
                return "大王";
            if (num == 1)
                return "A";
            else if (num == 11)
                return "J";
            else if (num == 12)
                return "Q";
            else if (num == 13)
                return "K";
            else if (num >= 2 && num <= 10)
                return num.ToString();
            //抛出异常            
		throw new ArgumentException("扑克大小参数无效");
        }                                                                                                                              }   
下面3张图片具体介绍每一次洗牌的过程:


你可能感兴趣的:(C#程序设计)