请教关于麻将的听牌算法(语言不限,欢迎讨论)

2014-08-07 17:27:46 +08:00
 bufannao
简单一些,牌型假设不考虑花色,只包括条、筒、万
正常手中是13张牌,当再摸一张牌后如何判断是否可以听牌(此时手中是14张牌,需要再打出去一张判断是否能够听牌)?(杠也不可以不考虑)
胡牌规则不考虑七对子、清一色、大三元、幺、九等等特殊规则,只要简单包括1将牌、1-N刻牌、1-N顺牌即可。
深知关于这类的算法应该都是商业化的,希望有过研究的不吝赐教。
8215 次点击
所在节点    问与答
25 条回复
casparchen
2014-08-07 18:17:52 +08:00
我觉得总共才13张牌,遍历所有情况就可以了,难道还要考虑效率么
yangff
2014-08-07 18:26:06 +08:00
枚举打哪张,搜牌型。
blacktulip
2014-08-07 18:28:49 +08:00
这个不需要特殊算法吧,总共才几张牌
plprapper
2014-08-07 18:30:47 +08:00
这是要靠程序 研究如何出来最合理吗 然后带着程序 杀向麻将馆 。。 哈哈
bufannao
2014-08-07 19:19:33 +08:00
@casparchen
@blacktulip
@yangff 看似容易,能上代码么?
jsonline
2014-08-07 19:23:49 +08:00
人脑很容易就分辨出来了,何况电脑
bufannao
2014-08-07 19:47:20 +08:00
@jsonline 你试试写个AI,4个电脑玩一把,看看有你想的容易么
bufannao
2014-08-07 19:51:48 +08:00
@plprapper 呵呵,是想写个人机对战,本地玩法
blacktulip
2014-08-07 20:21:58 +08:00
zjgood
2014-08-07 20:26:44 +08:00
wo ju ran bu zhi dao ma jiang hai you suan fa shen me de
bufannao
2014-08-07 20:44:12 +08:00
@blacktulip 谢谢!
aheadlead
2014-08-07 21:20:42 +08:00
A*
jsonline
2014-08-07 21:30:36 +08:00
AI 和算法不一样吧,我是说判断的算法挺容易的
casparchen
2014-08-07 21:43:49 +08:00
lygmqkl
2014-08-07 21:56:10 +08:00
我来出个注意:
构建9个pools
A*1 all left
B*4 4 player's hold
C*4 4 players's used
顺序,
lygmqkl
2014-08-07 21:59:35 +08:00
1. A-1
2. 指针指向4个用户得下一个, 第n个
3. Bn + 1
4. 里边n 用户得拍,归类判断是否听牌,胡牌
5. Bn - 1, Cn + 1
6, n+1, n+2, n+3 用户分别遍历决定是否有操作,吃,碰,杠,听,胡,方法类似4,计算用户所有得牌
从1重复,
难得不是AI的实现,难得是根据剩余牌量+已出牌量推算出,下面的牌的走势,例如是鸡胡还是做大牌。
Sunyanzi
2014-08-07 22:06:29 +08:00
沉迷日麻并曾经可心算番符及得点的人怒答一记 ...

我当时给自己做过一个练牌的小工具 ... 可以算出切张之后的向听数期待得点以及放铳概率 ...

当时懒得细写 ... 选择的做法就是穷举 ... 然后比对和牌牌型 ...

日麻总共一百三十六张牌 ... 共穷举一千八百九十次 ... 算上比对牌型的时间都是一瞬间就完成 ...

如果要高级一点的算法也可这样 ...

整理手牌 ... 把所有牌按顺序排列 ... 然后从第一张开始找起 ...

假如第一张是 4M ... 说明一定没有 2M 和 3M ... 继续检查 ...

如果存在 4M 或者 5M 继续检查是否存在 4M 或者 6M ... 存在则跳过这三张继续 ...

如果存在 4M 但不存在第三个 4M 的话放置一个将牌标记继续 ...

如果存在 6M 的话检查是否存在听牌标记 ...

如果没有的话跳过这两张并放置一个听牌标记继续 ... 存在的话说明没有听牌直接中止流程 ...

如果上述条件皆不满足 ... 检查是否存在听牌标记 ...

如果没有则放置一个听牌标记 ... 如果存在则说明没有听牌直接中止流程 ...

最后如果有一个或六个将牌标记且有听牌标记说明已经听牌 ...

如果最后有一个或七个将牌标记且没有听牌标记说明已经和牌 ...

如果既存在 4M 又存在 4M 4M 5M 和 6M 需要分叉判断 ... 有一次听牌就视为听牌 ...

描述就是这样 ...

开发起来较穷举而言比较麻烦 ... 除非是做在线游戏 ... 否则穷举就足够用了 ...

可能说得有点乱 ... 希望能理解吧 ...
oIIo
2014-08-07 22:23:40 +08:00
你应该不是单纯的指听牌吧? ai的话肯定还要分析桌面的牌。 单纯的判断是否可以听牌,按照楼上们说的直接穷举就行了,先把将牌提出来,判断是否听将牌,然后3个3个的配。
oIIo
2014-08-07 22:29:12 +08:00
ai 打牌的话,就麻烦了,我之前做过一个字牌的游戏(和麻将类似也是3个一组还有杠、将,但是有21张牌),ai打牌的话用穷举分支太多(算出较优解得1、2秒),必须根据打牌经验剪枝。
bufannao
2014-08-07 22:43:23 +08:00
@Sunyanzi 后面的算法看懂了,前面说的穷举没明白,一千八百九十次是怎么来的?还有比对牌型是指什么?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/126619

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX