十三水中各种牌型判断LUA版

近期回归程序行业,由于业务需求需要做十三水游戏,什么是十三水就不在多讲,下面是判断十三水牌型的方法(带大小王)

GetSSSPaiType = {};
local this = GetSSSPaiType;
local huaseTable = {};
local numTable = {};
function GetSSSPaiType.Gtetype(cardList)--首先清空数组huaseTable = {};numTable = {};--格式化牌for i,card in ipairs(cardList) dolocal num,huase = GetPokerHasJoker(card)table.insert(huaseTable,huase);table.insert(numTable,num);end--获取是第几墩牌需要判断if(#cardList==3)then --是头道 只判断是三条顺子或者散牌 头道只需要判断是三条还是对子return SSSPaiData[this.GtetSanZhangype(numTable)].imageName;elseif (#cardList==5)thenreturn SSSPaiData[this.GtetWuZhangType(huaseTable,numTable)].imageName;elsereturn SSSPaiData[SSSPaiType.Error].imageName; --数组越界 returnend
end
function GetSSSPaiType.GtetSanZhangype(cards) --判断头道是否三条if cards[1] == cards[2] and cards[1]==cards[3]then --是三条return SSSPaiType.SanTiao;elseif cards[1] == cards[2] or cards[1] == cards[3] or cards[3] == cards[2] then --是对子return SSSPaiType.DuiZi;else 			--是散牌return SSSPaiType.SanPai;endend
end
--牌大小优先级 五同>同花顺>炸弹>葫芦>同花>顺子>三条>两对>对子>散牌
function GetSSSPaiType.GtetWuZhangType(huaNums,dianNums) --五张牌需要两个参数 花色和点数if(table.ContainsValue(dianNums,0))then --带王 特殊判断table.RemoveValue(dianNums, 0) --首先吧王移除 table.RemoveValue(huaNums, 5) --花色也需要移除if (table.ContainsValue(dianNums,0))then --再次判断是否有王 防止有两个王 --有两个王table.RemoveValue(dianNums, 0) 	--有两个王再次移除掉王table.RemoveValue(huaNums, 5) --花色也需要移除if(this.isWuTongHasTwoJoker(dianNums))then --两个王 是五同return SSSPaiType.WuTong;elseif(this.isTongHuaHasTwoJoker(huaNums) and this.isShunZi(dianNums) and table.getrepeat(dianNums)==3)then --同花顺return SSSPaiType.TongHuaShun;elseif(this.isTeShuShunZiHasTwoJoker(dianNums) and this.isTongHuaHasTwoJoker(dianNums)) then --特殊同花顺return SSSPaiType.ShunZi;elseif(this.isZhaDanHasTwoJoker(dianNums))then --是炸弹return SSSPaiType.ZhaDan;elseif(this.isTongHuaHasTwoJoker(dianNums))then --同花return SSSPaiType.TongHua;elseif(this.isShunZi(dianNums))then --顺子return SSSPaiType.ShunZi;elseif(this.isTeShuShunZiHasTwoJoker(dianNums))then --特殊顺子return SSSPaiType.ShunZi;elsereturn SSSPaiType.SanTiao;  --有两个王 最次也是个三条 不能是葫芦endelse 	--只有一个王if(this.isWuTongHasOneJoker(dianNums))then --一个王 是五同return SSSPaiType.WuTong;elseif (this.isTongHuaHasOneJoker(huaNums) and this.isShunZi(dianNums) and table.getrepeat(dianNums)==4)then --是同花顺return SSSPaiType.TongHuaShun;elseif(this.isTeShuShunZiHasOneJoker(dianNums)and this.isTongHuaHasOneJoker(huaNums))then --特殊同花顺return SSSPaiType.TongHuaShun;elseif(this.isZhaDanHasOneJoker(dianNums))then --是炸弹return SSSPaiType.ZhaDan; elseif(this.isHuLuHasOneJoker(dianNums))then --是葫芦return SSSPaiType.HuLu; elseif(this.isTongHuaHasOneJoker(huaNums) and not this.isShunZi(dianNums))then --是同花 但不是顺子return SSSPaiType.TongHua;elseif(this.isShunZi(dianNums) and not this.isTongHuaHasOneJoker(huaNums) and table.getrepeat(dianNums)==4)then --是顺子 但不同花return SSSPaiType.ShunZi;elseif(this.isTeShuShunZiHasOneJoker(dianNums)and not this.isTongHuaHasOneJoker(huaNums))then --特殊顺子 但不是同花return SSSPaiType.ShunZi;elseif(this.isSnaTiaoHasOneJoker(dianNums))then --是三条return SSSPaiType.SanTiao; elseif(this.isLiangDuiHasOneJoker(dianNums))then --是两对return SSSPaiType.LiangDui; elsereturn SSSPaiType.DuiZi; --有一个王 最低也是个对子endendelse 									--不带王 直接判断if(this.isWuTong(dianNums))then 		--是五同return SSSPaiType.WuTong;elseif(this.isShunZi(dianNums) and this.isTongHua(huaNums))then --是同花顺return SSSPaiType.TongHuaShun;elseif(this.isTeShuShunZi(dianNums) and this.isTongHua(huaNums))then --特殊同花顺return SSSPaiType.ShunZi;elseif(this.isZhaDan(dianNums))then --炸弹return SSSPaiType.ZhaDan;elseif(this.isHuLu(dianNums)) then --是葫芦return SSSPaiType.HuLu;elseif(this.isTongHua(huaNums))then 	--是同花return SSSPaiType.TongHua;elseif(this.isShunZi(dianNums) and table.getrepeat(dianNums)==5)then 	--只有连续的数才是顺子 不能有重复的 return SSSPaiType.ShunZi;elseif(this.isTeShuShunZi(dianNums))then --12345也是顺子return SSSPaiType.ShunZi;elseif(this.isSanTiao(dianNums))then --是三条return SSSPaiType.SanTiao;elseif(this.isLiangDui(dianNums))then 	--是两对return SSSPaiType.LiangDui;elseif(this.isDuiZi(dianNums))then --不对子return SSSPaiType.DuiZi;elsereturn SSSPaiType.SanPai;endendend
--判断是否顺子 带王
function GetSSSPaiType.isShunZi(paiNums)local n = #paiNums--计算0的数量local joker = 0for i=1,n doif paiNums[i] == 0 thenjoker = joker + 1endend--排序local sortt = function(a, b)return a < bendtable.sort(paiNums,sortt)local pre = paiNums[1]--计算总的补充数量local x = 0for i=2,n dolocal tx = paiNums[i] - prex = x + tx - 1pre = paiNums[i]end--如果x比0的数量少,那么可以将数列补充成连续的if x <= joker then --是顺子return true;else--不是顺子return false;end
end
--12345也是顺子 特殊判断
function GetSSSPaiType.isTeShuShunZi(paiNums)local teshu = {2,3,4,5,14};table.sort(paiNums)if(table.isEquation(teshu,paiNums))thenreturn true;elsereturn false;end
end
--是否同花
function GetSSSPaiType.isTongHua(huaNums)if(huaNums[1]==huaNums[2] and huaNums[1]==huaNums[3] and huaNums[1]==huaNums[3] and huaNums[1]==huaNums[4] and huaNums[1]==huaNums[5]) thenreturn true;elsereturn false;end
end
--是否五同
function GetSSSPaiType.isWuTong(paiNums)if(paiNums[1]==paiNums[2] and paiNums[1]==paiNums[3] and paiNums[1]==paiNums[3] and paiNums[1]==paiNums[4] and paiNums[1]==paiNums[5]) thenreturn true;elsereturn false;endreturn false;
end
--判断是否葫芦
function GetSSSPaiType.isHuLu(paiNums)if paiNums[1] == paiNums[2] and paiNums[1] == paiNums[3] thenif paiNums[4] == paiNums[5] thenreturn trueendendif paiNums[3] == paiNums[4] and paiNums[3] == paiNums[5] thenif paiNums[1] == paiNums[2] thenreturn trueendendreturn false
end
--判断是否三条
function GetSSSPaiType.isSanTiao(paiNums)table.sort(paiNums)if(paiNums[1]==paiNums[2]and paiNums[2]==paiNums[3])then return true;elseif(paiNums[2]==paiNums[3]and paiNums[3]==paiNums[4])then return true;elseif(paiNums[3]==paiNums[4]and paiNums[4]==paiNums[5])then return true;elsereturn falseend
end
--判断是否炸弹
function GetSSSPaiType.isZhaDan(paiNums)table.sort(paiNums) --避免浪费性能 排序后单牌只会在1或者5if paiNums[1] == paiNums[2] and paiNums[1] == paiNums[3] and paiNums[1] == paiNums[4] thenreturn trueelseif paiNums[2] == paiNums[3] and paiNums[2] == paiNums[4] and paiNums[2] == paiNums[5] thenreturn trueelsereturn falseend
end
--判断是否两对
function GetSSSPaiType.isLiangDui(paiNums)table.sort(paiNums) --避免浪费性能 排序后单牌只会在1 3 5if paiNums[1] == paiNums[2] and paiNums[4] == paiNums[5] thenreturn trueelseif paiNums[2] == paiNums[3] and paiNums[4] == paiNums[5] thenreturn trueelseif paiNums[1] == paiNums[2] and paiNums[2] == paiNums[3] thenreturn trueelsereturn falseend
end
--判断是否是对子 没有王
function GetSSSPaiType.isDuiZi(paiNums)table.sort(paiNums)if(paiNums[1]==paiNums[2] or paiNums[2]==paiNums[3] or paiNums[3]==paiNums[4] or paiNums[4]==paiNums[5])then return trueelsereturn falseend
end
-------------------------有一个王判断-------------------------
--判断是否五同 有一个王
function GetSSSPaiType.isWuTongHasOneJoker(paiNums)if (paiNums[1]==paiNums[2] and paiNums[1]==paiNums[3] and paiNums[1]==paiNums[4])thenreturn trueelsereturn falseend
end
--判断是否同花 有一个王
function GetSSSPaiType.isTongHuaHasOneJoker(huaNums)if(huaNums[1]==huaNums[2] and huaNums[1]==huaNums[3] and huaNums[1]==huaNums[4])thenreturn trueelsereturn falseend
end
--判断是否特殊顺子 有一个王 就是和王能组成A2345的顺子
function GetSSSPaiType.isTeShuShunZiHasOneJoker(paiNums)table.sort(paiNums) --首先吧自己的手牌格式化local teshu1 = {2,3,4,5};local teshu2 = {3,4,5,14};local teshu3 = {2,4,5,14};local teshu4 = {2,3,5,14};local teshu5 = {2,3,4,14};if(table.isEquation(teshu1,paiNums) or table.isEquation(teshu2,paiNums) or table.isEquation(teshu3,paiNums) or table.isEquation(teshu4,paiNums) or table.isEquation(teshu5,paiNums))thenreturn true;elsereturn false;end
end
--判断是否是炸弹 有一个王
function GetSSSPaiType.isZhaDanHasOneJoker(paiNums)table.sort(paiNums) --格式化牌 让散牌在1或者4if(paiNums[1]==paiNums[2] and paiNums[1]==paiNums[3])then return true;elseif(paiNums[2]==paiNums[3] and paiNums[2]==paiNums[4])then return true;elsereturn false;end
end
--判断是否是葫芦 有一个王
function GetSSSPaiType.isHuLuHasOneJoker(paiNums)table.sort(paiNums)if(paiNums[1]==paiNums[2] and paiNums[3] == paiNums[4])then return true;elsereturn false;end
end
--判断是否三条 有一个王
function GetSSSPaiType.isSnaTiaoHasOneJoker(paiNums)table.sort(paiNums)if paiNums[1] == paiNums[2] or paiNums[2] == paiNums[3] or paiNums[3]==paiNums[4] thenreturn trueelsereturn falseend
end
--判断是否两对 有一个王
function GetSSSPaiType.isLiangDuiHasOneJoker(paiNums)table.sort(paiNums)if(paiNums[1]==paiNums[2] or paiNums[2]==paiNums[3] or paiNums[3]==paiNums[4])then return trueelsereturn falseend
end
-------------------------有两个王判断-------------------------
--判断是否五同
function GetSSSPaiType.isWuTongHasTwoJoker(paiNums)if(paiNums[1] == paiNums[2] and paiNums[1] == paiNums[3])then return true;elsereturn false;end
end
--判断是否同花
function GetSSSPaiType.isTongHuaHasTwoJoker(huaNums)if(huaNums[1] == huaNums[2] and huaNums[1] == huaNums[3])then return true;elsereturn false;end
end
--判断是否炸弹
function GetSSSPaiType.isZhaDanHasTwoJoker(paiNums)table.sort(paiNums)if(paiNums[1] == paiNums[2] or paiNums[2] == paiNums[3])then return true;elsereturn false;end
end
--特殊顺子 就是和王能组成A2345的顺子
function GetSSSPaiType.isTeShuShunZiHasTwoJoker(paiNums)table.sort(paiNums)local teshu1 = {2,3,14};local teshu2 = {2,4,14};local teshu3 = {2,5,14};local teshu4 = {3,4,14};local teshu5 = {3,5,14};local teshu6 = {2,3,4};local teshu7 = {2,3,5};local teshu8 = {2,4,5};local teshu9 = {3,4,5};if(table.isEquation(teshu1,paiNums) or table.isEquation(teshu2,paiNums) or table.isEquation(teshu3,paiNums) or table.isEquation(teshu4,paiNums) or table.isEquation(teshu5,paiNums) or table.isEquation(teshu6,paiNums) or table.isEquation(teshu7,paiNums) or table.isEquation(teshu8,paiNums) or table.isEquation(teshu9,paiNums))thenreturn true;elsereturn false;end
end

使用时仅需调用GetSSSPaiType.Gtetype()即可,牌类型如下:

用到的牌型枚举:

SSSPaiData = {};
SSSPaiData[SSSPaiType.SanPai] = {typeName = "散牌",imageName = "sanpai"};
SSSPaiData[SSSPaiType.DuiZi] = {typeName = "对子",imageName = "duizi"};
SSSPaiData[SSSPaiType.LiangDui] = {typeName = "两对",imageName = "liangdui"};
SSSPaiData[SSSPaiType.SanTiao] = {typeName = "三条",imageName = "santiao"};
SSSPaiData[SSSPaiType.ShunZi] = {typeName = "顺子",imageName = "shunzi"};
SSSPaiData[SSSPaiType.TongHua] = {typeName = "同花",imageName = "tonghua"};
SSSPaiData[SSSPaiType.HuLu] = {typeName = "葫芦",imageName = "hulu"};
SSSPaiData[SSSPaiType.ZhaDan] = {typeName = "炸弹",imageName = "zhadan"};
SSSPaiData[SSSPaiType.TongHuaShun] = {typeName = "同花顺",imageName = "tonghuashun"};
SSSPaiData[SSSPaiType.WuTong] = {typeName = "五同",imageName = "tiezhi"};
SSSPaiData[SSSPaiType.Error] = {typeName = "错误",imageName = "error"};

用到的公共方法:可以放本类,也可以放全局,个人认为放全局会方便一点,这样其他地方也可以使用全局进行调用

--切割牌 带王
function GetPokerHasJoker(pkId)local sets = string.split(pkId, "_");local color = tonumber(sets[1]);local num = tonumber(sets[2]);if(num == 1) thennum = 14;endif(color == 5)then --如果是王 就吧点数当成0num = 0;endreturn num, color;
end--判断value是否存在
--字典/数组
function table.ContainsValue(tb, val)if(type(tb) == "table") thenfor k, v in pairs(tb) doif equals(v, val) thenreturn true;endendelsereturn equals(tb, val);endreturn false;
end--删除字典中值
function table.RemoveValue(tb, val)for k, v in pairs(tb) doif(v == val) thentable.remove(tb, k);return;endend
end--判断两个数组是否相等
function table.isEquation(tb1,tb2)if(#tb1~=#tb2)thenreturn false;endfor i,v in pairs(tb1) doif tb1[i] ~= tb2[i]thenreturn false;endendreturn true;
end--检查表内相同元素个数
function table.getrepeat(t)local check = {} local n = {}for key, value in pairs(t) doif not check[value] thenn[key] = valuecheck[value] = valueendendreturn #n;
end

写在后面:方法是临时拼凑,可能会有bug,我会持续修复,直至修复完美!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在亚马逊购买产品时怎么选择自动收货方式

在亚马逊购买产品时&#xff0c;通常可以在下单时选择不同的收货方式&#xff0c;包括自动收货方式。以下是一般的购买流程&#xff1a; 登录亚马逊账号&#xff1a;打开网站&#xff0c;登录账号&#xff0c;如果没有账号&#xff0c;可以先创建一个。 浏览和添加商品&#…

多用户多回路宿舍用电管理解决方案-安科瑞黄安南

01 引言 近几年来&#xff0c;因违规使用大功率恶性负载电器导致宿舍失火的安全事故在各大高校时有发生&#xff0c;给学生和学校都带来了巨大的损失。北京大学、哈尔滨工业大学、上海商学院以及俄罗斯人民友谊大学等高校学生公寓发生的火灾给高校学生公寓的安全用电敲响…

element-ui 图片压缩上传

export const compressImgNew (file) > {return new Promise(resolve > {const reader new FileReader()const image new Image()image.onload (imageEvent) > {const canvas document.createElement(canvas) // 创建画布const context canvas.getContext(2d) …

车载网关通信能力解析——SV900-5G车载网关推荐

随着车联网的发展,各类车载设备对车载网关的需求日益增长。车载网关作为车与车、车与路、车与云之间连接的关键设备,其通信能力直接影响整个系统的性能。本文将详细解析车载网关的通信能力,并推荐性价比高的SV900-5G车载网关。 链接直达&#xff1a;https://www.key-iot.com/i…

初探亚马逊 AI 编程助手 CodeWhisperer

前言 4月18日&#xff0c;亚马逊云科技宣布&#xff0c;实时 AI 编程助手 Amazon CodeWhisperer 正式可用,同时推出的还有供所有开发人员免费使用的个人版&#xff08;CodeWhisperer Individual&#xff09;。Amazon CodeWhisperer 是一个通用的、由机器学习驱动的代码生成器&…

Jenkins CLI二次开发工具类

使用Jenkins CLI进行二次开发 使用背景 公司自研CI/DI平台&#xff0c;借助JenkinsSonarQube进行代码质量管理。对接版本 Jenkins版本为&#xff1a;Version 2.428 SonarQube版本为&#xff1a;Community EditionVersion 10.2.1 (build 78527)技术选型 Java对接Jenkins有第…

arco-disign vue + vue3 封装一个“下拉多组单选组件”

手搓一个下拉框多组单选组件, 实现采用框架 arco-disign vue + vue3 组件采用:a-popover、a-input-tag、a-radio-group、a-radio 实现效果: 调用组件 <SelectGroupRadiov-model="searchModel.indicatorScreening":options="dict.indicatorScreening&qu…

USB协议学习(二)设备枚举过程分析

USB协议学习&#xff08;二&#xff09;设备枚举过程分析 笔者来聊聊设备枚举过程分析. 这里写自定义目录标题 USB协议学习&#xff08;二&#xff09;设备枚举过程分析USB设备运行过程USB设备枚举USB设备通信构成USB设备请求USB枚举过程分析如何改变文本的样式插入链接与图片如…

软硬件架构分层总结

一、前言 软件系统很多架构图我们经常看到是这样的三段 就是这三段就可以演化出很多层 二、硬件架构分层 硬件层&#xff0c;基本是计算机硬件的体系结构&#xff0c;包括硬盘设备&#xff0c;cpu&#xff0c;内存&#xff0c;控制器&#xff0c;运算器&#xff0c;寄存器&am…

Stream流式处理

Stream流式处理&#xff1a; 建立在Lambda表达式基础上的多数据处理技术。 可以对集合进行迭代、去重、筛选、排序、聚合等处理&#xff0c;极大的简化了代码量。 Stream常用方法 Stream流对象的五种创建方式 //基于数组 String[] arr {"a","b","c…

吉利高端品牌领克汽车携手体验家,重塑智能创新的汽车服务体验

浙江吉利控股集团&#xff08;以下简称“吉利集团”&#xff09;始建于1986年&#xff0c;1997年进入汽车行业&#xff0c;一直专注实业&#xff0c;专注技术创新和人才培养&#xff0c;坚定不移地推动企业转型升级和可持续发展。现资产总值超5100亿元&#xff0c;员工总数超过…

k8s集群镜像下载加gradana监控加elk日志收集加devops加秒杀项目

展示 1.配套资料2.devops 3.elk日志收集 4.grafana监控 5.dashboard![在这里插入图片描述](https://img-blog.csdnimg.cn/bf294f9fd98e4c038858a6bf5c34dbdc.png 目的 学习k8s来来回回折腾很久了&#xff0c;光搭个环境就能折腾几天。这次工作需要终于静下心来好好学习了一…

ES6中的Set集合与Map映射

文章目录 一、Set集合1.Set的基本使用2.Set的常见方法3.WeakSet使用4.WeakSet的应用 二、Map映射1.Map的基本使用2.Map的常见方法3.WeakMap使用4.WeakMap的应用 三、ES6的其它知识点说明 一、Set集合 1.Set的基本使用 在ES6之前&#xff0c;我们存储数据的结构主要有两种&…

v-for列表渲染

一、v-for迭代数组 <li v-for"(e,index) in emp" :key"e.id">编号{{index1}} 名字{{e.name}} 年龄{{e.age}} </li> e 是循环数组中的每个元素的别名index 是当前循环的下表&#xff0c;从0开始:key 的作用&#xff1a; 是为了给 Vue 一个提示…

网络协议--动态选路协议

10.1 引言 在前面各章中&#xff0c;我们讨论了静态选路。在配置接口时&#xff0c;以默认方式生成路由表项&#xff08;对于直接连接的接口&#xff09;&#xff0c;并通过route命令增加表项&#xff08;通常从系统自引导程序文件&#xff09;&#xff0c;或是通过ICMP重定向…

清除excel中换行符方法

1、选择要删除或替换换行符的单元格。 2、按 Ctrl H 以打开“查找和替换”对话框。 3、在“查找内容”栏中输入Ctrl J 或 Ctrl Enter 这时会出现一个闪烁的小点。如下图所示&#xff0c;然后点击全部替换即可。

Linux环境下C++配置Json库

一、准备好压缩包 1、下载Jsoncpp https://sourceforge.net/projects/jsoncpp/files/ 2、下载scons https://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.tar.gz/download 二.配置 1.创建一个json文件夹&#xff0c;使用Xftp将压缩包导入文件夹 2.使用 …

memmove内存拷贝函数

目录 一、memmove内存拷贝函数 二、memmove与memcpy的区别 三、模拟实现memmove函数 一、memmove内存拷贝函数 1.头文件&#xff1a;string.h 2.函数原型&#xff1a;void *(void* destination , const void* source , size_t num) 3.函数功能&#xff1a;将源地址空间中的…

物联网_01_物理设备的网络接入

设备的网络接入及物理层使用到的传输协议 现在物理设备有两种接入方式,一种是直接接入另一种是网关接入 直接接入 给物理设备添加NB-IOT通信模组等设备使之具有直接接入网络的能力 网关接入 物理设备在本地组网后通过统一的网关接入到网络(ZigBee无线组网网关).网关是处在本地…

Flutter页面滑动回调处理解决方法

文章目录 TabBarViewTabBarView简介TabBarView详细介绍 TabBarView滑动时如何处理事务例子 PageControllerPageController介绍PageController 的详细介绍 TabBarView TabBarView简介 TabBarView 是 Flutter 中的一个用于显示选项卡视图的小部件。它通常与 TabBar 一起使用&am…