Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/EndlessCheng/mahjong-helper
日本麻将助手:牌效+防守+记牌(支持雀魂、天凤)
https://github.com/EndlessCheng/mahjong-helper
golang mahjong mahjong-algorithm mahjongsoul majsoul riichi-mahjong tenhou
Last synced: about 1 month ago
JSON representation
日本麻将助手:牌效+防守+记牌(支持雀魂、天凤)
- Host: GitHub
- URL: https://github.com/EndlessCheng/mahjong-helper
- Owner: EndlessCheng
- License: mit
- Created: 2018-09-25T01:31:27.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2022-06-23T01:11:42.000Z (over 2 years ago)
- Last Synced: 2024-08-02T11:20:04.727Z (4 months ago)
- Topics: golang, mahjong, mahjong-algorithm, mahjongsoul, majsoul, riichi-mahjong, tenhou
- Language: Go
- Homepage:
- Size: 2.59 MB
- Stars: 1,982
- Watchers: 26
- Forks: 268
- Open Issues: 37
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- my-awesome - EndlessCheng/mahjong-helper - algorithm,mahjongsoul,majsoul,riichi-mahjong,tenhou pushed_at:2022-06 star:2.0k fork:0.3k 日本麻将助手:牌效+防守+记牌(支持雀魂、天凤) (Go)
- awesome-luooooob - EndlessCheng/mahjong-helper - 日本麻将助手:牌效+防守+记牌(支持雀魂、天凤) (Go)
README
# 日本麻将助手
## 主要功能
- 对战时自动分析手牌,综合进张、打点等,给出推荐舍牌
- 有人立直或多副露时,显示各张牌的危险度
- 记录他家手切摸切
- 助手带你看牌谱,推荐每一打的进攻和防守选择
- 支持四人麻将和三人麻将### 支持平台
- 雀魂网页版([国际中文服 1](https://game.maj-soul.com/1/) | [国际中文服 2](https://game.maj-soul.net/1/) | [日服](https://game.mahjongsoul.com) | [国际服](https://mahjongsoul.game.yo-star.com))
- 天凤([Web](https://tenhou.net/3/) | [4K](https://tenhou.net/4/))## 导航
- [安装](#安装)
- [使用说明](#使用说明)
- [示例](#示例)
* [牌效率](#牌效率)
* [鸣牌判断](#鸣牌判断)
* [手摸切与安牌显示](#手摸切与安牌显示)
- [牌谱与观战](#牌谱与观战)
- [其他功能说明](#其他功能说明)
- [参与讨论](#参与讨论)## 安装
分下面几步:
1. 在浏览器地址栏中输入 `chrome://flags/#allow-insecure-localhost`,然后把高亮那一项从「已禁用」改为「已启用」([若没有该项见此](https://github.com/EndlessCheng/mahjong-helper/issues/108))。该功能仅限基于 Chrome 内核开发的浏览器。
(不同浏览器/版本的描述可能不一样,如果打开的页面是英文的话,高亮的就是 `Allow invalid certificates for resources loaded from localhost`,把它的 Disabled 改成 Enabled)
设置完成后**重启浏览器**。2. 安装浏览器扩展 Header Editor,用于修改 code.js 文件,发送游戏中的玩家操作信息至本地运行的助手。
若能翻墙请前往 [谷歌商城](https://chrome.google.com/webstore/detail/header-editor/eningockdidmgiojffjmkdblpjocbhgh?hl=zh) 下载该扩展。或者 [从 CRX 安装该扩展](https://www.chromefor.com/header-editor_v4-0-7/)(若无法安装试试 360 浏览器)。
安装好扩展后点进该扩展的`管理`界面,点击`导入和导出`,在下载规则中填入 `https://endlesscheng.gitee.io/public/mahjong-helper.json`,点击右侧的下载按钮,然后点击下方的`保存`。(如果您是海外用户,请在下载规则中填入 `https://mjhelper.github.io/mahjong-helper.json` 以获得更好的加载速度。)3. 前往 [releases](https://github.com/EndlessCheng/mahjong-helper/releases/latest) 页面下载助手。解压到本地后打开。
4. 如果您的浏览器之前打开过雀魂网页,需要清除缓存:打开雀魂网页,按下 F12,右键地址栏左侧的刷新按钮,选择「清空缓存并进行硬刷新」。如遇问题,请参考 [#104](https://github.com/EndlessCheng/mahjong-helper/issues/104)。
#### 安装完成!在使用助手前,请先阅读本页面下方的[示例](#示例),以了解助手输出信息的含义。
### 从源码安装此助手
您也可以选择从源码安装此助手:
`go get -u -v github.com/EndlessCheng/mahjong-helper/...`
完成后程序生成于 `$GOPATH/bin/` 目录下。
## 使用说明
按照上述流程安装完成后,启动助手,选择平台即可。
需要先启动本助手,再打开网页。
### 注意事项
终端有个小 bug,在使用中若鼠标点击到了空白处,可能会导致终端卡住,此时按下回车键就可以恢复正常。
## 示例
### 牌效率
每个切牌选择会显示进张数、向听前进后的进张数、可以做的役种等等信息。
**助手会综合每个切牌选择的速度、打点、和率,速度越快,打点和率越高的越靠前。**
每个切牌选择以如下格式显示:
```
进张数[改良后的进张数加权均值] 切哪张牌 => 向听前进后的进张数的加权均值 [手牌速度] [期望打点] [役种] [是否振听] [进张牌]
```例如:
![](img/example01.png)
补充说明:
- 无改良时,不显示改良进张数
- 鸣牌时会显示用手上的哪些牌去吃/碰,详见后文
- 防守时,切牌的文字颜色会因这张牌的安全程度而不同,详见后文
- 门清听牌时,会显示立直的期望点数(考虑自摸、一发和里宝);若默听有役则会额外显示默听的荣和点数
- 存在高低目的场合会显示加权和率的平均点数
- 役种只对较为特殊的进行提示,如三色、一通、七对等。雀魂乱斗之间会有额外的古役提醒
- 若鸣牌且无役会提示 `[无役]`
- 听牌或一向听时根据自家舍牌情况提示振听
- m-万子 p-饼子 s-索子 z-字牌,顺序为东南西北白发中进张数颜色说明:
- 红色:优秀
- 黄色:普通
- 蓝色:较差来看看下面这几道何切题吧。
**1\. 完全一向听**
![](img/example-speed01c.png)
标准的完全一向听形状,切 8s。
![](img/example-speed1.png)
**2\. 三个复合形的一向听**(选自《麻雀 傑作「何切る」300選》Q106)
![](img/example-Q106.png)
这种情况要切哪一张牌呢?
单看进张,切 7s 是进张最广的,但是从更长远的角度来看,切 7s 后会有愚型听牌的可能。
一般来说,牺牲一点进张去换取更高的好型听牌率,或者更高的打点是可以接受的。
如下图所示,这里展示了本助手对进张数、好型听牌和打点的综合判断。相比 7s,切 4m 虽然进张数少了四枚,但是能好型听牌,综合和牌率比 7s 要高,同时还有平和的可能,可以说在保证了速度的同时又兼顾了打点,是最平衡的一打。所以切 4m 这个选项排在第一位。
![](img/example-speed2.png)
**3\. 向听倒退**
![](img/example03b.png)
这里巡目尚早,相比切 8m,切 1m 虽然向听倒退但是进张面广且有断幺一役,速度是高于 8m 的。
如下图,助手额外给出了向听倒退的建议。(根据进张的不同,可能会形成七对,也可能会形成平和等)
![](img/example03a.png)
### 鸣牌判断
下图是一个鸣了红中之后,听坎 5s 的例子,宝牌为 6m。
上家打出 6m 宝牌之后考虑是否鸣牌:
这里就可以考虑用 57m 吃,打出 9m,提升打点的同时又能维持听牌。此外,若巡目尚早可以拆掉 46s 追求混一色。
![](img/example_naki2.png)
### 手摸切与安牌显示
下图展示了某局中三家的手摸切情况(宝牌为红中和 6s,自家手牌此时为 345678m 569p 45667s):
- 白色为手切,暗灰色为摸切
- 鸣牌后打出的那张牌会用灰底白字显示,供读牌分析用
- 副露玩家的手切中张牌(3-7)会有不同颜色的高亮,用来辅助判断其听牌率
- 玩家立直或听牌率较高时会额外显示对该玩家的安牌,用 | 分隔,左侧为现物,右侧按照危险度由低到高排序(No Chance 和 One Chance 的安牌作为补充参考显示在后面,简写为 NC 和 OC)
- 下图上家亲家暗杠 2m 后 4p 立直,对家 8s 追立,下家一副露但是手切了很多中张牌,听牌率较高
- 多家立直/副露时会显示综合危险度
- 危险度综合考虑了巡目、副露数、他家打点估计(包含亲家与否、副露中的宝牌数等)
- `[n无筋]` 指该玩家的无筋危险牌的剩余种类数。剩余种类数越少,这些无筋牌就越危险。剩余种类数为零表示该玩家是愚型听牌或振听(注:把 1p4p 这种算作一对筋牌,对于四人麻将来说一共有 3\*6=18 对筋牌,三人麻将则为 2\*6=12 对筋牌)![](img/example5c1.png)
危险度颜色:
- 白色:现物
- 蓝色:<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`
[配套小工具](https://github.com/EndlessCheng/mahjong-helper-gui)- 指出宝牌是哪些(-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. 在该函数开头(或末尾)添加如下代码:```javascript
var req = new XMLHttpRequest();
req.open("POST", "http://localhost:12121/");
req.send(a.data);
```### 雀魂 (majsoul)
雀魂收发的消息是 protobuf,接收的消息一部分为含有类型的通知消息,另一部分为不含有类型的请求响应消息,
对于后者需要获取雀魂发送的消息以获得响应消息类型。也就是说需要将雀魂发送和接收的消息都发给助手。
类似天凤,搜索 `WebSocket` 找到下方的 `_socket.onmessage` 和 `_socket.send`,添加代码。
服务器收到消息后,可以基于 [liqi.json](https://github.com/EndlessCheng/mahjong-helper/blob/master/platform/majsoul/proto/lq/liqi.json) 文件解析雀魂的 protobuf 数据。
[record.go](https://github.com/EndlessCheng/mahjong-helper/blob/master/platform/majsoul/record.go) 展示了使用 WebSocket 登录和下载牌谱的例子。
考虑到还有观看牌谱这种获取前端 UI 事件的情况,还需修改额外的代码。在网页控制台输入 `GameMgr.inRelease = 0`,开启调试模式,通过雀魂已有的日志可以看到相关代码在哪。具体修改了哪些内容可以对比雀魂的 code.js 和我修改后的 [code-zh.js](https://endlesscheng.gitee.io/public/js/majsoul/code-zh.js)。
## 参与讨论
吐槽本项目、日麻技术、麻将算法交流,欢迎加入 QQ 群 [375865038](https://jq.qq.com/?_wv=1027&k=5FyZOgH)
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.