十三水中各种牌型判断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.rhkb.cn/news/169185.html

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

相关文章

逐字稿 | 视频理解论文串讲(下)【论文精读】

1 为什么研究者这么想把这个双流网络替换掉&#xff0c;想用3D 卷积神经网络来做&#xff1f; 大家好&#xff0c;上次我们讲完了上半部分&#xff0c;就是 2D 网络和一些双流网络以及。它们的。变体。今天我们就来讲一下下半部分&#xff0c;就是 3D 网络和 video Transformer…

Java 控制台 进度条

Java 控制台 进度条 progress-bar简介效果图使用介绍 progress-bar 简介 gitee链接: https://gitee.com/sincere-jxx/progress-bar main分支 进度条颜色可变&#xff0c;绿色&#xff08;默认&#xff09;&#xff0c;红色&#xff0c;黄色&#xff0c;蓝色等 长度50&#x…

Nacos全面知识 ----微服务 SpringCloud

快速入门 分级存储模型 修改集群配置 Nacos设置负载均衡策略 集群优先 权重优先 Nacos热更新配置 Nacos添加配置信息 微服务配置拉取 热更新:推荐使用第二种方法进行热部署 ConfigurationProperties(prefix "pattern") 是 Spring Boot 中用于自动配置属性的注解。它…

SparkSQL的Shuffle分区设定及异常数据处理API(去重、缺失值处理)

一、Spark SQL的Shuffle分区数目设定 在允许spark程序时&#xff0c;查看WEB UI监控页面发现&#xff0c;某个Stage中有200个Task任务&#xff0c;也就是说RDD有200分区Partion。 产生原因&#xff1a; 在Spark SQL中&#xff0c;当Job中产生Shuffle时&#xff0c;默认的分区数…

线性代数的本质笔记

课程来自b站发现的《线性代数的本质》&#xff0c;可以帮助从直觉层面理解线性代数的一些基础概念&#xff0c;以及把一些看似不同的数学概念解释之后&#xff0c;发现其实有内在的关联。 这里只对部分内容做一个记录&#xff0c;完整内容请自行观看视频~ 01-向量究竟是什么 …

2022最新版-李宏毅机器学习深度学习课程-P26RNN-2

一、RNN网络结构 与时间有关的反向传播&#xff08;每次不同&#xff09; 损失函数 实验其实不容易跑&#xff0c;因为他的损失函数曲线幅度很大 画出来差不多是这个样子。突然一下升高是因为从右到左碰到陡峭的地方梯度一下变大了&#xff0c;所以弹回去了。 原作者在训练时…

【数据结构初阶】九、排序的讲解和实现(直接插入 \ 希尔 \ 直接选择 \ 堆 \ 冒泡 -- C语言)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【数据结构初阶】八、非线性表里的二叉树&#xff08;二叉树的实现 -- C语言链式结构&#xff09;-CSDN博客 排序 排序的概念 所谓排序&#xff0c;就是使一串记录&#xff0c;按照…

wps excel js编程

定义全局变量 const a "dota" function test() {Debug.Print(a) }获取表格中单元格内容 function test() {Debug.Print("第一行第二列",Cells(1,2).Text)Debug.Print("A1:",Range("A1").Text) }写单元格 Range("C1").Val…

iOS之某漫加密算法还原

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、抓包二、IDA反编译三、定位四、根据调用栈确定md5总结 前言 目标app:5ZKa5ryr 版本&#xff1a;2.8.0 工具&#xff1a;charles、frida 文章内容仅供参考学…

中国技术的对外输出:Telegram也开始搞小程序应用了

Telegram 宣布为其开发者提供了一项“能够在其中运行迷你应用”的新功能&#xff08; 迷你应用即 Mini App&#xff0c;下文中以“小程序”代替&#xff09;。 在 Telegram 的博客中&#xff0c;开发人员介绍可以使用 JavaScript 构建自己的迷你应用 在一篇博客文章中&#xf…

SpringBoot整合注解式mybatis

1. 创建Spring Boot项目&#xff1a; 创建一个Spring Boot项目&#xff0c;可以使用Spring Initializer或手动创建 2. 添加依赖&#xff1a; 在pom.xml文件中&#xff0c;添加Spring Boot、MyBatis和数据库驱动程序的依赖&#xff0c;就像之前所示。 <dependencies><…

Android JKS MD5 SHA1 公钥生成 私钥生成 APP备案 内容获取

1 查看 jks keytool -list -v -keystore /Users/lipengfei/Desktop/android/androidproject.jks密钥库类型: jks 密钥库提供方: SUN您的密钥库包含 1 个条目别名: ddgj 创建日期: 2018-11-16 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: CNcn, OUcn, Ocn, Lcn,…

智安网络|从区块链到社交网络:解析去中心化的意义与应用

在当今数字化的世界中&#xff0c;一个越来越常见的概念是“去中心化”。从区块链技术到金融系统&#xff0c;从社交网络到数据存储&#xff0c;去中心化被认为是一种前所未有的方式来重新定义和改变传统的中心化结构。那么&#xff0c;去中心化到底是什么&#xff1f; 首先&a…

Spring Cloud 之 Sentinel简介与GATEWAY整合实现

简介 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件&#xff0c;主要以流量为切入点&#xff0c;从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 熔断 …

MES生产管理系统与供应链协同管理

MES生产管理系统在制造业中发挥着越来越重要的作用&#xff0c;它与供应链管理密切相关&#xff0c;对于提高供应链的协同和优化有着重要的意义。本文将探讨MES管理系统与供应链管理之间的关系&#xff0c;包括实时数据共享、生产计划协调和供应链效率提升等方面。 MES系统能够…

LeetCode 11. 盛最多水的容器

盛水最多的容器 题目链接 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。…

Nginx Proxy代理

代理原理 反向代理产生的背景&#xff1a; 在计算机世界里&#xff0c;由于单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当用户的接入请求蜂拥而入时&#xff0c;会造成服务器忙不过来的局面&#xff0c;可以使用多个服务器来共同分担成…

【经典PageRank 】02/2 算法和线性代数

系列前文&#xff1a;【经典 PageRank 】01/2 PageRank的基本原理-CSDN博客 一、说明 并非所有连接都同样重要&#xff01; 该算法由 Sergey 和 Lawrence 开发&#xff0c;用于在 Google 搜索中对网页进行排名。基本原则是重要或值得信赖的网页更有可能链接到其他重要网页。例…

【小程序】实现一个定制的音乐播放器

应用地址&#xff1a;https://spacexcode.com/player 介绍 这是为自己制作的一个在线 Web 版的音乐播放器。众所周知&#xff0c;现在市面上的所有的音乐平台都是会员制。而免费的资源却分散在网络上的各个角落&#xff0c;为此&#xff0c;我收集了自己 喜欢的音乐&#xff0…

选购采购管理软件,首先考虑这5个功能

虽然采购已经达到了数字化的临界点&#xff0c;但企业在接受新的解决方案时却犹豫不决。德勤一份全球首席采购官调查显示&#xff0c;只有 18% 的组织制定了数字化采购战略。 自动化采购任务和优化采购到付款周期可以为企业节省大量金钱和时间。然而&#xff0c;通过过时的采购…