• 服务器开发- 牌和牌的基本操作


    一周又过去了,今天一天差不多都是在床上躺过去了。

    下午起床到楼下吃了一碗炸酱面

    然后不知道该干啥,于是就回家打开电脑,开始继续写博客


    上一篇我们一起完成了早.net core下的websocket的的中间件的开发。

    基本的东西算是有了,今天我们来关注一下游戏逻辑的问题

    开篇的时候,我们提到过,我们要开发的是一个炸金花的棋牌游戏(没玩过的同学请传送到百度百科https://baike.baidu.com/item/%E7%82%B8%E9%87%91%E8%8A%B1/8806924?fr=aladdin

    首先我们捋一下服务器需要做的东西

    • 定义一副扑克牌的类型
    • 炸金花游戏的牌型
    • 洗牌,生成N家牌

    先定义好扑克牌的基本类型

    /// <summary>
        ////// </summary>
        public class CardType
        {
    
            public static int A_A = 0;
          public static int B_A = 1;
            public static int C_A = 2;
          public static int D_A = 3;
    
         public static int A_2 = 4;
         public static int B_2 = 5;
        public static int C_2 = 6;
        public static int D_2 = 7;
    
         public static int A_3 = 8;
        public static int B_3 = 9;
        public static int C_3 = 10;
         public static int D_3 = 11;
    
         public static int A_4 = 12;
         public static int B_4 = 13;
        public static int C_4 = 14;
         public static int D_4 = 15;
    
         public static int A_5 = 16;
         public static int B_5 = 17;
         public static int C_5 = 18;
         public static int D_5 = 19;
    
         public static int A_6 = 20;
         public static int B_6 = 21;
        public static int C_6 = 22;
        public static int D_6 = 23;
    
        public static int A_7 = 24;
         public static int B_7 = 25;
        public static int C_7 = 26;
        public static int D_7 = 27;
    
         public static int A_8 = 28;
         public static int B_8 = 29;
        public static int C_8 = 30;
         public static int D_8 = 31;
    
        public static int A_9 = 32;
        public static int B_9 = 33;
        public static int C_9 = 34;
        public static int D_9 = 35;
    
        public static int A_10 = 36;
        public static int B_10 = 37;
        public static int C_10 = 38;
        public static int D_10 = 39;
    
        public static int A_J = 40;
        public static int B_J = 41;
        public static int C_J = 42;
        public static int D_J = 43;
    
        public static int A_Q = 44;
         public static int B_Q = 45;
        public static int C_Q = 46;
        public static int D_Q = 47;
    
         public static int A_K = 48;
        public static int B_K = 49;
        public static int C_K = 50;
        public static int D_K = 51;
    
    
        public static int W_XW = 52;
    
        public static int W_DW = 53;
    
    
    
        }

    使用的时候静态的int类型作为牌的数据类型 变量名ABCD分别代表黑桃,红心 ,梅花 ,方块四种类型。W开头的代表扑克牌中的大王小王用下划线分割。

    发牌就把int类型的数字发出去就好了,后面使用这个数字来判断是什么牌

    如何获取牌型?

    通过反射,获取CardType的字段的名称

    static FieldInfo[] list = typeof(CardType).GetFields(BindingFlags.Static | BindingFlags.Public);

    然后通过字段类型的对比,获取到时什么牌

     public static string TestCardName(int cardNumber)
            {
    
    
                foreach (var item in list)
                {
                    int a = (int)item.GetValue(null);
                    if (a == cardNumber)
                    {
                        string name = "";
                        var cardName = item.Name.Split("_");
                        switch (cardName[0])
                        {
                            case "A":
                                name = "黑桃";
                                break;
                            case "B":
                                name = "红桃";
                                break;
                            case "C":
                                name = "梅花";
                                break;
                            case "D":
                                name = "方块";
                                break;
    
    
                        }
                        if (name != "")
                        {
                            name += cardName[1];
                        }
                        //特殊牌型判断
                        if (item.Name.Contains("XW"))
                        {
                            name = "小王";
                        }
                        if (item.Name.Contains("DW"))
                        {
                            name = "大王";
                        }
    
                        return name;
                    }
    
                }
                return "未知牌";
    
            }

    有了牌之后,我们就可以开始洗牌了

    如何洗牌?

      玩牌的时候,洗牌就是把桌上的牌拿起来不停的搓啊搓啊的,然后就开始发牌。但是在程序中,我们不可能拿着牌搓啊搓的。。。但是我们可以搓数组啊。。。

      所以我们先生成一个和CardType里面的从0到53的一个顺序的数组或者集合

     List<int> list = new List<int>();
                for (int i = 0; i <= 51; i++)
                {
                    list.Add(i);
                }

    然后打乱这个集合的顺序,这样就算是洗好牌了。。。如果要洗多次牌,就打乱多次顺序。。。(博主认为这样没意义)

     /// <summary>
            /// 随机排列数组元素
            /// </summary>
            /// <param name="myList"></param>
            /// <returns></returns>
            private static List<int> ListRandom(List<int> myList)
            {
    
                Random ran = new Random();
                int index = 0;
                int temp = 0;
                for (int i = 0; i < myList.Count; i++)
                {
    
                    index = ran.Next(0, myList.Count - 1);
                    if (index != i)
                    {
                        temp = myList[i];
                        myList[i] = myList[index];
                        myList[index] = temp;
                    }
                }
                return myList;
            }

    然后我们这个洗牌的方法就直接调用就可以得到一个乱序的int集合,集合中的每个int值就对应CardType的一个牌类型

     /// <summary>
            /// 洗牌
            /// </summary>
            /// <returns></returns>
            public static List<int> Shuffle()
            {
    
                List<int> list = new List<int>();
                for (int i = 0; i <= 51; i++)
                {
                    list.Add(i);
                }
                return ListRandom(list);
    
            }

    然后在这个乱序的牌集合里面,取出三家的牌(具体多少家,看心情吧。。。也不一定非要三家)

    using System.Linq;
     var list = JinHuaUtils.Shuffle();
                list.Skip(0).Take(3);

    取出第一家的牌就是跳过0条取三张,第二家就是跳过3条取三张,然后依次类推,就可以取出N方的牌。(我想了一下,这个方法应该适用于各种牌类型的洗牌,至少斗地主,牛牛这类的是没问题的,其他的我也不会QAQ)

    好了,今天就到这里了,下一节应该还是对牌的操作,比如牌比大小啊,炸金花游戏的牌型啊(对子,顺子,金花,三筒)等等的一些操作。

    本来打算一篇写完的,但是迫于本人表达能力(其实我认为是园友耐心问题),就分几篇写吧

    我也是摸索着写这个东西,如果有理解错误的地方,希望园友们指出


    如果想请我喝瓶水,可以扫一下二维码 QAQ

  • 相关阅读:
    团队项目前期冲刺-6
    《人月神话》阅读笔记02
    4.25软件工程课下作业
    团队项目前期冲刺-5
    element-UI table封装
    local storage
    去除2个数组中不同的数字
    vue.config.js常用配置
    工作中使用的一些技巧总结【后续持续性更新】
    MockJs
  • 原文地址:https://www.cnblogs.com/boxrice/p/8592877.html
Copyright © 2020-2023  润新知