mahjong_engine 1.1.7 → 1.1.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"BlockDivider.d.ts","sourceRoot":"","sources":["../../modules/BlockDivider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,qBAAa,YAAY;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;gBAEjB,IAAI,EAAE,GAAG,EAAE;IAIvB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,mBAAmB;IAc3B,MAAM,IAAI,aAAa,EAAE;CA0E5B"}
1
+ {"version":3,"file":"BlockDivider.d.ts","sourceRoot":"","sources":["../../modules/BlockDivider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,qBAAa,YAAY;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;gBAEjB,IAAI,EAAE,GAAG,EAAE;IAIvB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,mBAAmB;IAc3B,MAAM,IAAI,aAAa,EAAE;CAmF5B"}
@@ -47,9 +47,14 @@ export class BlockDivider {
47
47
  const blockhaislist = new BlockHaisList();
48
48
  const counts = new Array(PAI_TYPE_NUM).fill(0);
49
49
  this.hais.forEach(h => counts[h.getId() - 1]++);
50
+ const visited = new Set();
50
51
  if (this.hais.length > 14)
51
52
  return results;
52
53
  const dfs = (arr, blocks) => {
54
+ const key = arr.join("") + `:` + blocks.blockToString();
55
+ if (visited.has(key))
56
+ return;
57
+ visited.add(key);
53
58
  const expectedBlocks = Math.floor(this.hais.length / 3);
54
59
  if (blocks.length() === expectedBlocks + 1 && blocks.isStandardHand(expectedBlocks)) {
55
60
  results.push(blocks.clone());
@@ -62,11 +67,11 @@ export class BlockDivider {
62
67
  const hai = new Hai(firstIndex + 1);
63
68
  //刻子の処理
64
69
  if (count >= 3) {
65
- let next = [...arr];
66
- next[firstIndex] -= 3;
70
+ arr[firstIndex] -= 3;
67
71
  blocks.push(new BlockHais([hai, hai, hai], BlockType.KOTSU));
68
- dfs(next, blocks);
72
+ dfs(arr, blocks);
69
73
  blocks.pop();
74
+ arr[firstIndex] += 3;
70
75
  }
71
76
  //順子の処理
72
77
  const hasTiles = arr[firstIndex + 1] > 0 &&
@@ -75,13 +80,15 @@ export class BlockDivider {
75
80
  if (isShuntsuCandidate && hasTiles) {
76
81
  const h2 = new Hai(firstIndex + 2);
77
82
  const h3 = new Hai(firstIndex + 3);
78
- let next = [...arr];
79
- next[firstIndex]--;
80
- next[firstIndex + 1]--;
81
- next[firstIndex + 2]--;
83
+ arr[firstIndex]--;
84
+ arr[firstIndex + 1]--;
85
+ arr[firstIndex + 2]--;
82
86
  blocks.push(new BlockHais([hai, h2, h3], BlockType.SHUNTSU));
83
- dfs(next, blocks);
87
+ dfs(arr, blocks);
84
88
  blocks.pop();
89
+ arr[firstIndex]++;
90
+ arr[firstIndex + 1]++;
91
+ arr[firstIndex + 2]++;
85
92
  }
86
93
  };
87
94
  //通常の面子の組み合わせの判定
@@ -1 +1 @@
1
- {"version":3,"file":"BlockDivider.js","sourceRoot":"","sources":["../../modules/BlockDivider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BlockDivider.js","sourceRoot":"","sources":["../../modules/BlockDivider.ts"],"names":[],"mappings":"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"}
@@ -5,8 +5,6 @@ export declare class ShantenCalculator {
5
5
  constructor(hais: Hai[]);
6
6
  calculate(): number;
7
7
  private calculateShanten;
8
- private isTenpai;
9
- private isAgari;
10
8
  calculateNormal(): number;
11
9
  calculateChitoitsu(): number;
12
10
  calculateKokushi(): number;
@@ -1 +1 @@
1
- {"version":3,"file":"ShantenCalculator.d.ts","sourceRoot":"","sources":["../../modules/ShantenCalculator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAI/B,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;gBAEtB,IAAI,EAAE,GAAG,EAAE;IAMvB,SAAS,IAAI,MAAM;IAQnB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,OAAO;IAIR,eAAe,IAAI,MAAM;IAkFzB,kBAAkB,IAAI,MAAM;IAM5B,gBAAgB,IAAI,MAAM;CAMpC"}
1
+ {"version":3,"file":"ShantenCalculator.d.ts","sourceRoot":"","sources":["../../modules/ShantenCalculator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAI/B,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;gBAEtB,IAAI,EAAE,GAAG,EAAE;IAMvB,SAAS,IAAI,MAAM;IAQnB,OAAO,CAAC,gBAAgB;IAYjB,eAAe,IAAI,MAAM;IAuFzB,kBAAkB,IAAI,MAAM;IAM5B,gBAAgB,IAAI,MAAM;CAMpC"}
@@ -1,6 +1,4 @@
1
- import { BlockDivider } from "./BlockDivider.js";
2
1
  import { Hai } from "./Hai.js";
3
- import { MachiCalculator } from "./MachiCalculator.js";
4
2
  import { PAI_TYPE_NUM } from "./MahjongConsts.js";
5
3
  export class ShantenCalculator {
6
4
  hais;
@@ -22,20 +20,15 @@ export class ShantenCalculator {
22
20
  const usableJanto = Math.min(toitsuCount, 1);
23
21
  return 8 - 2 * (4 - requiredMentsuCount + mentsuCount) - usableTaatsu - usableJanto;
24
22
  }
25
- isTenpai() {
26
- return new MachiCalculator(this.hais).calculate().length > 0;
27
- }
28
- isAgari() {
29
- return new BlockDivider(this.hais).divide().length > 0;
30
- }
31
23
  calculateNormal() {
32
- if (this.isAgari())
33
- return -1;
34
- if (this.isTenpai())
35
- return 0;
36
24
  let minShanten = 8;
37
25
  const requiredMentsuCount = Math.floor(this.hais.length / 3);
26
+ const visited = new Set();
38
27
  const dfs = (arr, mentsuCount, taatsuCount, toitsuCount) => {
28
+ const key = arr.join("") + `:${mentsuCount}:${taatsuCount}:${toitsuCount}`;
29
+ if (visited.has(key))
30
+ return;
31
+ visited.add(key);
39
32
  const firstIndex = arr.findIndex(count => count > 0);
40
33
  if (firstIndex === -1) {
41
34
  const shanten = this.calculateShanten(requiredMentsuCount, mentsuCount, taatsuCount, toitsuCount);
@@ -46,49 +39,53 @@ export class ShantenCalculator {
46
39
  const hai = new Hai(firstIndex + 1);
47
40
  //雀頭
48
41
  if (count >= 2) {
49
- let next = [...arr];
50
- next[firstIndex] -= 2;
51
- dfs(next, mentsuCount, taatsuCount, toitsuCount + 1);
42
+ arr[firstIndex] -= 2;
43
+ dfs(arr, mentsuCount, taatsuCount, toitsuCount + 1);
44
+ arr[firstIndex] += 2;
52
45
  }
53
46
  //刻子
54
47
  if (count >= 3) {
55
- let next = [...arr];
56
- next[firstIndex] -= 3;
57
- dfs(next, mentsuCount + 1, taatsuCount, toitsuCount);
48
+ arr[firstIndex] -= 3;
49
+ dfs(arr, mentsuCount + 1, taatsuCount, toitsuCount);
50
+ arr[firstIndex] += 3;
58
51
  }
59
52
  //順子
60
53
  const hasShuntsuTiles = arr[firstIndex + 1] > 0 &&
61
54
  arr[firstIndex + 2] > 0;
62
55
  const isShuntsuCandidate = hai.isNumberHai() && hai.num <= 7;
63
56
  if (isShuntsuCandidate && hasShuntsuTiles) {
64
- let next = [...arr];
65
- next[firstIndex]--;
66
- next[firstIndex + 1]--;
67
- next[firstIndex + 2]--;
68
- dfs(next, mentsuCount + 1, taatsuCount, toitsuCount);
57
+ arr[firstIndex]--;
58
+ arr[firstIndex + 1]--;
59
+ arr[firstIndex + 2]--;
60
+ dfs(arr, mentsuCount + 1, taatsuCount, toitsuCount);
61
+ arr[firstIndex]++;
62
+ arr[firstIndex + 1]++;
63
+ arr[firstIndex + 2]++;
69
64
  }
70
65
  //両面、辺張ターツ
71
66
  const hasRyanmenTiles = arr[firstIndex + 1] > 0;
72
67
  const isRyanmenCandidate = hai.isNumberHai() && hai.num <= 8;
73
68
  if (isRyanmenCandidate && hasRyanmenTiles) {
74
- let next = [...arr];
75
- next[firstIndex]--;
76
- next[firstIndex + 1]--;
77
- dfs(next, mentsuCount, taatsuCount + 1, toitsuCount);
69
+ arr[firstIndex]--;
70
+ arr[firstIndex + 1]--;
71
+ dfs(arr, mentsuCount, taatsuCount + 1, toitsuCount);
72
+ arr[firstIndex]++;
73
+ arr[firstIndex + 1]++;
78
74
  }
79
75
  //嵌張ターツ
80
76
  const hasKanchanTiles = arr[firstIndex + 2] > 0;
81
77
  const isKanchanCandidate = hai.isNumberHai() && hai.num <= 7;
82
78
  if (isKanchanCandidate && hasKanchanTiles) {
83
- let next = [...arr];
84
- next[firstIndex]--;
85
- next[firstIndex + 2]--;
86
- dfs(next, mentsuCount, taatsuCount + 1, toitsuCount);
79
+ arr[firstIndex]--;
80
+ arr[firstIndex + 2]--;
81
+ dfs(arr, mentsuCount, taatsuCount + 1, toitsuCount);
82
+ arr[firstIndex]++;
83
+ arr[firstIndex + 2]++;
87
84
  }
88
85
  //孤立牌
89
- const next = [...arr];
90
- next[firstIndex]--;
91
- dfs(next, mentsuCount, taatsuCount, toitsuCount);
86
+ arr[firstIndex]--;
87
+ dfs(arr, mentsuCount, taatsuCount, toitsuCount);
88
+ arr[firstIndex]++;
92
89
  };
93
90
  dfs(this.counts, 0, 0, 0);
94
91
  return minShanten;
@@ -1 +1 @@
1
- {"version":3,"file":"ShantenCalculator.js","sourceRoot":"","sources":["../../modules/ShantenCalculator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ShantenCalculator.js","sourceRoot":"","sources":["../../modules/ShantenCalculator.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { YakuDetail } from "./YakuDetail";
1
+ import { YakuDetail } from "./YakuDetail.js";
2
2
  export declare class YakuDetails {
3
3
  private details;
4
4
  constructor(details?: YakuDetail[]);
@@ -1 +1 @@
1
- {"version":3,"file":"YakuDetails.d.ts","sourceRoot":"","sources":["../../../modules/yaku/YakuDetails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,qBAAa,WAAW;IACpB,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,GAAE,UAAU,EAAO;IAItC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO;IAItD,GAAG,CAAC,QAAQ,EAAE,MAAM;IAIpB,MAAM,CAAC,QAAQ,EAAE,MAAM;IAIvB,UAAU;IAIV,gBAAgB;IAIhB,KAAK;IASL,IAAI,MAAM,WAET;CACJ"}
1
+ {"version":3,"file":"YakuDetails.d.ts","sourceRoot":"","sources":["../../../modules/yaku/YakuDetails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,qBAAa,WAAW;IACpB,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,GAAE,UAAU,EAAO;IAItC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO;IAItD,GAAG,CAAC,QAAQ,EAAE,MAAM;IAIpB,MAAM,CAAC,QAAQ,EAAE,MAAM;IAIvB,UAAU;IAIV,gBAAgB;IAIhB,KAAK;IASL,IAAI,MAAM,WAET;CACJ"}
@@ -1,4 +1,4 @@
1
- import { YakuDetail } from "./YakuDetail";
1
+ import { YakuDetail } from "./YakuDetail.js";
2
2
  export class YakuDetails {
3
3
  details;
4
4
  constructor(details = []) {
@@ -1 +1 @@
1
- {"version":3,"file":"YakuDetails.js","sourceRoot":"","sources":["../../../modules/yaku/YakuDetails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,OAAO,WAAW;IACZ,OAAO,CAAe;IAE9B,YAAY,UAAwB,EAAE;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,QAAgB,EAAE,GAAW,EAAE,SAAmB;QAClD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,GAAG,CAAC,QAAgB;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,QAAgB;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,gBAAgB;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAED,KAAK;QACD,OAAO,IAAI,GAAG,CACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,QAAQ;YACf,MAAM,CAAC,GAAG;SACb,CAAC,CACL,CAAC;IACN,CAAC;IAED,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;CACJ"}
1
+ {"version":3,"file":"YakuDetails.js","sourceRoot":"","sources":["../../../modules/yaku/YakuDetails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAO,WAAW;IACZ,OAAO,CAAe;IAE9B,YAAY,UAAwB,EAAE;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,QAAgB,EAAE,GAAW,EAAE,SAAmB;QAClD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,GAAG,CAAC,QAAgB;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,QAAgB;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,gBAAgB;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAED,KAAK;QACD,OAAO,IAAI,GAAG,CACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,QAAQ;YACf,MAAM,CAAC,GAAG;SACb,CAAC,CACL,CAAC;IACN,CAAC;IAED,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;CACJ"}
@@ -57,10 +57,15 @@ export class BlockDivider{
57
57
  const blockhaislist: BlockHaisList = new BlockHaisList();
58
58
  const counts: number[] = new Array(PAI_TYPE_NUM).fill(0);
59
59
  this.hais.forEach(h => counts[h.getId() - 1]++);
60
+ const visited = new Set<string>();
60
61
 
61
62
  if(this.hais.length > 14) return results;
62
63
 
63
64
  const dfs = (arr: number[], blocks: BlockHaisList) => {
65
+ const key = arr.join("") + `:` + blocks.blockToString();
66
+ if (visited.has(key)) return;
67
+ visited.add(key);
68
+
64
69
  const expectedBlocks = Math.floor(this.hais.length / 3);
65
70
 
66
71
  if(blocks.length() === expectedBlocks + 1 && blocks.isStandardHand(expectedBlocks)){
@@ -76,12 +81,13 @@ export class BlockDivider{
76
81
 
77
82
  //刻子の処理
78
83
  if(count >= 3){
79
- let next = [...arr];
80
- next[firstIndex] -= 3;
84
+ arr[firstIndex] -= 3;
81
85
 
82
86
  blocks.push(new BlockHais([hai, hai, hai], BlockType.KOTSU));
83
- dfs(next, blocks);
87
+ dfs(arr, blocks);
84
88
  blocks.pop();
89
+
90
+ arr[firstIndex] += 3;
85
91
  }
86
92
  //順子の処理
87
93
  const hasTiles =
@@ -92,14 +98,17 @@ export class BlockDivider{
92
98
  const h2 = new Hai(firstIndex + 2);
93
99
  const h3 = new Hai(firstIndex + 3);
94
100
 
95
- let next = [...arr];
96
- next[firstIndex]--;
97
- next[firstIndex + 1]--;
98
- next[firstIndex + 2]--;
101
+ arr[firstIndex]--;
102
+ arr[firstIndex + 1]--;
103
+ arr[firstIndex + 2]--;
99
104
 
100
105
  blocks.push(new BlockHais([hai, h2, h3], BlockType.SHUNTSU));
101
- dfs(next, blocks);
106
+ dfs(arr, blocks);
102
107
  blocks.pop();
108
+
109
+ arr[firstIndex]++;
110
+ arr[firstIndex + 1]++;
111
+ arr[firstIndex + 2]++;
103
112
  }
104
113
  };
105
114
 
@@ -33,26 +33,20 @@ export class ShantenCalculator {
33
33
  return 8 - 2 * (4 - requiredMentsuCount + mentsuCount) - usableTaatsu - usableJanto;
34
34
  }
35
35
 
36
- private isTenpai(): boolean {
37
- return new MachiCalculator(this.hais).calculate().length > 0;
38
- }
39
-
40
- private isAgari(): boolean {
41
- return new BlockDivider(this.hais).divide().length > 0;
42
- }
43
-
44
36
  public calculateNormal(): number {
45
- if(this.isAgari()) return -1;
46
- if(this.isTenpai()) return 0;
47
-
48
37
  let minShanten = 8;
49
38
  const requiredMentsuCount = Math.floor(this.hais.length / 3);
39
+ const visited = new Set<string>();
50
40
  const dfs = (
51
41
  arr: number[],
52
42
  mentsuCount: number,
53
43
  taatsuCount: number,
54
44
  toitsuCount: number,
55
45
  ) => {
46
+ const key = arr.join("") + `:${mentsuCount}:${taatsuCount}:${toitsuCount}`;
47
+ if (visited.has(key)) return;
48
+ visited.add(key);
49
+
56
50
  const firstIndex = arr.findIndex(count => count > 0);
57
51
  if(firstIndex === -1) {
58
52
  const shanten = this.calculateShanten(
@@ -70,15 +64,15 @@ export class ShantenCalculator {
70
64
 
71
65
  //雀頭
72
66
  if(count >= 2){
73
- let next = [...arr];
74
- next[firstIndex] -= 2;
75
- dfs(next, mentsuCount, taatsuCount, toitsuCount + 1);
67
+ arr[firstIndex] -= 2;
68
+ dfs(arr, mentsuCount, taatsuCount, toitsuCount + 1);
69
+ arr[firstIndex] += 2;
76
70
  }
77
71
  //刻子
78
72
  if(count >= 3){
79
- let next = [...arr];
80
- next[firstIndex] -= 3;
81
- dfs(next, mentsuCount + 1, taatsuCount, toitsuCount);
73
+ arr[firstIndex] -= 3;
74
+ dfs(arr, mentsuCount + 1, taatsuCount, toitsuCount);
75
+ arr[firstIndex] += 3;
82
76
  }
83
77
  //順子
84
78
  const hasShuntsuTiles =
@@ -86,36 +80,39 @@ export class ShantenCalculator {
86
80
  arr[firstIndex + 2] > 0;
87
81
  const isShuntsuCandidate = hai.isNumberHai() && hai.num <= 7;
88
82
  if(isShuntsuCandidate && hasShuntsuTiles){
89
- let next = [...arr];
90
- next[firstIndex]--;
91
- next[firstIndex + 1]--;
92
- next[firstIndex + 2]--;
93
- dfs(next, mentsuCount + 1, taatsuCount, toitsuCount);
83
+ arr[firstIndex]--;
84
+ arr[firstIndex + 1]--;
85
+ arr[firstIndex + 2]--;
86
+ dfs(arr, mentsuCount + 1, taatsuCount, toitsuCount);
87
+ arr[firstIndex]++;
88
+ arr[firstIndex + 1]++;
89
+ arr[firstIndex + 2]++;
94
90
  }
95
91
  //両面、辺張ターツ
96
92
  const hasRyanmenTiles = arr[firstIndex + 1] > 0;
97
93
  const isRyanmenCandidate = hai.isNumberHai() && hai.num <= 8;
98
94
  if(isRyanmenCandidate && hasRyanmenTiles){
99
- let next = [...arr];
100
- next[firstIndex]--;
101
- next[firstIndex + 1]--;
102
-
103
- dfs(next, mentsuCount, taatsuCount + 1, toitsuCount);
95
+ arr[firstIndex]--;
96
+ arr[firstIndex + 1]--;
97
+ dfs(arr, mentsuCount, taatsuCount + 1, toitsuCount);
98
+ arr[firstIndex]++;
99
+ arr[firstIndex + 1]++;
104
100
  }
105
101
  //嵌張ターツ
106
102
  const hasKanchanTiles = arr[firstIndex + 2] > 0;
107
103
  const isKanchanCandidate = hai.isNumberHai() && hai.num <= 7;
108
104
  if(isKanchanCandidate && hasKanchanTiles){
109
- let next = [...arr];
110
- next[firstIndex]--;
111
- next[firstIndex + 2]--;
112
- dfs(next, mentsuCount, taatsuCount + 1, toitsuCount);
105
+ arr[firstIndex]--;
106
+ arr[firstIndex + 2]--;
107
+ dfs(arr, mentsuCount, taatsuCount + 1, toitsuCount);
108
+ arr[firstIndex]++;
109
+ arr[firstIndex + 2]++;
113
110
  }
114
111
 
115
112
  //孤立牌
116
- const next = [...arr];
117
- next[firstIndex]--;
118
- dfs(next, mentsuCount, taatsuCount, toitsuCount);
113
+ arr[firstIndex]--;
114
+ dfs(arr, mentsuCount, taatsuCount, toitsuCount);
115
+ arr[firstIndex]++;
119
116
  }
120
117
 
121
118
  dfs(this.counts, 0, 0, 0);
@@ -1,4 +1,4 @@
1
- import { YakuDetail } from "./YakuDetail";
1
+ import { YakuDetail } from "./YakuDetail.js";
2
2
 
3
3
  export class YakuDetails{
4
4
  private details: YakuDetail[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mahjong_engine",
3
- "version": "1.1.7",
3
+ "version": "1.1.9",
4
4
  "description": "mahjong",
5
5
  "homepage": "https://github.com/daicharn/IsTheOrderaMahjong#readme",
6
6
  "bugs": {