riichi-mahjong 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/README.md +112 -0
  2. package/index.d.ts +726 -0
  3. package/index.js +1 -0
  4. package/package.json +48 -0
package/README.md ADDED
@@ -0,0 +1,112 @@
1
+ # riichi-mahjong
2
+
3
+ 一个 **日本麻将(日麻)计算引擎**,用于手牌解析、役种计算、符数与番数计算、点数计算和和牌判定。已通过 **Tenhou.net 2009–2024 年历年真实对局数据测试**,累计处理 **19,960,236 手对局**。
4
+
5
+ ---
6
+
7
+ ## 功能
8
+
9
+ - 针对 **微信小程序** 优化的 **日麻计算引擎**:
10
+ - 明副露和暗手牌处理
11
+ - 全部标准役种与役满
12
+ - 宝牌(Dora)与里宝牌(Ura Dora)指示牌计算
13
+ - 支持立直、两立直、一发、岭上开花、海底/河底、抢杠、天和、地和
14
+ - 支持复合役满和双倍役满
15
+ - 精确 **和牌点数计算**:番数、符数、最终点数
16
+ - 使用 **UMD 打包**,适合直接在 **微信小程序** 中 `import` 使用
17
+
18
+ ---
19
+
20
+ ## 安装
21
+
22
+ ```bash
23
+ npm install riichi-mahjong
24
+ ```
25
+
26
+ ## 使用示例
27
+
28
+ ```ts
29
+ import calc, { ETile, WindType } from "riichi-mahjong";
30
+
31
+ // ===== 调用 calc() 执行计算 =====
32
+ const result: CalcResult = calc(
33
+ {
34
+ // 闭合手牌(未副露)
35
+ closedTiles: [ETile.P1, ETile.P1],
36
+ // 副露牌组 [是否明副露, 牌数组]
37
+ openParts: [
38
+ [true, [ETile.M1, ETile.M2, ETile.M3]],
39
+ [true, [ETile.M4, ETile.RED_M5, ETile.M6]],
40
+ [true, [ETile.M7, ETile.M8, ETile.M9]],
41
+ [true, [ETile.M1, ETile.M2, ETile.M3]],
42
+ ],
43
+ },
44
+ {
45
+ // ===== 和牌判定相关选项 =====
46
+ roundWind: WindType.EAST, // 场风
47
+ seatWind: WindType.EAST, // 自风
48
+ doraIndicators: [] as ETile[], // 宝牌指示牌
49
+ uraDoraIndicators: [] as ETile[], // 里宝牌指示牌(立直后有效)
50
+
51
+ // 立直相关
52
+ isRiichi: false, // 是否立直
53
+ isDoubleRiichi: false, // 是否两立直
54
+ isIppatsu: false, // 是否一发
55
+
56
+ // 牌型特殊状态
57
+ isTsumo: false, // 是否自摸
58
+ isRinshan: false, // 是否岭上开花
59
+ isHaiteiHoutei: false, // 是否海底捞月/河底捞鱼
60
+ isChankan: false, // 是否抢杠
61
+ isTenhou: false, // 是否天和
62
+ isChiihou: false, // 是否地和
63
+
64
+ // 役满选项
65
+ isCompositeYakumanAllowed: false, // 是否允许复合役满
66
+ isDoubleYakuman: false, // 是否允许双倍役满
67
+ }
68
+ );
69
+
70
+ // ===== 可选:使用内部工具进行细粒度控制 =====
71
+ // - class HandResolver:解析手牌 { closedTiles, openParts }
72
+ // - yakuCalculator():根据 HandResolver 的结果计算役种与点数
73
+ // - calcScore():根据番、符、庄/闲等信息计算最终点数
74
+ ```
75
+
76
+ ## 结算结果
77
+
78
+ ```ts
79
+ /**
80
+ * 计算结果类型
81
+ */
82
+ type CalcResult = CalcResultWin | CalcResultLose;
83
+
84
+ /**
85
+ * 没有和牌
86
+ */
87
+ interface CalcResultLose {
88
+ isWin: false; // 是否和牌
89
+ message: "NOT_WINNING" | "NO_YAKU"; // 消息
90
+ }
91
+
92
+ /**
93
+ * 和牌
94
+ */
95
+ interface CalcResultWin {
96
+ isWin: true; // 是否和牌
97
+ message: "WINNING"; // 消息
98
+ data: YakuCalcResult; // 计算结果数据
99
+ }
100
+
101
+ /**
102
+ * 和牌计算结果数据类型
103
+ */
104
+ interface YakuCalcResult {
105
+ yaku: Yaku[]; // 役种数组
106
+ dora: Dora[]; // 宝牌数组
107
+ han: number; // 番数
108
+ fu: Fu; // 符数
109
+ score: ScoreResult; // 点数
110
+ hand: WinningHand; // 牌型
111
+ }
112
+ ```