麻将胡牌算法(遍历+剪枝)

您所在的位置:网站首页 武汉晃晃麻将胡牌一分算法 麻将胡牌算法(遍历+剪枝)

麻将胡牌算法(遍历+剪枝)

2024-07-11 20:25| 来源: 网络整理| 查看: 265

麻将胡牌算法(遍历+剪枝) 简介麻将胡牌算法及代码1. 方法引入2. 类型定义2.1 牌定义2.2 牌特征定义 3. 计算胡牌3.1 检测十三幺牌型3.2 检测七小对牌型3.3 检测普通牌型胡牌3.3.1 检测所有可能的胡牌3.3.2 检测可能的胡牌是否为真的胡牌检测牌型能否为胡牌(核心)(1)查找可能的将牌(2)检测是否能每三张牌进行拆解(重点)(3)查找当前牌在手牌中可能的拆解牌型(重点) 完整代码效果展示总结

简介

这个算法采用以遍历为基础的方法对胡牌进行搜索,并加入了一定的剪枝策略。没有对算法复杂度和运行时间进行测试,但整体运行速度基本可观,基本剪去了大部分无用的搜索。这个算法是部署在我的个人网站上的,有兴趣的童鞋可以到我的个人网站去体验一下。因为框架原因,所以我使用TypeScript语言编写的,用JavaScript语言的童鞋可以稍加修改后服用。下面介绍算法的实现逻辑和代码。

麻将想要胡牌的话首先当前手中牌数肯定是除三余一的,也就是可能是1,4,7,10,13张牌。然后再加上一张胡牌的话总张数就是除三余二的,也就是可能是2,5,8,11,14张牌。除了十三幺和七小对这两种特殊牌型外,胡牌的基本规则就是总牌数能够形成AA+mABC+nAAA这种牌型。也就是必须得有一个AA型牌型(叫做将),剩余的牌就可以每三个分为一组(此后将ABC与AAA型统称为三元组),然后检测是否能拆解成m个AAA和n个ABC牌型就可以判断是否能胡牌。

麻将胡牌算法及代码 1. 方法引入

该算法共引入了两个方法,分别为 deepClone 和 countItemInArray 。其中 deepClone 可以实现数组的深复制,由于我使用的vant框架带有这个函数便直接使用了,使用其他的深复制方法代替也可以。 countItemInArray 是自己封装的一个方法,用以统计一个元素在数组中出现的次数,后续计算胡牌需要用到,代码如下

import {deepClone} from "vant/es/utils/deep-clone"; import {countItemInArray} from "@/utils"; //from @/utils export const countItemInArray = (array: Array, item: any): number => { let count = 0 for (let index = 0; index { let checkThirteenYaoResult = checkThirteenYao(deepClone(tiles)) if (checkThirteenYaoResult.length > 0) { return checkThirteenYaoResult } let checkSevenPairResult = checkSevenPair(deepClone(tiles)) if (checkSevenPairResult.length) { return checkSevenPairResult } return checkCommon(deepClone(tiles)) } 3.1 检测十三幺牌型

十三幺牌型为固定牌型,胡牌也是固定胡牌,检测非常方便,只要检测输入手牌是否和十三幺牌型一致即可

const checkThirteenYao = (tiles: number[]): number[] => { const thirteenYao: number[] = [11, 19, 21, 29, 31, 39, 41, 42, 43, 44, 45, 46, 47] if (tiles.toString() == thirteenYao.toString()) { return thirteenYao } else { return [] } } 3.2 检测七小对牌型

七小对牌型也相对较为固定,牌型为6AA+B,胡牌为B。这里采用双指针法来遍历手牌,前后指针始终错位1张牌。如果检测到配对则指针全部前进两张牌,若未配对则指针全部前进一个并记录下胡牌。最终对配对数和胡牌数加以校验即可得到结果

const checkSevenPair = (tiles: number[]): number[] => { let result: number[] = [] if (tiles.length


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3