牌型的定义在http://blog.csdn.net/csdn_cjt/article/details/78593140 第一章 这是第三章

下面是代码

 #region isShowOutCardBtnpublic static bool isShowOutCardBtn(List<int> myCards,List<int> lastCards, DDZ_POKER_TYPE lastCardType){// 上一首牌的个数int prevSize = lastCards.Count;int mySize = myCards.Count;// 我先出牌,上家没有牌if (prevSize == 0 && mySize != 0){return true;}// 集中判断是否王炸,免得多次判断王炸if (lastCardType == DDZ_POKER_TYPE.KingBomb){Debug.Log("上家王炸,肯定不能出。");return false;}if (mySize >= 2){List<int> cards = new List<int>();cards.Add(myCards[mySize - 1]);cards.Add(myCards[mySize - 2]);if (DDZCardRule.IsJokerBoom(cards)){return true;}}// 集中判断对方不是炸弹,我出炸弹的情况if (lastCardType != DDZ_POKER_TYPE.FourBomb){//if (mySize < 4)           //SbBug  害的我找半天//{//    Debug.Log("炸弹false");//    return false;//}if (mySize > 4) {for (int i = 0; i < mySize - 3; i++){int grade0 = myCards[i];int grade1 = myCards[i + 1];int grade2 = myCards[i + 2];int grade3 = myCards[i + 3];if (grade1 == grade0 && grade2 == grade0&& grade3 == grade0){return true;}}}}int prevGrade = lastCards[0];Debug.Log("prevGrade"+prevGrade);// 比较2家的牌,主要有2种情况,1.我出和上家一种类型的牌,即对子管对子;// 2.我出炸弹,此时,和上家的牌的类型可能不同// 王炸的情况已经排除// 上家出单if (lastCardType == DDZ_POKER_TYPE.Single){// 一张牌可以大过上家的牌for (int i = mySize - 1; i >= 0; i--){int grade = myCards[i];Debug.Log("grade" + grade);if (grade > prevGrade){// 只要有1张牌可以大过上家,则返回truereturn true;}}}// 上家出对子else if (lastCardType == DDZ_POKER_TYPE.Twin){// 2张牌可以大过上家的牌for (int i = mySize - 1; i >= 1; i--){int grade0 = myCards[i];int grade1 = myCards[i-1];if (grade0 == grade1){if (grade0 > prevGrade){// 只要有1对牌可以大过上家,则返回truereturn true;}}}}// 上家出3不带else if (lastCardType == DDZ_POKER_TYPE.Triple){// 3张牌可以大过上家的牌for (int i = mySize - 1; i >= 2; i--){int grade0 = myCards[i];int grade1 = myCards[i - 1];int grade2 = myCards[i - 2];if (grade0 == grade1 && grade0 == grade2){if (grade0 > prevGrade){// 只要3张牌可以大过上家,则返回truereturn true;}}}}// 上家出3带1else if (lastCardType == DDZ_POKER_TYPE.TripleWithSingle){// 3带1 3不带 比较只多了一个判断条件if (mySize < 4){return false;}// 3张牌可以大过上家的牌for (int i = mySize - 1; i >= 2; i--){int grade0 = myCards[i];int grade1 = myCards[i - 1];int grade2 = myCards[i - 2];if (grade0 == grade1 && grade0 == grade2){if (grade0 > lastCards[1]){// 只要3张牌可以大过上家,则返回truereturn true;}}}}// 上家出3带2else if (lastCardType == DDZ_POKER_TYPE.TripleWithTwin){// 3带1 3不带 比较只多了一个判断条件if (mySize < 5){return false;}// 3张牌可以大过上家的牌for (int i = mySize - 1; i >= 2; i--){int grade0 = myCards[i];int grade1 = myCards[i - 1];int grade2 = myCards[i - 2];if (grade0 == grade1 && grade0 == grade2){if (grade0 > lastCards[2]){// 只要3张牌可以大过上家,则返回true      ----------------------------这里需要判断除了这三张是否拥有对子myCards.RemoveAt(i);myCards.RemoveAt(i-1);myCards.RemoveAt(i - 2);for (int j = myCards.Count - 1; j >= 1; j--) {int temp0 = myCards[j];int temp1= myCards[j-1];if (temp0 == temp1){return true;}}}}}}// 上家出炸弹else if (lastCardType == DDZ_POKER_TYPE.FourBomb){// 4张牌可以大过上家的牌for (int i = mySize - 1; i >= 3; i--){int grade0 = myCards[i];int grade1 = myCards[i - 1];int grade2 = myCards[i - 2];int grade3 = myCards[i - 3];if (grade0 == grade1 && grade0 == grade2 && grade0 == grade3){if (grade0 > prevGrade){// 只要有4张牌可以大过上家,则返回truereturn true;}}}}// 上家出4带2 else if (lastCardType == DDZ_POKER_TYPE.FourWithSingle){// 4张牌可以大过上家的牌for (int i = mySize - 1; i >= 3; i--){int grade0 = myCards[i];int grade1 = myCards[i - 1];int grade2 = myCards[i - 2];int grade3 = myCards[i - 3];if (grade0 == grade1 && grade0 == grade2 && grade0 == grade3){// 只要有炸弹,则返回truereturn true;}}}// 上家出顺子else if (lastCardType == DDZ_POKER_TYPE.StraightSingle){if (mySize < prevSize){return false;}else{Hashtable myCardsHash = SortCardUseHash(myCards);if (myCardsHash.Count< prevSize) {Debug.Log("hash的总数小于顺子的count 肯定fales");return false;}List<int> myCardsHashKey = new List<int>();foreach (int key in myCardsHash.Keys){myCardsHashKey.Add(key);}myCardsHashKey.Sort();for (int i = myCardsHashKey.Count - 1; i >= prevSize - 1; i--){List<int> cards = new List<int>();for (int j = 0; j < prevSize; j++) {cards.Add(myCardsHashKey[myCardsHashKey.Count - 1-i+j]);}DDZ_POKER_TYPE myCardType = DDZ_POKER_TYPE.DdzPass;bool isRule = DDZCardRule.PopEnable(cards, out myCardType);//是不是顺子//Debug.Log();if (myCardType == DDZ_POKER_TYPE.StraightSingle){int myGrade2 = cards[cards.Count - 1];// 最大的牌在最后int prevGrade2 = lastCards[prevSize - 1];// 最大的牌在最后if (myGrade2 > prevGrade2){return true;}}}//List<int> hashKey=//foreach (DictionaryEntry de in myCardsHash)//{//}}}// 上家出连对else if (lastCardType == DDZ_POKER_TYPE.StraightTwin){if (mySize < prevSize){return false;}else{Hashtable myCardsHash = SortCardUseHash(myCards);if (myCardsHash.Count < prevSize){Debug.Log("hash的总数小于顺子的count 肯定fales");return false;}List<int> myCardsHashKey = new List<int>();foreach (int key in myCardsHash.Keys){myCardsHashKey.Add(key);}myCardsHashKey.Sort();for (int i = myCardsHashKey.Count - 1; i >= prevSize - 1; i--){List<int> cards = new List<int>();for (int j = 0; j < prevSize; j++){cards.Add(myCardsHashKey[myCardsHashKey.Count - 1 - i + j]);}DDZ_POKER_TYPE myCardType = DDZ_POKER_TYPE.DdzPass;bool isRule = DDZCardRule.PopEnable(cards, out myCardType);if (myCardType == DDZ_POKER_TYPE.StraightSingle){int myGrade2 = cards[cards.Count - 1];// 最大的牌在最后int prevGrade2 = lastCards[prevSize - 1];// 最大的牌在最后if (myGrade2 > prevGrade2){for (int ii = 0; ii < cards.Count; ii++) {if ((int)myCardsHash[cards[ii]] < 2){Debug.Log("是顺子但不是双顺");return false;}else {return true;}}}}}}}//上家出飞机else if (lastCardType == DDZ_POKER_TYPE.PlanePure){if (mySize < prevSize){return false;}else{for (int i = 0; i <= mySize - prevSize; i++){List<int> cards = new List<int>();for (int j = 0; j < prevSize; j++){cards.Add(myCards[i + j]);}DDZ_POKER_TYPE myCardType = DDZ_POKER_TYPE.DdzPass;bool isRule = DDZCardRule.PopEnable(cards, out myCardType);if (myCardType == DDZ_POKER_TYPE.PlanePure){int myGrade4 = cards[4];//int prevGrade4 = lastCards[4];//if (myGrade4 > prevGrade4){return true;}}}}}//上家出飞机带单else if (lastCardType == DDZ_POKER_TYPE.PlaneWithSingle){if (mySize < prevSize){return false;}else{for (int i = 0; i <= mySize-prevSize; i++){List<int> cards = new List<int>();for (int j = 0; j < prevSize-(prevSize/4); j++){cards.Add(myCards[i + j]);}DDZ_POKER_TYPE myCardType = DDZ_POKER_TYPE.DdzPass;bool isRule = DDZCardRule.PopEnable(cards, out myCardType);if (myCardType == DDZ_POKER_TYPE.PlanePure){int myGrade4 = cards[4];//int prevGrade4 = lastCards[4];//if (myGrade4 > prevGrade4){return true;}}}}}//上家出飞机带双else if (lastCardType == DDZ_POKER_TYPE.PlaneWithTwin){if (mySize < prevSize){return false;}else{for (int i = 0; i <= mySize - prevSize; i++){List<int> cards = new List<int>();for (int j = 0; j < prevSize - (prevSize / 5); j++){cards.Add(myCards[i + j]);}DDZ_POKER_TYPE myCardType = DDZ_POKER_TYPE.DdzPass;bool isRule = DDZCardRule.PopEnable(cards, out myCardType);if (myCardType == DDZ_POKER_TYPE.PlanePure){int myGrade4 = cards[4];//int prevGrade4 = lastCards[4];//if (myGrade4 > prevGrade4){List<int> tempTwoList = new List<int>();for (int ii = 0; ii < cards.Count; ii++){int tempInt = 0;for (int j = 0; j < cards.Count; j++){if (cards[ii] == cards[j]){tempInt++;}}if (tempInt == 2){tempTwoList.Add(cards[ii]);}}if (tempTwoList.Count / 2 < prevSize / 5){return false;}else {return true;}}}}}}// 默认不能出牌return false;}#endregion

下面提供一些方法使用

 private static bool compareGrade(int grade1, int grade2){return grade1 > grade2;}#region 使用哈希去存所有的牌  顺子连对用 不用存2 王/// <summary>/// 使用哈希去存所有的牌/// </summary>/// <param name="ownCards"></param>/// <returns></returns>public static Hashtable SortCardUseHash(List<int> cards){Hashtable temp = new Hashtable();List<int> tempJoker = new List<int>();for (int i = 0; i < cards.Count; i++){if (cards[i] == 53){cards.RemoveAt(i);}}for (int i = 0; i < cards.Count; i++){if (cards[i] == 54){cards.RemoveAt(i);}}for (int i = 0; i < cards.Count; i++){if (cards[i] == 13){cards.RemoveAt(i);}}for (int i = 0; i < cards.Count; i++){if (temp.Contains(cards[i])){temp[cards[i]] = (int)temp[cards[i]] + 1;}else {temp.Add(cards[i], 1);}}return temp;}#endregion#region 使用哈希存所有牌 key 权重  value个数public static Hashtable SortCardUseHash1(List<int> cards){Hashtable temp = new Hashtable();for (int i = 0; i < cards.Count; i++){if (temp.Contains(cards[i])){temp[cards[i]] = (int)temp[cards[i]] + 1;}else{temp.Add(cards[i], 1);}}return temp;}#endregion

unity开发 斗地主算法—判断手里的牌是否有大于上家的牌(是否显示要不起按钮)相关推荐

  1. unity开发 斗地主算法—提示AI(提示出牌)

    牌型的定义在http://blog.csdn.net/csdn_cjt/article/details/78593140 第一章 这是第四章 下面是代码 #region 提示出牌 public sta ...

  2. unity开发 斗地主算法—比较两个手牌的大小

    牌型的定义在http://blog.csdn.net/csdn_cjt/article/details/78593140 第一章 这是第二章 下面是代码 #region isSelectCardCan ...

  3. Unity开发-网络.算法.平台相关知识!

    A. 网络相关知识 一.TCP 1.面向数据流.可靠.能保证消息到达顺序. 2.滑动窗口.控制发送量,发送方只能发送窗口内大小的数据包.防止发送方发送的数据过多,接收方无法处理的情况. 3.Nagle ...

  4. 斗地主老是输?一起用Python做个自动出牌器,欢乐豆蹭蹭涨!

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接: https://blog.csdn.net/hhladminhhl/article/ ...

  5. 斗地主老是输?Python教你做个自动出牌器,欢乐豆蹭蹭涨

    前言 首先一起来看看AI斗地主出牌器的效果: 下面,我们开始介绍这个AI出牌器的制作过程. 一.核心功能设计 首先我们这款出牌器是基于DouZero开发的,核心是需要利用训练好的AI模型来帮住我们,给 ...

  6. 斗地主老是输?一起用Python做个AI出牌器!

    前言 最近在网上看到一个有意思的开源项目,基于快手团队开发的开源AI斗地主--DouZero做的一个"成熟"的AI,项目开源地址[https://github.com/tianqi ...

  7. 斗地主老是输?一起用Python做个AI出牌器,欢乐豆蹭蹭涨

    前言 最近在网上看到一个有意思的开源项目,快手团队开发的开源AI斗地主--DouZero.今天我们就一起来学习制作一个基于DouZero的欢乐斗地主出牌器,看看AI是如何来帮助我们斗地主,赢欢乐豆,实 ...

  8. 棋牌游戏开发之地主算法判断牌型

    棋牌游戏开发咨询 QQ:325131039 棋牌游戏开发咨询交流群: 490287966 由于近年来网络棋牌游戏的火爆导致个各个地区的特色棋牌游戏进入开发的红火时期,也有越来越多的团队个人开始研究棋牌 ...

  9. Unity 网络斗地主 牌的一些算法

    Unity 网络斗地主  牌的一些算法 在这儿说一下,我的项目是用svn的方式,上传在 https://v2.svnspot.com/18666451713.doudizhu这个svn上,大家可以下载 ...

  10. Java斗地主算法的设计与实现_斗地主算法的设计与实现–洗牌和发牌

    本篇将给出斗地主算法的源码,介绍斗地主这个项目的一些基本情况. 下载地址:http://download.csdn.net/detail/fansunion/6387589 特别说明:斗地主项目的主要 ...

最新文章

  1. 刀片服务器与机架服务器对比
  2. 1Python进阶强化训练之装饰器使用技巧进阶
  3. PHPMailer配置QQ邮箱163邮箱和谷歌邮箱发送邮件
  4. 调度器的精髓--优先级下兼顾公平
  5. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第8章-鲁棒方差控制
  6. 烦人的Facebook分享授权
  7. 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法
  8. CVPR2020 | 参数量减半,北大开源全新高效空域转换模块,还原图像逼真细节
  9. springMVC_07乱码及restful风格
  10. osgi 模块化_OSGI –模块化您的应用程序
  11. centos7 python3.6编译安装
  12. Number Sequence (KMP的应用)
  13. 深度学习(十七)基于改进Coarse-to-fine CNN网络的人脸特征点定位
  14. Atitit 边缘检测原理attilax总结
  15. 古体字与简体字对照表_简体字与繁体字对照表大全.pdf
  16. java实现的PC小说下载器+阅读器
  17. 京沪高铁全程提供WiFi无线网络技术揭密
  18. 想学习编程但是看不懂代码该怎么办
  19. ToggleButton的用法
  20. 使用MATLAB的EEGLAB和BCT工具箱画脑网络连接图

热门文章

  1. Microbiome:根际微生物影响植物开花时间
  2. DOORS 和Reqtify — 需求管理和需求追溯工具
  3. dci odbc mysql_人大金仓-
  4. php追加append,PHP ArrayObject append()用法及代码示例
  5. L13.linux命令每日一练 -- 第二章 文件和目录操作命令 -- lsattr和file命令
  6. org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 文件提前结
  7. 鼠标单击变双击补丁(含C++代码)
  8. Nacos 日志文件堆满磁盘空间处理方案
  9. 【python】db.Column(db.Integer, primary_key=True, autoincrement=True)
  10. python查询12306余票_Python爬虫----12306火车票余票查询器