最近开发斗地主游戏,在博客上发现很多判断牌型的方法都写的太多,苦思冥想之下,自己琢磨出一套简便的算法,如下:
首先定义一下要出的的牌的类型

/// <summary>
/// 出牌的类型   过1,单张1,对子2,三张3,三带单4,三带对5,单顺6,双顺7,飞机8,飞机带单9,飞机带双10,四带两单11,四带对12,炸弹13,火箭14
/// </summary>
public enum SHOW_CARDS_TYPE
{/// <summary>/// 过,不出牌/// </summary>DDZ_PASS = 0,/// <summary>/// 单张/// </summary>SINGLE = 1,/// <summary>/// 对子/// </summary>TWIN = 2,/// <summary>/// 三张/// </summary>TRIPLE = 3,/// <summary>/// 三带单/// </summary>TRIPLE_WITH_SINGLE = 4,/// <summary>/// 三带对/// </summary>TRIPLE_WITH_TWIN = 5,/// <summary>/// 单顺/// </summary>STRAIGHT_SINGLE = 6,/// <summary>/// 双顺/// </summary>STRAIGHT_TWIN = 7,/// <summary>/// 飞机/// </summary>PLANE_PURE = 8,/// <summary>/// 飞机带单/// </summary>PLANE_WITH_SINGLE = 9,/// <summary>/// 飞机带双/// </summary>PLANE_WITH_TWIN = 10,/// <summary>/// 四带两单/// </summary>FOUR_WITH_SINGLE = 11,/// <summary>/// 四带对/// </summary>FOUR_WITH_TWIN = 12,/// <summary>/// 炸弹/// </summary>FOUR_BOMB = 13,/// <summary>/// 火箭/// </summary>KING_BOMB = 14,
}

然后写判断牌型的代码
这里的cardsList是要出的牌的链表

 public static SHOW_CARDS_TYPE  DcCardsTypeToList(List<CardData> cardsList )

通过链表进行判断,返回判断类型,不能出就返回 (过)得牌型

 public static SHOW_CARDS_TYPE  DcCardsTypeToList(List<CardData> cardsList ){//如果牌数为单if (cardsList.Count==1){//返回单排类型return SHOW_CARDS_TYPE.SINGLE;}//如果排数为双if (cardsList.Count==2){//如果是对子if (cardsList[0].size==cardsList[1].size){//返回对子类型return SHOW_CARDS_TYPE.TWIN;}if (cardsList[0].cardsType==4 && cardsList[1].cardsType==5  || cardsList[0].cardsType == 5 && cardsList[1].cardsType == 4){//返回王炸(火箭);return SHOW_CARDS_TYPE.KING_BOMB;}}//如果排数是三张if (cardsList.Count==3){if (cardsList[0].size==cardsList[1].size && cardsList[1].size==cardsList[2].size){return SHOW_CARDS_TYPE.TRIPLE;}}//如果牌数是四张if (cardsList.Count==4){//创建数组,接收各个牌的值int[] cardsSize = new int[4];int num=0;//监听数组里数字的重复字数cardsSize[0] = cardsList[0].size;cardsSize[1] = cardsList[1].size;cardsSize[2] = cardsList[2].size;cardsSize[3] = cardsList[3].size;foreach (var s in cardsSize.GroupBy(c => c)){if (s.Count() != 1){num += s.Count();}}//首先判断是不是炸弹;if ((cardsSize[0]==cardsSize[1]) && (cardsSize[1]==cardsSize[2]) && (cardsSize[3] == cardsSize[0])){return SHOW_CARDS_TYPE.FOUR_BOMB;}//有三个数字重复else if (num==3){return SHOW_CARDS_TYPE.TRIPLE_WITH_SINGLE;}}//如果牌数是5张if (cardsList.Count==5){int[] sizeArray = new int[cardsList.Count];//接收要出的牌的值int num = 0;//监听重复的牌的次数for (int i = 0; i < cardsList.Count; i++){//添加到数组中sizeArray[i] = cardsList[i].size;}//判断是不是三带对//找出数组中重复的元素次数foreach (var s in sizeArray.GroupBy(c=>c)){if (s.Count()!=1){num += s.Count();}} if (num==5){return SHOW_CARDS_TYPE.TRIPLE_WITH_TWIN; //三带对}//判断是不是顺子Array.Sort(sizeArray);//让数组里的数据从小到大排序for (int i = 0; i < sizeArray.Length-1; i++){if (sizeArray[i]!=sizeArray[i+1]-1){return SHOW_CARDS_TYPE.DDZ_PASS;}}return SHOW_CARDS_TYPE.STRAIGHT_SINGLE;}//如果牌数等于6张if (cardsList.Count==6){int[] sizeArray = new int[cardsList.Count];//接收要出的牌的值int num = 0;//监听三张一样的牌的次数int oneTime = 0;//监听单排出现次数int fourTime = 0;//监听是否有4张一样的数字int twoTime = 0;//监听出现过两个相同的数字的次数for (int i = 0; i < cardsList.Count; i++){//添加到数组中sizeArray[i] = cardsList[i].size;}//判断是不是飞机//找出数组中重复有几个牌重复出现foreach (var s in sizeArray.GroupBy(c => c)){if (s.Count()==1){oneTime += 1;}if (s.Count()==2){twoTime += 1;}if (s.Count() ==3){num += 1;}if (s.Count()==4){fourTime += 1;}}Array.Sort(sizeArray);//给数组排序if (num == 2 && sizeArray[2] == sizeArray[3] - 1){return SHOW_CARDS_TYPE.PLANE_PURE;}if (fourTime==1){if (twoTime==1){return SHOW_CARDS_TYPE.FOUR_WITH_TWIN;}else{return SHOW_CARDS_TYPE.FOUR_WITH_SINGLE;}}if (twoTime==3){//判断是不是双顺for (int i = 0; i < sizeArray.Length-2; i++){if (sizeArray[i] != sizeArray[i + 2] - 1){return SHOW_CARDS_TYPE.DDZ_PASS;}}return SHOW_CARDS_TYPE.STRAIGHT_TWIN;}if (oneTime==cardsList.Count){//判断是不是单顺for (int i = 0; i < sizeArray.Length-1; i++){if (sizeArray[i] != sizeArray[i + 1] - 1){return SHOW_CARDS_TYPE.DDZ_PASS;}}return SHOW_CARDS_TYPE.STRAIGHT_SINGLE;}}//如果牌数大于6张if (cardsList.Count>6){int[] sizeArray = new int[cardsList.Count];//接收要出的牌的值int  threeTime = 0;//监三张一样的牌出现的次数int oneTime = 0;//监听单张出现次数int twoTime = 0;//监听出现过两个相同的牌的次数for (int i = 0; i < cardsList.Count; i++){//添加到数组中sizeArray[i] = cardsList[i].size;}//判断是不是飞机//找出数组中重复有几个数重复三次出现foreach (var s in sizeArray.GroupBy(c => c)){if (s.Count()==1){oneTime += 1;}if (s.Count() == 2){twoTime += 1;}if (s.Count() == 3){threeTime += 1;}}Array.Sort(sizeArray);//从小到大排序if (oneTime == cardsList.Count){//判断是不是单顺for (int i = 0; i < sizeArray.Length-1; i++){if (sizeArray[i] != sizeArray[i + 1] - 1){return SHOW_CARDS_TYPE.DDZ_PASS;}}return SHOW_CARDS_TYPE.STRAIGHT_SINGLE;}if (cardsList.Count%2==0)//链表长度是偶数{if (twoTime >=3){//判断是不是双顺for (int i = 0; i < sizeArray.Length-2; i++){if (sizeArray[i] != sizeArray[i + 2] - 1){return SHOW_CARDS_TYPE.DDZ_PASS;}}return SHOW_CARDS_TYPE.STRAIGHT_TWIN;}}if (threeTime>1)//判断是不是飞机{if (threeTime==twoTime)//飞机带双{return SHOW_CARDS_TYPE.PLANE_WITH_TWIN;}if (threeTime==oneTime)//飞机带单{return SHOW_CARDS_TYPE.PLANE_WITH_SINGLE;}}}return SHOW_CARDS_TYPE.DDZ_PASS;  }

unity中使用C#语言判断斗地主出牌牌型相关推荐

  1. Unity中利用C#语言控制Line Renderer绘制自己想要的函数曲线

    利用Line Renderer组件绘制自己想要的函数曲线 前言 首先声明我是一名Unity爱好者,目前小白,把最近研究的记录下来,方便以后参考,有不足 支撑希望大家共同探讨. unity版本为2017 ...

  2. 判断字符串s1中是否包含s2字符串c语言,C语言:找出s1中是否存在字符串s2(C language: find out if string s2 exists in s1)...

    C语言:找出s1中是否存在字符串s2(C language: find out if string s2 exists in s1) 是否有任何C函数来检查s1中是否存在字符串s2? s1: &quo ...

  3. Unity中根据矩阵判断一个点在自身的哪一侧

    如果你还不是很理解矩阵的含义那么请转到 https://blog.csdn.net/qq_39426265/article/details/101373494 问题起源 在Unity自带的函数中并没有 ...

  4. C语言判断数组中是否存在该数

    C语言判断数组中是否存在该数 #include<stdio.h> int main() {int query(int a[10],int num);int num;printf(" ...

  5. 13c语言中的文件是一种流式文件,读写时均以字符为单位.,C语言判断题部分.doc...

    C语言判断题部分 ?第一章 C语言中,字符数据用格式说明"%c"来输出,字符串数据用格式说明"%s"来输出.TC语言中,关键字及编译预处理命令用小写字母书写.T ...

  6. c语言 输入n*n矩阵,C语言函数 编程输入一个n*n矩阵中各元素的值,找出两条对角线上的元素之和...

    题目: C语言函数 编程输入一个n*n矩阵中各元素的值,找出两条对角线上的元素之和 用函数怎么写 解答: #include #define N 5 void main() { \x09int matr ...

  7. UNITY中利用点乘和叉乘判断方向 2D

    void DirectionJudge(){Vector3 dir = mousePositionInWorld - transform.position;dir.z = 0f;var magiDir ...

  8. c语言判断一个数是否为质数的n次方,C语言中 输入一个数 判断这个数是否为3的N次方 求代码...

    C语言中 输入一个数 判断这个数是否为3的N次方 求代码 答案:4  信息版本:手机版 解决时间 2019-10-03 18:55 已解决 2019-10-03 01:54 C语言中 输入一个数 判断 ...

  9. 【C语言】平均分的战争。有m个人的成绩存放在score数组中,请编写程序求出平均成绩并且罗列出低于平均分的分数。

    [问题描述] 平均分的战争.有m个人的成绩存放在score数组中,请编写程序求出平均成绩并且罗列出低于平均分的分数. [输入形式]输入共两行: 第一行成绩个数N,N<=20 第二行,N个以空格分 ...

  10. Unity中判断地图上两点之间相对于正北方向的角度 c#实现

    由于最近项目需要一些关于地理位置展示方面的需要,需要牵涉到地理位置方面与角度之间的计算.文章中参考了大神的代码,但是其是java代码实现的,无法在unity中直接使用.有兴趣的可以直接阅读原文http ...

最新文章

  1. Visual Studio 的代码片段(Code Snippet)功能
  2. php mvc urlencode,PHP – LIUGUOFENG
  3. python程序写完后点哪个运行快_让 Python 代码运行更快的最佳方式!
  4. 【今日CV 视觉论文速览】Part2 1 Feb 2019
  5. 二叉树的创建与遍历(C++)
  6. pwm一个时间单位_通过PWM进行数模转换的滤波电路分析计算
  7. 综述: 通信雷达一体化中的信号处理
  8. C#代码混淆加壳利器ConfuserEx的使用
  9. crosses initialization of “XXX”
  10. visio2003中、origin中、matlab中,字体的大小以pt为单位,与word中的几号字大小是如何对应?
  11. 80004005错误代码_Win7系统提示0X80004005错误代码怎样解决 Win7系统错误代码0x80004005的解决办法...
  12. 高等数学:第三章 微分中值定理与导数的应用(3)泰勒公式
  13. Ipad2022可以用电容笔吗?双十一值得入手电容笔推荐
  14. 基于CNN实现垃圾分类案例
  15. 怎么做抽奖活动_没有公众号怎么做刮刮乐链接
  16. linux中etc目录的英文全称
  17. 如何查看网站是否被百度(搜索引擎)收录
  18. 二十岁,无资本,无未来 --《意林》
  19. npm ERR! code E404 npm ERR! 404 Not Found - GET
  20. bonobo server 自定义

热门文章

  1. nifi服务器间拷贝文件,NIFI Kerberos 认证
  2. C# 获取电脑CPU序列号
  3. 大学四年软件工程专业的学习经验总结
  4. linux无线网卡消失,Linux下无线网卡无法开启解决办法
  5. 高等数学张宇18讲 第十七讲 三重积分、第一型曲线曲面积分
  6. 测试开发是什么?什么是测试开发工程师?
  7. wsimport生成wsdl代码
  8. 中国互联网十大骨干网有哪些?了解互联网的真实网络结构
  9. 哔哩哔哩APP导出缓存视频并合并成MP4
  10. 微信小程序实现智能识别名片