看了好多的麻将开发逻辑思路,或者是麻将源码 不是说的太复杂 就是根本看不懂
近期终于有了收获,如果有不对的地方请各位大佬指正,谢谢。
不管是哪一种麻将流程大同小异
简单部分
什么 碰,杠,吃,天胡,地胡,牌型判断 ,相信其实都没什么难度最多就是 流程多一点
那么难点,重点在哪里呢? 我认为是胡牌(如何判断胡牌)、听牌(如何拆牌 各种情况可以胡哪些牌)
胡牌
1、对胡 这个比较简单就是手牌全是对子 这个根据麻将的规则来
2、平胡 就是 将牌 + (5 == (碰个数 + 杠个数 + 刻子数 + 顺子数量)) 就胡了
胡牌肯定需要有将牌,所有首先把手牌(不包括 碰,杠)中 2,3,4 张相同的牌 都可能是将牌,每次提取其中一种,用剩余的
牌去判断,剩余的牌肯定是 count % 3 == 0 如果count == 0 那就是胡了 。
刻子(3张一样的) 顺子(3张同花色连续的) 我们遍历所有手牌 统计所有 可能出现的 刻子(相同刻子肯定只有一个)
顺子(相同顺子有多个) 类似这种结构 {[1] = {顺子,1万},[2] = {顺子,1万},[3] = {顺子,1万},[4] = {刻子,2万}}
我们需要遍历所有 组合依次取牌 其中有一个 刚好取完扑克 就判断胡成功那 如下:
function checkHu()
1、检查对胡
2、遍历将牌
local an = 统计手牌类似结果 {[牌值]=牌数量}
for k,v in pairs(an) do
if v >= 2 then
local arrCard = 排除2个将牌的剩余手牌
if true == checkPinHu(arrCard ) then
return true
end
end
end
end
function checkPinHu(arrCard )
if 0 == #arrCard then return true end--这里符合表示递归到这里胡判断成功
local an = 统计arrCard :{[1] = {顺子,1万},[2] = {顺子,1万},[3] = {顺子,1万},[4] = {刻子,2万}}
for k,v in ipairs(an ) do
local 类型,牌值 = v[1],v[2]
local cardData = (arrCard 去掉 当前遍历的类型扑克)
if true == checkPinHu(cardData ) then return true end--这里就是递归调用
end
return false
end
2、听牌提示
到这里讲完了胡牌,其实知道胡牌了,听牌提示自然就会了,我还是讲一下
1、当我们第摸起牌时,就会去判断是否可以听牌
遍历所有手牌 然后判断 哪些唯一的牌(1~9(万索筒)(东南西北 中发白 等))
每排除的这张牌 然后其他哪些牌可以胡牌 就可以做出听牌逻辑了
到这里就讲完,胡牌与听牌了 如果各位觉得好就收藏或者打赏一下 ,如果有错误欢迎指正