unity c#斗地主算法计算牌型
斗地主前端核心算法有以下四个
1:计算牌型
2:牌型之间的比较大小
3:是否显示要不起按钮
4:提示出牌AI
今天更新计算牌型
下面是代码(抄袭了网上一部分)
这是牌的所有类型 我这边四带二单 ,四带二个对子合成一个,四带二个对子不算牌型 所有四带2用FourWithSingle 结构是protobuf类型的
//单张1,对子2,三张3,三带单4,三带对5,单顺6,双顺7,飞机8,飞机带单9,飞机带双10,四带两单11,四带对12,炸弹13,火箭14
enum DDZ_POKER_TYPE {DDZ_PASS = 0; //过牌,不出SINGLE = 1;TWIN = 2;TRIPLE = 3;TRIPLE_WITH_SINGLE = 4;TRIPLE_WITH_TWIN = 5;STRAIGHT_SINGLE = 6;STRAIGHT_TWIN = 7;PLANE_PURE = 8;PLANE_WITH_SINGLE = 9;PLANE_WITH_TWIN = 10;FOUR_WITH_SINGLE = 11;FOUR_WITH_TWIN = 12;FOUR_BOMB = 13;KING_BOMB = 14;
}
计算牌型代码 cards 是泛型 你可以修改为ArrayList
using Pb;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 出牌规则
/// </summary>
public class DDZCardRule
{/// <summary>/// 是否是单/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool IsSingle(List<int> cards){if (cards.Count == 1)return true;elsereturn false;}/// <summary>/// 是否是对子/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool IsDouble(List<int> cards){if (cards.Count == 2){if (cards[0] == cards[1])return true;}return false;}/// <summary>/// 是否是顺子/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool IsStraight(List<int> cards){if (cards.Count < 5 || cards.Count > 12)return false;for (int i = 0; i < cards.Count - 1; i++){int w = cards[i];if (cards[i + 1] - w != 1)return false;//不能超过Aif (w > 12 || cards[i + 1]> 12)return false;}return true;}/// <summary>/// 是否是双顺子/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool IsDoubleStraight(List<int> cards){if (cards.Count < 6 || cards.Count % 2 != 0)return false;for (int i = 0; i < cards.Count; i += 2){if (cards[i + 1] != cards[i])return false;if (i < cards.Count - 2){if (cards[i + 2] - cards[i] != 1)return false;//不能超过Aif (cards[i] > 12 || cards[i + 2] > 12)return false;}}return true;}/// <summary>/// 三不带/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool IsOnlyThree(List<int> cards){if (cards.Count % 3 != 0)return false;if (cards[0] != cards[1])return false;if (cards[1] != cards[2])return false;if (cards[0] != cards[2])return false;return true;}/// <summary>/// 三带一/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool IsThreeAndOne(List<int> cards){if (cards.Count != 4)return false;if (cards[0] == cards[1] &&cards[1] == cards[2])return true;else if (cards[1] == cards[2] &&cards[2] == cards[3])return true;return false;}/// <summary>/// 三代二/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool IsThreeAndTwo(List<int> cards){if (cards.Count != 5)return false;if (cards[0] == cards[1] &&cards[1] == cards[2]){if (cards[3] == cards[4])return true;}else if (cards[2] == cards[3] &&cards[3] == cards[4]){if (cards[0] == cards[1])return true;}return false;}/// <summary>/// 炸弹/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool IsBoom(List<int> cards){if (cards.Count != 4)return false;if (cards[0] != cards[1])return false;if (cards[1] != cards[2])return false;if (cards[2] != cards[3])return false;return true;}/// <summary>/// 王炸/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool IsJokerBoom(List<int> cards){if (cards.Count != 2)return false;if (cards[0] == 53){if (cards[1] == 54)return true;return false;}else if (cards[0] == 54){if (cards[1] ==53)return true;return false;}return false;}/// <summary>/// 飞机不带/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool IsTripleStraight(List<int> cards){if (cards.Count < 6 || cards.Count % 3 != 0)return false;for (int i = 0; i < cards.Count; i += 3){if (cards[i + 1] != cards[i])return false;if (cards[i + 2] != cards[i])return false;if (cards[i + 1] != cards[i + 2])return false;if (i < cards.Count - 3){if (cards[i + 3] - cards[i] != 1)return false;//不能超过Aif (cards[i] > 12 || cards[i + 3] > 12)return false;}}return true;}/// <summary>/// 飞机带单/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool isPlaneWithSingle(List<int> cards){if (!HaveFour(cards)) {List<int> tempThreeList = new List<int>();for (int i = 0; i < cards.Count; i++){int tempInt = 0;for (int j = 0; j < cards.Count; j++){if (cards[i] == cards[j]){tempInt++;}}if (tempInt == 3){tempThreeList.Add(cards[i]);}}if (tempThreeList.Count % 3 != cards.Count % 4){return false;}else {if (IsTripleStraight(tempThreeList)){return true;}else {return false;}}}return false;}/// <summary>/// 飞机带双/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool isPlaneWithTwin(List<int> cards){if (!HaveFour(cards)){List<int> tempThreeList = new List<int>();List<int> tempTwoList = new List<int>();for (int i = 0; i < cards.Count; i++){int tempInt = 0;for (int j = 0; j < cards.Count; j++){if (cards[i] == cards[j]){tempInt++;}}if (tempInt == 3){tempThreeList.Add(cards[i]);}else if (tempInt==2) {tempTwoList.Add(cards[i]);}}if (tempThreeList.Count % 3 != cards.Count % 5&& tempTwoList.Count%2!= cards.Count % 5){return false;}else{if (IsTripleStraight(tempThreeList)){if (IsAllDouble(tempTwoList)){return true;}else {return false;}}else{return false;}}}return false;}/// <summary>/// 判断牌里面是否是拥有4张牌/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool HaveFour(List<int> cards) {for (int i = 0; i < cards.Count; i++){int tempInt = 0;for (int j = 0; j < cards.Count; j++){if (cards[i] == cards[j]){tempInt++;}}if (tempInt == 4){return true;}}Debug.Log(false);return false;}/// <summary>/// 判断牌里面全是对子/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool IsAllDouble(List<int> cards){for (int i = 0; i < cards.Count % 2; i += 2) {if (cards[i] != cards[i + 1]) {return false;}}return true;}/// <summary>/// 判断是否是四带二/// </summary>/// <param name="cards"></param>/// <returns></returns>public static bool isSiDaiEr(List<int> cards){bool flag = false;if (cards != null && cards.Count== 6){for (int i = 0; i < 3; i++){int grade1 = cards[i];int grade2 = cards[i+1];int grade3 = cards[i+2];int grade4 = cards[i+3];if (grade2 == grade1 && grade3 == grade1 && grade4 == grade1){flag = true;}}}return flag;}/// <summary>/// 判断是否符合出牌规则/// </summary>/// <param name="cards"></param>/// <param name="type"></param>/// <returns></returns>public static bool PopEnable(List<int> cards, out DDZ_POKER_TYPE type){type = DDZ_POKER_TYPE.DdzPass;bool isRule = false;switch (cards.Count){case 1:isRule = true;type = DDZ_POKER_TYPE.Single;break;case 2:if (IsDouble(cards)){isRule = true;type = DDZ_POKER_TYPE.Twin;}else if (IsJokerBoom(cards)){isRule = true;type = DDZ_POKER_TYPE.KingBomb;}break;case 3:if (IsOnlyThree(cards)){isRule = true;type = DDZ_POKER_TYPE.Triple;}break;case 4:if (IsBoom(cards)){isRule = true;type = DDZ_POKER_TYPE.FourBomb;}else if (IsThreeAndOne(cards)){isRule = true;type = DDZ_POKER_TYPE.TripleWithSingle;}break;case 5:if (IsStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightSingle;}else if (IsThreeAndTwo(cards)){isRule = true;type = DDZ_POKER_TYPE.TripleWithTwin;}break;case 6:if (IsStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightSingle;}else if (IsTripleStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.PlanePure;}else if (IsDoubleStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightTwin;}else if (isSiDaiEr(cards)){isRule = true;type = DDZ_POKER_TYPE.FourWithSingle; //四带二}break;case 7:if (IsStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightSingle;}break;case 8:if (IsStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightSingle;}else if (IsDoubleStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightTwin;}else if (isPlaneWithSingle(cards)){isRule = true;type = DDZ_POKER_TYPE.PlaneWithSingle; //飞机带单}break;case 9:if (IsStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightSingle;}else if (IsTripleStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.PlanePure;}break;case 10:if (IsStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightSingle;}else if (IsDoubleStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightTwin;}else if (isPlaneWithTwin(cards)) //飞机带对{isRule = true;type = DDZ_POKER_TYPE.PlaneWithTwin;}break;case 11:if (IsStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightSingle;}break;case 12:if (IsStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightSingle;}else if (IsDoubleStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightTwin;}else if (isPlaneWithSingle(cards)){isRule = true;type = DDZ_POKER_TYPE.PlaneWithSingle; //飞机带单}else if (IsTripleStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.PlanePure;}break;case 13:break;case 14:if (IsDoubleStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightTwin;}break;case 15:if (IsTripleStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.PlanePure;}else if (isPlaneWithTwin(cards)) //飞机带对{isRule = true;type = DDZ_POKER_TYPE.PlaneWithTwin;}break;case 16:if (IsDoubleStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightTwin;}else if (isPlaneWithSingle(cards)){isRule = true;type = DDZ_POKER_TYPE.PlaneWithSingle; //飞机带单}break;case 17:break;case 18:if (IsDoubleStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightTwin;}else if (IsTripleStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.PlanePure;}break;case 19:break;case 20:if (IsDoubleStraight(cards)){isRule = true;type = DDZ_POKER_TYPE.StraightTwin;}else if (isPlaneWithSingle(cards)){isRule = true;type = DDZ_POKER_TYPE.PlaneWithSingle; //飞机带单}else if (isPlaneWithTwin(cards)) //飞机带对{isRule = true;type = DDZ_POKER_TYPE.PlaneWithTwin;}break;default:break;}return isRule;}
}
下个星期之前我会陆续更新
2:牌型之间的比较大小
3:是否显示要不起按钮
4:提示出牌AI
学习交流Q群479853988
招聘Q群 79990632
游戏发包接包Q群 9837954
unity c#斗地主算法计算牌型相关推荐
- python斗地主出牌算法_斗地主之用蚁群算法整理牌型:如何进行牌力估计
我们在前面讲到过,各牌手的牌力估计就是我们在用蚁群算法构造最优牌型时的启发性知识.启发性知识其实就是我们利用自己的经验对事物做出的判优性评估,或者说就是对事物价值的判断. 原则上,应用蚁群算法需要用到 ...
- 斗地主之用蚁群算法整理牌型-如何进行牌力估计
我们在前面讲到过,各牌手的牌力估计就是我们在用蚁群算法构造最优牌型时的启发性知识.启发性知识其实就是我们利用自己的经验对事物做出的判优性评估,或者说就是对事物价值的判断. 原则上,应用蚁群算法需要用到 ...
- unity开发 斗地主算法—提示AI(提示出牌)
牌型的定义在http://blog.csdn.net/csdn_cjt/article/details/78593140 第一章 这是第四章 下面是代码 #region 提示出牌 public sta ...
- unity开发 斗地主算法—比较两个手牌的大小
牌型的定义在http://blog.csdn.net/csdn_cjt/article/details/78593140 第一章 这是第二章 下面是代码 #region isSelectCardCan ...
- 棋牌游戏开发之地主算法判断牌型
棋牌游戏开发咨询 QQ:325131039 棋牌游戏开发咨询交流群: 490287966 由于近年来网络棋牌游戏的火爆导致个各个地区的特色棋牌游戏进入开发的红火时期,也有越来越多的团队个人开始研究棋牌 ...
- 炸金花游戏功能的实现(发牌,计算牌型,比牌)——python2.7
最近在尝试做一款棋牌类游戏项目,看到炸金花的玩法后,就自己先写出炸金花的基本功能实现,给那些python爱好者参考一下. 炸金花是民间非常流行的一种扑克牌玩法,它具有独特的比牌规则,玩家按照规则以手中 ...
- 算法题 牌型判断 Java
题目 德州扑克的花型由 N 张扑克牌组成 0<N<8,可以组成的牌型按照价值从高到低来区分分别为: 皇家同花顺:最高为 Ace (一点)的同花顺. 如 A K Q J 10 的同花顺 同花 ...
- 德州扑克计算牌型以及分值大小
<?php/*** 生成52张扑克,随机5张公共牌,2张手牌* $sp = poker(); for ($i=1; $i <=12 ; $i++) { echo current($sp); ...
- Botzone斗地主算法的简单思路
深搜+评估+特例优化 (在积分赛的表现大概处于20名左右的位置.)现在的天梯排名10名左右,不是该版本. 如果可以用机器学习的方法优化参数就好了,虽然开发了对战平台,但并没有用于炼丹.后附实现代码,对 ...
- 斗地主AI算法——第六章の牌型判断
本章实现了上一章提到的检查当前是否只是一手牌函数ins_SurCardsType /* 检查剩余的牌是否只是一手牌是: 返回手牌类型数据 不是:返回错误类型(cgERROR) */ CardGroup ...
最新文章
- pandasDataFrame 的定位指定文件
- HTML form 标签的 action 属性
- HDU2724 Tree【最小生成树】
- IIS问题解决之——无法访问数据库
- ios RunLoop 用法
- emui换鸿蒙内核,华为EMUI 11.1三月上线,安卓内核替换为鸿蒙内核
- ho1365_共享力量的四种方法,而不是ho积
- 不写一行代码,基于Jmeter打造性能测试数据平台
- 判断字符串中是否含有并一个字符或字符串
- Git_自定义Git
- 云服务器装teamviewer
- html一级子元素,获取子元素_html/css_WEB-ITnose
- 一枚php大马放送~
- 如何做好ASO应用优化?ios如何aso优化,android aso 优化
- Spark Streaming简单入门(示例+原理)
- 如何做二维码批量又快速
- 盛唐气象:李白的诗与酒
- 计算机组成原理——数据通路实例
- 网易2018校园招聘:魔法币 [python]
- GB28181-2016 协议(一)
热门文章
- 服务器装系统认不得硬盘,装系统的时候认不到硬盘的解决方法
- 论计算机在化工过程控制中的应用,计算机在化工中的应用论文正稿.doc
- python偏最小二乘法公式,python3 偏最小二乘法实现
- nanomsg交叉编译
- DIV 内容上下居中
- Photoshop CC 2019暂存盘不足无法打开
- 自学c语言资料,自学c语言(全套资料).doc
- python开根号_python的开根号
- coap 返回版本信息_CoAP协议浅析
- linux如何装coap协议,coap协议源码安装与测试