麻将胡牌与听牌算法介绍
说明:为了方便测试,这是在一个vite+vue3项目里写的代码,并在网页中展示了部分功能。核心的算法逻辑在 core 文件夹下面,你可以拷贝到自己熟悉的开发环境中去。
- 默认只有万条筒牌型,但可以很方便地加入风牌与字牌等。
- 支持魔法牌、大胡逻辑,以及智能出牌提示和AI功能。
- 麻将子玩法多,可以通过继承方式扩展实现特定规则。
为了便于理解,默认:
数字1-9 表示万牌
数字17-25 表示筒牌
数字33-41 表示条牌
使用示例
-
判断一组牌能否胡牌:
const can: boolean = new MahjongGroupBase([1, 1, 4, 5, 6], 0, []).init().solutionList.length > 0 //can = true第二个参数 0 表示当前有几张魔法牌;第三个参数表示当前吃碰杠的牌。
-
带有魔法牌机制的情况:
const can: boolean = new MahjongGroupBase([4, 5, 6], 2, []).init().solutionList.length > 0 //can = true1 不作为手牌传递,而是作为魔法牌传递。
-
判断一组牌能听什么牌:
const data = new MahjongGroupBase([2, 2, 6, 7], 1, []) data.init() const m = data.getAllListenCard() //[...m.keys()] 为 [5,8] 也就是听5,8m 是一个map对象,键为能听的牌,值为对应的番数。
-
特殊的牌型组合:
protected getRelatedGroup(targetNumber: number, alreadyTakeGroupList: GroupNumberType[]) { const data = super.getRelatedGroup(targetNumber, alreadyTakeGroupList) if (targetNumber === 1 || targetNumber === 9) { data.push([1, 1, 9]) } return data } -
特定的将牌(对子):
protected takeSameNumber(targetNumber: number, minCount: number, maxCount: number): GroupNumberType[] { if ([2, 5, 8].includes(targetNumber % 16)) { minCount = 3 } return super.takeSameNumber(targetNumber, minCount, maxCount) } -
特殊的胡牌牌型:
参考
checkSpecialCardGroup方法,默认实现了一个七对牌型的检测。 -
名堂判断:
参考
mateMintan方法,内部实现了 清一色、碰碰胡、全球人 的名堂判断。具体的名堂类型的表示是使用数字表示的,可以根据需要自行修改。 -
番数的判断:
可以修改
getAllListenCard方法,默认计算方式是fan = mintanList.length ** 2。 -
加入东南西北中发白:
需要修改几个方法:
getAllCard方法,添加东南西北中发白。getRelatedGroup方法,当targetNumber为东南西北中发白时,返回正确的分组。