Fr0stbyteR / Majsoul-Helper

使用天凤牌理规则,根据牌效将推荐切牌染色
https://greasyfork.org/scripts/378059-majsoul-helper
Do What The F*ck You Want To Public License
171 stars 34 forks source link

关于进张数、改良数、向听倒退计算的一些想法 #7

Open ayssia opened 5 years ago

ayssia commented 5 years ago

天凤的牌理计算只考虑了纯进张数,这里试提出一个考虑改良的方法,在下 js 实在是不熟,并且也不确定这样的计算是否对性能造成较大的影响,姑妄言之吧。


手牌A:124679m3678p2366s

这里切 1m, 4m, 9m 和 3p 都是20枚进张的两向听,但显然 1m 最好。

分别尝试切出这四枚牌——

切出 1m:24679m3678p2366s,进张 3m,5m,8m,1s,4s 各四枚。 进 3m 后,最多可得 16 枚进张的一向听。 进 5m 后,最多可得 16 枚进张的一向听。 进 8m 后,最多可得 16 枚进张的一向听。 进 1s 后,最多可得 12 枚进张的一向听。 进 4s 后,最多可得 12 枚进张的一向听。 总次轮进张数 = 16 4 + 16 4 + 16 4 + 12 4 + 12 * 4 = 288

切出 4m:12679m3678p2366s,进张 3m,5m,8m,1s,4s 各四枚。 进 3m 后,最多可得 16 枚进张的一向听。 进 5m 后,最多可得 12 枚进张的一向听。 进 8m 后,最多可得 12 枚进张的一向听。 进 1s 后,最多可得 12 枚进张的一向听。 进 4s 后,最多可得 12 枚进张的一向听。 总次轮进张数 = 16 4 + 12 4 + 12 4 + 12 4 + 12 * 4 = 256

同样计算切出 9m 和 3p 的结果,分别得到总次轮进张数为 256 和 288。

比较总次轮进张数,可知 1m 和 3p 为较好的切法。

进一步考虑改良——

切出 1m:24679m3678p2366s 进 2m 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 4m 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 6m 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 7m 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 9m 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 1p 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 2p 后,最多可得 28 枚进张的两向听,增加 8 枚进张。 进 3p 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 4p 后,最多可得 28 枚进张的两向听,增加 8 枚进张。 进 5p 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 6s 后,最多可得 41 枚进张的两向听,增加 21 枚进张。 摸到其余牌进张数不变。 总次轮改良数 = 4 3 + 4 3 + 4 3 + 4 3 + 4 3 + 4 4 + 8 4 + 4 3 + 8 4 + 4 4 + 21 * 2 = 210

切出 3p:124679m678p2366s 进 1m 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 2m 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 4m 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 6m 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 7m 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 9m 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 2s 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 3s 后,最多可得 24 枚进张的两向听,增加 4 枚进张。 进 6s 后,最多可得 41 枚进张的两向听,增加 21 枚进张。 摸到其余牌进张数不变。 总次轮改良数 = 4 3 + 4 3 + 4 3 + 4 3 + 4 3 + 4 3 + 4 3 + 4 3 + 21 * 2 = 138

这样就显著区分了两者。

定义 M = 本轮进张数,N = 总次轮进张数 + 总次轮改良数 * 0.25(玄学参数),比较每张切牌 M 与 N 的乘积可得兼顾进张与改良的切法。


手牌B:12378m2345p23678s

使用上述的方法,会得到 M 最大的切法是 2p 和 5p(进张数 28,可能产生单骑听牌),M * N 最大的切法是 8m 和 2m(进张数 17,必定可以形成两面听牌)

可以用两种不同的颜色来表示: 1) M 最大的前提下,N 最大的切法。 2) M * N 最大的切法。


向听倒退的计算:

手牌C:1224778m4556678p

进张数少得过分,切 8m 得到的一向听仅有 4 枚进张(M = 4),N 也非常低。 这里切 1m 的 N 值显著的高,并且 M * N 的乘积是后者的 36 倍,向听倒退是合理的,合适的阈值可能在 20 倍左右(并且 N 必须达到进张最多切法的 2 ~ 2.5 倍以上)。可以用另一种颜色来表示。


另外,关于牌河中壁的提示,一般 牌河 + 自己手牌 有 3 张邻牌才能形成薄壁,所以是否应该只在相邻牌数量达到 3 张以上时才显示?

Fr0stbyteR commented 5 years ago

如果我的理解正确的话 应该就是多考虑一步得到更优解。 这样的计算应该纳入AI麻将的范畴,如果要给到玩家最优解,还需要考虑场况和牌河。不过这么多的信息量,玩家很难在第一时间消化。所以对辅助程序来说,最好能只给一种信息,或者一个选项,不要让玩家产生疑问(所以我也觉得牌河提示在打的时候确实很花眼)。 当然 如果要做AI,这个想法是很好的,甚至可以加上第三次之后的进张来算。

Fr0stbyteR commented 5 years ago

关于壁的提示问题 @FlyingBamboo

ayssia commented 5 years ago

加上第三次的进张我有试过,太慢了,只能放弃。有两轮进张的计算已经可以应对大部分情况了。

实际上这样给玩家的信息是减少的。

  1. M 最大的前提下,N 最大的切法一般只有一种,不会出现多张牌有些特别绿,有些不那么绿的显示了。
  2. M * N 最大的切法与单纯 M 最大的切法一般是相同的,只有 1~2 向听的时候偶尔出现。
  3. 向听倒退的切法更加少见。

这样玩家一般只会看到一张绿色牌,或者一张绿色+一张其他颜色的牌,比起现在的情况比较不容易看乱。

顺便我传了一下我 7 年前做的垃圾独立牌效程序,自带混淆,现在不少地方我自己都看不懂了……只能做一些小的修改233

https://github.com/ayssia/paili

FlyingBamboo commented 5 years ago

关于壁候选牌目前处理的解释请见https://github.com/Fr0stbyteR/Majsoul-Helper/pull/5#issuecomment-468151972 另外关于麻将AI,因为日麻的各种决策考虑到的因素非常复杂,所以用智能算法可能更好一些。 目前对于进张数量的标示对于一般的麻将玩家(比如本人)应该已经够用了,再多一些复杂的算法感觉可能会影响判断,个人希望这个插件仅作为辅助判断的依据之一,让自己知道即使吃4但大部分决策是没问题的,从而提高对场况判断的能力并保持信心。同时也能免除大量记忆的时间,让非专业人士也能有专业的思维。 有很多情况是需要玩家自行判断的。比如点差很大的top,保留一些安牌或者以速度为目标尽可能鸣牌则是明智的选择。再比如一向听的时候保留一个损失进张但有更高番数的可能也是可行的选择。或者听牌的时候保留愚形多2番以上的牌型而舍弃好形等等。以掌握这些技术为目标,形成自己打打牌风格吧~

ayssia commented 5 years ago

自己写了一下,似乎性能方面问题不大,提了一个简陋的PR。