Giter Site home page Giter Site logo

endlesscheng / mahjong-helper Goto Github PK

View Code? Open in Web Editor NEW
1.9K 26.0 267.0 2.65 MB

日本麻将助手:牌效+防守+记牌(支持雀魂、天凤)

License: MIT License

Go 82.25% Ruby 1.44% HTML 3.34% JavaScript 12.95% Makefile 0.01%
tenhou majsoul mahjong mahjong-algorithm golang mahjongsoul riichi-mahjong

mahjong-helper's Introduction

日本麻将助手

主要功能

  • 对战时自动分析手牌,综合进张、打点等,给出推荐舍牌
  • 有人立直或多副露时,显示各张牌的危险度
  • 记录他家手切摸切
  • 助手带你看牌谱,推荐每一打的进攻和防守选择
  • 支持四人麻将和三人麻将

支持平台

导航

安装

分下面几步:

  1. 在浏览器地址栏中输入 chrome://flags/#allow-insecure-localhost,然后把高亮那一项从「已禁用」改为「已启用」(若没有该项见此)。该功能仅限基于 Chrome 内核开发的浏览器。

    (不同浏览器/版本的描述可能不一样,如果打开的页面是英文的话,高亮的就是 Allow invalid certificates for resources loaded from localhost,把它的 Disabled 改成 Enabled)

    设置完成后重启浏览器

  2. 安装浏览器扩展 Header Editor,用于修改 code.js 文件,发送游戏中的玩家操作信息至本地运行的助手。

    若能翻墙请前往 谷歌商城 下载该扩展。或者 从 CRX 安装该扩展(若无法安装试试 360 浏览器)。

    安装好扩展后点进该扩展的管理界面,点击导入和导出,在下载规则中填入 https://endlesscheng.gitee.io/public/mahjong-helper.json,点击右侧的下载按钮,然后点击下方的保存。(如果您是海外用户,请在下载规则中填入 https://mjhelper.github.io/mahjong-helper.json 以获得更好的加载速度。)

  3. 前往 releases 页面下载助手。解压到本地后打开。

  4. 如果您的浏览器之前打开过雀魂网页,需要清除缓存:打开雀魂网页,按下 F12,右键地址栏左侧的刷新按钮,选择「清空缓存并进行硬刷新」。如遇问题,请参考 #104

安装完成!在使用助手前,请先阅读本页面下方的示例,以了解助手输出信息的含义。

从源码安装此助手

您也可以选择从源码安装此助手:

go get -u -v github.com/EndlessCheng/mahjong-helper/...

完成后程序生成于 $GOPATH/bin/ 目录下。

使用说明

按照上述流程安装完成后,启动助手,选择平台即可。

需要先启动本助手,再打开网页。

注意事项

终端有个小 bug,在使用中若鼠标点击到了空白处,可能会导致终端卡住,此时按下回车键就可以恢复正常。

示例

牌效率

每个切牌选择会显示进张数、向听前进后的进张数、可以做的役种等等信息。

助手会综合每个切牌选择的速度、打点、和率,速度越快,打点和率越高的越靠前。

每个切牌选择以如下格式显示:

进张数[改良后的进张数加权均值] 切哪张牌 => 向听前进后的进张数的加权均值 [手牌速度] [期望打点] [役种] [是否振听] [进张牌]

例如:

补充说明:

  • 无改良时,不显示改良进张数
  • 鸣牌时会显示用手上的哪些牌去吃/碰,详见后文
  • 防守时,切牌的文字颜色会因这张牌的安全程度而不同,详见后文
  • 门清听牌时,会显示立直的期望点数(考虑自摸、一发和里宝);若默听有役则会额外显示默听的荣和点数
  • 存在高低目的场合会显示加权和率的平均点数
  • 役种只对较为特殊的进行提示,如三色、一通、七对等。雀魂乱斗之间会有额外的古役提醒
  • 若鸣牌且无役会提示 [无役]
  • 听牌或一向听时根据自家舍牌情况提示振听
  • m-万子 p-饼子 s-索子 z-字牌,顺序为东南西北白发中

进张数颜色说明:

  • 红色:优秀
  • 黄色:普通
  • 蓝色:较差

来看看下面这几道何切题吧。

1. 完全一向听

标准的完全一向听形状,切 8s。

2. 三个复合形的一向听(选自《麻雀 傑作「何切る」300選》Q106)

这种情况要切哪一张牌呢?

单看进张,切 7s 是进张最广的,但是从更长远的角度来看,切 7s 后会有愚型听牌的可能。

一般来说,牺牲一点进张去换取更高的好型听牌率,或者更高的打点是可以接受的。

如下图所示,这里展示了本助手对进张数、好型听牌和打点的综合判断。相比 7s,切 4m 虽然进张数少了四枚,但是能好型听牌,综合和牌率比 7s 要高,同时还有平和的可能,可以说在保证了速度的同时又兼顾了打点,是最平衡的一打。所以切 4m 这个选项排在第一位。

3. 向听倒退

这里巡目尚早,相比切 8m,切 1m 虽然向听倒退但是进张面广且有断幺一役,速度是高于 8m 的。

如下图,助手额外给出了向听倒退的建议。(根据进张的不同,可能会形成七对,也可能会形成平和等)

鸣牌判断

下图是一个鸣了红中之后,听坎 5s 的例子,宝牌为 6m。

上家打出 6m 宝牌之后考虑是否鸣牌:

这里就可以考虑用 57m 吃,打出 9m,提升打点的同时又能维持听牌。此外,若巡目尚早可以拆掉 46s 追求混一色。

手摸切与安牌显示

下图展示了某局中三家的手摸切情况(宝牌为红中和 6s,自家手牌此时为 345678m 569p 45667s):

  • 白色为手切,暗灰色为摸切
  • 鸣牌后打出的那张牌会用灰底白字显示,供读牌分析用
  • 副露玩家的手切中张牌(3-7)会有不同颜色的高亮,用来辅助判断其听牌率
  • 玩家立直或听牌率较高时会额外显示对该玩家的安牌,用 | 分隔,左侧为现物,右侧按照危险度由低到高排序(No Chance 和 One Chance 的安牌作为补充参考显示在后面,简写为 NC 和 OC)
  • 下图上家亲家暗杠 2m 后 4p 立直,对家 8s 追立,下家一副露但是手切了很多中张牌,听牌率较高
  • 多家立直/副露时会显示综合危险度
  • 危险度综合考虑了巡目、副露数、他家打点估计(包含亲家与否、副露中的宝牌数等)
  • [n无筋] 指该玩家的无筋危险牌的剩余种类数。剩余种类数越少,这些无筋牌就越危险。剩余种类数为零表示该玩家是愚型听牌或振听(注:把 1p4p 这种算作一对筋牌,对于四人麻将来说一共有 3*6=18 对筋牌,三人麻将则为 2*6=12 对筋牌)

危险度颜色:

  • 白色:现物
  • 蓝色:<5%
  • 黄色:5~10%
  • 红色:10~15%
  • 深红:>15%

补充说明:

  • 危险度排序是基于巡目、筋牌、No Chance、早外、宝牌、听牌率等数据的综合考虑结果,对于 One Chance 和其他特殊情况并没有考虑,请玩家自行斟酌
  • 某些情况下的 No Chance 安牌,本助手是会将其视作现物的(比如 3m 为壁,剩下的 2m 在牌河和自己手里时,2m 是不会放铳的)

牌谱与观战

目前助手支持解析雀魂的牌谱(含分享)和观战下的手牌,切换视角也可以解析其他玩家的手牌。

其他功能说明

命令行工具

除了上述功能之外,助手还是一款命令行工具,可以在分析何切题时对一副手牌进行分析,通过输入如下命令(mahjong-helper 指的是程序名称,可以修改成自定义的名称):

  • 分析何切

    东南西北白发中分别用 1-7z 表示,红 5 万用 0m 表示,红 5 饼用 0p 表示,红 5 索用 0s 表示

    mahjong-helper 34068m 5678p 23567s

    # 后面添加副露的牌,暗杠用大写表示

    mahjong-helper 234688m 34s # 6666P 234p

  • 分析鸣牌

    + 后面添加要鸣的牌,支持用 0 表示的红宝牌

    mahjong-helper 33567789m 46s + 6m

    mahjong-helper 33567789m 46s + 0s

    mahjong-helper 24688m 34s # 6666P 234p + 3m

  • 用交互模式分析手牌

    mahjong-helper -i 34568m 5678p 23567s

    输入的切牌、摸牌用简写形式,如 6m

    配套小工具

  • 指出宝牌是哪些(-d 参数,不能有空格)

    比如下面的宝牌是 3p 8p 3m 3m

    mahjong-helper -d=38p33m 34568m 5678p 23567s

  • 额外显示打点估计(-s 参数,支持一向听和两向听)

    mahjong-helper -d=38p33m -s 34568m 5678p 23567s

    特别说明,也可以直接用 mahjong-helper -s 启动助手,可以显示更多的信息(适合高分辨率的屏幕)

  • 帮助信息(-h 参数)

    mahjong-helper -h

如何获取 WebSocket 收发的消息

  1. 打开开发者工具,找到相关 JS 文件,保存到本地。

  2. 搜索 WebSocket, socket,找到 message, onmessage, send 等函数。

  3. 修改代码,使用 XMLHttpRequest 将收发的消息发送到(在 localhost 开启的)mahjong-helper 服务器,服务器收到消息后会自动进行相关分析。(这一步也可以用油猴脚本来完成)

  4. 上传 JS 代码到一个可以公网访问的地方,最简单的方法是传至 GitHub Pages,即个人的 github.io 项目。拿到该 JS 文件地址。

  5. 安装浏览器扩展 Header Editor,重定向原 JS 文件地址到上一步中拿到的地址。

  6. 允许本地证书通过浏览器,在浏览器(仅限 Chrome 内核)中输入

    chrome://flags/#allow-insecure-localhost
    

    然后把高亮那一项的 Disabled 改成 Enabled(不同浏览器/版本的描述可能不一样,如果是中文的话点击「启用」按钮)。

  7. 重启浏览器。

下面说明天凤和雀魂的代码注入点。

天凤 (tenhou)

  1. 搜索 WebSocket,找到下方 message 对应的函数,该函数中的 a.data 就是 WebSocket 收到的 JSON 数据。

  2. 在该函数开头(或末尾)添加如下代码:

    var req = new XMLHttpRequest();
    req.open("POST", "http://localhost:12121/");
    req.send(a.data);

雀魂 (majsoul)

雀魂收发的消息是 protobuf,接收的消息一部分为含有类型的通知消息,另一部分为不含有类型的请求响应消息, 对于后者需要获取雀魂发送的消息以获得响应消息类型。

也就是说需要将雀魂发送和接收的消息都发给助手。

类似天凤,搜索 WebSocket 找到下方的 _socket.onmessage_socket.send,添加代码。

服务器收到消息后,可以基于 liqi.json 文件解析雀魂的 protobuf 数据。

record.go 展示了使用 WebSocket 登录和下载牌谱的例子。

考虑到还有观看牌谱这种获取前端 UI 事件的情况,还需修改额外的代码。在网页控制台输入 GameMgr.inRelease = 0,开启调试模式,通过雀魂已有的日志可以看到相关代码在哪。具体修改了哪些内容可以对比雀魂的 code.js 和我修改后的 code-zh.js

参与讨论

吐槽本项目、日麻技术、麻将算法交流,欢迎加入 QQ 群 375865038

License

This project is licensed under the MIT License - see the LICENSE file for details.

mahjong-helper's People

Contributors

endlesscheng avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mahjong-helper's Issues

本地https实现

阿里云的申请localhost,没法通过ca安全审核。使用openssl卡在了
运行“nmake -f ms\ntdll.mak”命令,发现出现问题,
“ms\uplink.c(11) : fatal error C1083: Cannot open include file: 'windows.h': 
No such file or directory NMAKE : fatal error U1077: 'cl' : return code '0x2' Stop.
运行vcvars32.bat和vcvars64.bat没有用
想问一下您是怎么实现访问本地使用https协议的

关于食替的问题。

吃牌之后的食替牌(吃换)牌没有考虑到,虽然平时很容易看出来这个问题,但是还是建议做一下这个功能。

本地https怎么实现

阿里云的申请localhost,没法通过ca安全审核。使用openssl卡在了
运行“nmake -f ms \ ntdll.mak”命令,发现出现问题,
“ms \ uplink.c(11):致命错误C1083:不能打开包含文件:'windows.h': 
没有这样的文件或目录NMAKE:致命错误U1077:'cl':返回代码'0x2'停止。
运行vcvars32.bat和vcvars64.bat没有用
想问一下您是怎么实现访问本地使用HTTPS协议的

添加有关显示样式的设置功能

  1. 何切选项显示上限(0 为无限制)
  2. 何切选择样式(单行、双行)(决定某些内容显示与否:进张种类、改良数等等)
  3. 模切颜色定义
  4. 安牌颜色定义
  5. 何切颜色定义

报错

image
image

哦好像并不是错误。。
这个7067指的是根据听牌后不同的胡牌情况点数不同的平均得点吗?

有关铳牌展示的一些小看法

有其他两家或者三家疑似听牌的时候,要看的安牌太多了,体验很不好。
建议就是在何切的后面加上切这个牌更有可能放铳给哪一家的提示。这样的话在自己想要胡牌的情况下,根据其他家的副露情况来决定是否要打,这样子会好一些吧?
(举个例子,比如上家副露了很多宝牌,而对家的牌型分值应该不高,在决定何切的时候如果还要对比这个程序里面两家的安牌以及自己的何切的话,体验真的不太好;所以不如就在何切的后面或者用其他方式来让用户直观感受到风险最低而自己听牌权重最多的选项?)

天鳳/雀魂顯示異常 【0.2.5】

這個助手在一般情況下是相當好的分析工具,但是在某些情況下就非常頭大。這個助手會在天鳳上面報錯,然後就不顯示了。在雀魂上,這個助手沒有辦法很好的響應牌譜變化(然後黑屏停止工作)。希望這個問題能夠早日修復,繼續努力!

游戏协议变动

雀魂28日开服后code.js文件有所更新,使用当前的0.1.4版本会出现游戏中许多变量显示为undefined,友人场页面打开报错等问题。

雀魂中的部分bug

1.起始位为南,程序当成起始位为北,导致对家显示为我的舍张;
2.全场的副露都算作了我的副露,导致我手牌非常长;
3.因为1,所以当我副露过多时,会提示我的安牌,对家立直时不会提示安牌

关于何切顺序一些不太关键的问题

关于字牌何切的问题 既然可以判断自风 是否能将其加入考量 比如自风为西 手上一张西风一张南风 牌河指示牌不出现相关牌的时候 切西风的顺序在南风之后而不是随机(手牌从左往右?)
关于七对子的问题 有时候4对子的时候似乎会显示两向听以及相关何切 实际体验下7对子两向听离听牌可能很远很远 虽然这个时候应该也有一般型三向听的选项在后面 能否对 七对子/国士无双这种特殊牌型的向听建议前进行标注?
当然这两个问题都并不太影响实际体验 玩家做这些个基本判断的能力还是有的 只不过能改进就更好了
关于役的判断的问题 我看到之前的issue已经有提到了就不重复了
(顺带想问下 听牌型好坏决定是否倒退or改良 如果单纯看加权后的听牌数划线的话 5.0张上下比较合理?)
谢谢!

一个小问题。

如果可以根据牌河判断安全牌,那么同理是不是也可以简单地判断对手大概率会切出什么牌,从而在听牌二择的时候更科学地得出不同听形的胡牌概率呢?

雀魂协议

雀魂协议 使用 protobuff 
具体message https://majsoul.union-game.com/0/v0.4.243.w/res/proto/liqi.json

go语言应该如何运行

该文件应该如何运行?直接扔到部署好的tomcat中么?还是直接go run server.go或者go run main.go

感谢作者~

用了两天还不错,特地注册个帐号前来感谢作者~有几点小问题反馈下。
1.客户端天风没反应,另外一个正常。
2.分析界面花花绿绿看得时间长了不太舒服,如果是按照优先级来制定颜色的话,那可以理解,如果没有优先级的话,可否对颜色上稍微做下调整呢。
3.请问下在界面中,优先级是按照顺序排列的还是颜色呢。

火狐浏览器无法使用插件么?

启动软件以后报错echo: http2: server: error reading preface from client [::1]:61348: remote error: tls: bad certificate类似这种,浏览器插件已安装,证书也设置允许

Installed program is not working

I'm sorry for English, my Chinese is not good.

I followed all steps from the readme, but still, the software is not working for me.

  1. Certificate checking
    image

  2. Header extension
    image

  3. The program was run
    image

I restarted the browser and log in again to majsoul, started a new game and nothing happened in helper. I still can see the only initial message from #3 step.

The same thing happens for tenhou.

Can you please, tell me what I missed?

雀魂访问报错

服务器返回:invalid character '\x03' looking for beginning of value
客户端提示:bad Request
image
400

网络问题导致助手未收到一些操作数据

对于网络波动的情况,雀魂会采取某种 quickLoad 的逻辑,助手未处理这种导致出现类似手牌解析错误的问题。

  1. 检测这种情况。
  2. 玩家刷新网页时的数据恢复,即考虑通过重新载入整局数据的方式来处理这类问题。

有的牌识别不出来

%8_(5MXHZ7 WVJ@IEQU$T4Y

如图所示,别家打出来的牌有的时候会识别不出来
还没注意到发生的时机,不过好像某一家的牌被鸣走之后下一次切牌就大概率识别不出来

部分bug

在实际体验中遇到的部分bug:
1.没有役牌规则,当我手上有19牌一向听时,能鸣牌时会提示我已听牌,然而如果我鸣牌,根本没有役;
2.没法理解副露后的牌型,当我有副露时,在推荐安全牌和切牌时会推荐我打1z,而我手上没有1z;
3.没法理解鸣牌时,手中剩余的牌,如我手中剩余1234p113z,在上家打出1p时会推荐我切3z听1p1z,然而如果我鸣牌了,手中剩下的牌型为14p11z,无法听牌

最新的0.1.2版编译好像有点问题

虽然直接可以下载了,不过从源码编译的时候好像出现了这样的提示

cli.go:8:2: cannot find package "EndlessCheng/mahjong-helper/util" in any of:
/Users/liujinmin/go/src/mahjong-helper-master/vendor/EndlessCheng/mahjong-helper/util (vendor tree)
/usr/local/Cellar/go/1.12/libexec/src/EndlessCheng/mahjong-helper/util (from $GOROOT)
/Users/liujinmin/go/src/EndlessCheng/mahjong-helper/util (from $GOPATH)
tsf-484-wpa-7-023:mahjong-helper-master liujinmin$

牌谱分析功能

我刚刚在这个项目里完成了雀魂的RPC框架和雀魂牌谱的批量下载脚本。

现在我想做一个高级牌谱分析器,主要可能有两部分:

一部分是比雀魂更细致的统计数据分析,分场别和场景统计不同的具体统计数据,比如立直后点炮率、良型立直率与愚型立直率之类的

另一部分更接近一个自动复盘器,相当于我希望能用 mahjong-helper 的功能重新评估牌谱里我每一手的切牌合理性,然后统计出牌效率精确度和防守精确度之类的统计数据

一部分这些功能已经有一些别的项目做过了(比如为天凤写的这个),但是大多做的还不够细致和深入,并且支持的麻将对战平台和牌谱格式也各有不同,我另外也打算写一个交换性比较强的牌谱格式和相应的转换工具来把各个平台的牌谱都统一到这个框架下分析 (格式起了个草稿) 但是现在打算先从雀魂下手

于是我目前希望能够尽量复用这个项目中的既有代码,这样数据结构和代码框架都不用重新设计并且也可以直接使用这个项目的牌效率推荐算法和防守推荐算法。mahjong-helper 有任何打算支持这一类功能的计划么? 我可以开个Branch给 mahjong-helper 直接做牌谱分析功能,或者直接把 utils/ 下面的内容当成库另开项目,哪一种方式你觉得比较合适呢?

一直显示初始界面

按照 README 安装完成,已经多次尝试重启浏览器与程序,一直是这个界面。

关于描述提个小建议

可以感觉出来不同颜色分别代表铳的概率以及和了的概率,但是如果没有个简单介绍的话总感觉有点“这玩意很厉害但我意识不到很厉害”的感觉。(还有改良和进张和听牌没有个tag,刚一看有点头晕

包括平均听牌数已经平均改良张数刚一看的话有些头晕(希望可以加个描述,例如 数字后面可以加个“张”, 40.34 [5 改良] 6.95 这种表示猛一看也有点头晕,虽然想一想知道是什么意思)

使用的一些基本原理啥的注释里既然写出来了感觉写到介绍里也无妨。

确实花点功夫的话都能弄懂,不过对用户不太友好233,
不过如果作者juju不希望广泛传播的话那还是保持原样233(要编译让人有点这种感觉x

话说标示危险牌的功能就是程序里红色的牌吗

以及没咋感受到异常切牌的标示功能

刚使用几盘,反馈一下

请教下使用上的问题

关于 [10无筋] [7无筋]
1.这里的10指的的是什么呢
2.这个7是所有花色的吗,如果不是的话,是不是把花色漏了……
感谢答疑~

建议

1.可否增加关于“筋”的判断选项
2.手里已听牌假设13m,而2m已经给杠走了,依然不提示让你换听……

有关端口使用

目前 mahjong-helper 使用的是 12121 端口,但是万一该端口已被其他的,非 mahjong-helper 程序占用,则:

方案 1 是改变程序使用的端口,但是这样 JS 发送的地址也要变
方案 2 是用类似 netstat -ano|findstr "12121" 的方法提示该端口被 xx 程序占用……
(若为 mahjong-helper 则提示无法双开)

雀魂4.25更新

雀魂4.25日更新后,Header Editor在开启时,游戏依然显示原来的加载页面,并无法加载进入游戏。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.