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

简介: 服务器开发- 牌和牌的基本操作

 

上一篇我们一起完成了早.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)

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

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

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

目录
相关文章
|
编解码 Android开发 数据安全/隐私保护
Android平台外部编码数据(H264/H265/AAC/PCMA/PCMU)实时预览播放技术实现
好多开发者可能疑惑,外部数据实时预览播放,到底有什么用? 是的,一般场景是用不到的,我们在开发这块前几年已经开发了非常稳定的RTMP、RTSP直播播放模块,不过也遇到这样的场景,部分设备输出编码后(视频:H.264/H.265,音频:AAC/PCMA/PCMU)的数据,比如无人机或部分智能硬件设备,回调出来的H.264/H.265数据,除了想转推到RTMP、轻量级RTSP服务或GB28181外,还需要本地预览甚至对数据做二次处理(视频分析、实时水印字符叠加等,然后二次编码),基于这样的场景诉求,我们开发了Android平台外部编码数据实时预览播放模块。
240 0
|
监控 安全 Linux
CentOS7下部署ARL资产侦察灯塔系统
CentOS7下部署ARL资产侦察灯塔系统
1369 3
|
设计模式 Java Apache
Springboot项目优化日志logback-spring.xml详解
Commons Logging和Slf4j是日志门面(门面模式是软件工程中常用的一种软件设计模式,也被称为正面模式、外观模式。它为子系统中的一组接口提供一个统一的高层接 口,使 得子系统更容易使用)。log4j和Logback则是具体的日志实现方案。可以简单的理解为接口与接口的实现,调用这只需要关注接口而无需关注具体的实现,做到解耦
2485 0
Springboot项目优化日志logback-spring.xml详解
|
监控 网络协议 Ubuntu
netstat,Linux 下的网络状态监控工具
Netstat 是 Linux 系统中的强大网络分析工具,用于查看网络配置和活动,如端口监听、网络连接和路由信息。通过基本命令 `netstat [options]` 可实现多种操作,例如 `-a` 显示所有端口,`-l` 显示监听端口,`-s` 展示协议统计信息。结合 `-p` 选项可查看占用端口的进程,而监控网络连接状态则可用 `-nt` 加 `grep ESTABLISHED` 查看已建立的连接。要深入了解和使用更多功能,可查阅 `man netstat`。
349 0
|
缓存 图形学 异构计算
【#Unity Shader#Amplify Shader Editor(ASE)_第二篇】
【#Unity Shader#Amplify Shader Editor(ASE)_第二篇】
|
图形学
Flutter笔记:Matrix4矩阵变换与案例
Flutter笔记:Matrix4矩阵变换与案例
706 0
|
SQL Web App开发 XML
企望制造ERP系统存在远程命令执行漏洞
企望制造 ERP comboxstore.action接口权限设置不当,默认的配置可执行任意SQL语句,利用xp_cmdshell函数可远程执行命令,未经认证的攻击者可通过该漏洞获取服务器权限。
477 1
|
应用服务中间件 nginx
Nginx源码阅读:nginx_shmtx共享互斥锁(进程锁)
Nginx源码阅读:nginx_shmtx共享互斥锁(进程锁)
256 0
|
IDE 网络安全 开发工具
安卓模拟器接口抓包教程
用uni-app开发安卓应用时,查看接口数据不能像在浏览器中可以直接通过network查看,只能借助抓包工具来抓包,还有一些线上应用我们也只能通过抓包来排查具体的问题