From 3375fb8f7ba76251fa4fe9e280bbe85aaac00cdd Mon Sep 17 00:00:00 2001 From: Didictateur Date: Fri, 4 Apr 2025 11:21:04 +0200 Subject: [PATCH] more yakus implemented --- build/test.js | 4 +- build/test_yakus.js | 4 +- src/tests/test_yakus.ts | 48 ++++++++++++++-- src/yakus/yaku.ts | 120 +++++++++++++++++++++++++++++++++++++--- 4 files changed, 160 insertions(+), 16 deletions(-) diff --git a/build/test.js b/build/test.js index 8766286..ffd361b 100644 --- a/build/test.js +++ b/build/test.js @@ -66,7 +66,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _han \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _assert__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./assert */ \"./src/tests/assert.ts\");\n/* harmony import */ var _yakus_yaku__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../yakus/yaku */ \"./src/yakus/yaku.ts\");\n/* harmony import */ var _hand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../hand */ \"./src/hand.ts\");\n\n\n\nvar count = 0;\nvar total = 0;\nvar h1 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m4m5m6 m7m8m9 p1p2p3 p5p5\");\nvar h2 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1m1 m4m4m4 m7m7m7 p1p1p1 p5p5\");\nvar h3 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1m1 p9p9p9 s1s1s1 w2w2w2 d1d1\");\nvar h4 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m2m3m4 p3p3p3 p4p5p6 s4s4 s6s7s8\");\nvar h5 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m1m2m3 p7p8p9 p7p8p9 w3w3\");\nvar h6 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m1m2m3 p6p7p8 p7p8p9 w3w3\");\nvar h7 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 p1p2p3 s1s2s3 m7m8m9 p9p9\");\n// lipeikou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.lipekou(h5, [], 0) === 1, \"m123 m123 p789 p789 w33 is Lipeikou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.lipekou(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Lipeikou\");\ntotal += 2;\n// ryanpeikou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.ryanpeikou(h5, [], 0) === 3, \"m123 m123 p789 p789 w33 is Ryanpeikou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.ryanpeikou(h6, [], 0) === 0, \"m1123 m123 p678 p789 w33 is not Ryanpeikou\");\ntotal += 2;\n// pinfu\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.pinfu(h1, [], 0) === 1, \"m123 m456 m789 m123 p55 is Pinfu\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.pinfu(h2, [], 0) === 0, \"m111 m444 m777 p111 p55 is not Pinfu\");\ntotal += 2;\n// sanshoku doujun\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanshokuDoujun(h7, [], 0) === 2, \"m123 p123 s123 m789 p99 is Shanshokou Doujun\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanshokuDoujun(h2, [], 0) === 0, \"m111 m444 m777 p111 p55 is not Shanshokou Doujun\");\ntotal += 2;\n// chanta\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h3, [], 0) === 2, \"m111 p999 s111 w222 d11 is Chanta\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h1, [], 0) === 0, \"m123 m456 m789 m123 p55 is not Chanta\");\ntotal += 2;\n// total\nconsole.log(\"Succès: \" + count.toString() + \"/\" + total.toString());\n\n\n//# sourceURL=webpack:///./src/tests/test_yakus.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _assert__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./assert */ \"./src/tests/assert.ts\");\n/* harmony import */ var _yakus_yaku__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../yakus/yaku */ \"./src/yakus/yaku.ts\");\n/* harmony import */ var _hand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../hand */ \"./src/hand.ts\");\n\n\n\nvar count = 0;\nvar total = 0;\nvar h1 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m4m5m6 m7m8m9 m1m2m3 m5m5\");\nvar h2 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1m1 m4m4m4 m7m7m7 p1p1p1 p5p5\");\nvar h3 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1m1 p9p9p9 s1s1s1 w2w2w2 d1d1\");\nvar h4 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m2m3m4 p3p3p3 p4p5p6 s4s4 s6s7s8\");\nvar h5 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m1m2m3 p7p8p9 p7p8p9 w3w3\");\nvar h6 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m1m2m3 p6p7p8 p7p8p9 w3w3\");\nvar h7 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 p1p2p3 s1s2s3 m7m8m9 p9p9\");\nvar h8 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m1m2m3 p6p6 w0w0w0 w3w3w3\");\nvar h9 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m1m2m3 d1d1d1 d2d2d2 d3d3\");\nvar h10 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 p6p6 d1d1d1 d2d2d2 d3d3d3\");\nvar h11 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 w1w1w1 w2w2w2 w3w3w3 w4w4\");\nvar h12 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1 w1w1w1 w2w2w2 w3w3w3 w4w4w4\");\n// lipeikou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.lipekou(h5, [], 0) === 1, \"m123 m123 p789 p789 w33 is Lipeikou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.lipekou(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Lipeikou\");\ntotal += 2;\n// ryanpeikou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.ryanpeikou(h5, [], 0) === 3, \"m123 m123 p789 p789 w33 is Ryanpeikou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.ryanpeikou(h6, [], 0) === 0, \"m1123 m123 p678 p789 w33 is not Ryanpeikou\");\ntotal += 2;\n// pinfu\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.pinfu(h1, [], 0) === 1, \"m123 m456 m789 m123 p55 is Pinfu\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.pinfu(h2, [], 0) === 0, \"m111 m444 m777 p111 p55 is not Pinfu\");\ntotal += 2;\n// sanshoku doujun\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanshokuDoujun(h7, [], 0) === 2, \"m123 p123 s123 m789 p99 is Shanshokou Doujun\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanshokuDoujun(h2, [], 0) === 0, \"m111 m444 m777 p111 p55 is not Shanshokou Doujun\");\ntotal += 2;\n// ittsuu\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.ittsuu(h1, [], 0) === 2, \"m123 m456 m789 m123 m55 is Ittsuu\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.ittsuu(h2, [], 0) === 0, \"m111 m444 m777 p111 p55 is not Ittsu\");\ntotal += 2;\n// tanyao\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.tanyao(h4, [], 0) === 1, \"m234 p333 p456 s44 s678 is Tanyao\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.tanyao(h1, [], 0) === 0, \"m123 m456 m789 m123 p55 is not Tanyao\");\ntotal += 2;\n// yakuhai\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.yakuhai(h3, [], 2) === 1, \"m111 p999 s111 w222 d11 West is Yakuhai\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.yakuhai(h8, [], 3) === 2, \"m123 m123 p66 w000 w333 North is double Yakuhai\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.yakuhai(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 Est is not Yakuhai\");\ntotal += 3;\n// shousangen\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.shousangen(h9, [], 0) === 2, \"m123 m123 d111 d222 d33 is Shousangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.shousangen(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Shousangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.shousangen(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Shousangen\");\ntotal += 3;\n// daisangen\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.daisangen(h10, [], 0) === 13, \"m123 p66 d111 d222 d333 is Daisangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.daisangen(h9, [], 0) === 0, \"m123 m123 d111 d222 d33 is not Daisangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.daisangen(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Daisangen\");\ntotal += 3;\n// shousuushi\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.shousuushii(h11, [], 0) === 13, \"m123 w111 w222 w333 w44 is Daisangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.shousuushii(h12, [], 0) === 0, \"m11 w111 w222 w333 w444 is not Daisangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.shousuushii(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Daisangen\");\ntotal += 3;\n// daisuushi\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.daisuushi(h12, [], 0) === 13, \"m11 w111 w222 w333 w444 is Daisangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.daisuushi(h11, [], 0) === 0, \"m123 w111 w222 w333 w44 is not Daisangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.daisuushi(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Daisangen\");\ntotal += 3;\n// total\nconsole.log(\"Succès: \" + count.toString() + \"/\" + total.toString());\n\n\n//# sourceURL=webpack:///./src/tests/test_yakus.ts?"); /***/ }), @@ -86,7 +86,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ yakus: () => (/* binding */ yakus)\n/* harmony export */ });\nfunction ord(g) {\n return g.getTiles().every(function (t) { return t.getFamily() < 4 &&\n t.getValue() > 1 &&\n t.getValue() < 9; });\n}\nfunction term(g) {\n return g.getTiles().every(function (t) {\n return t.getFamily() < 4 &&\n (t.getValue() === 0 ||\n t.getValue() === 9);\n });\n}\nfunction honn(g) {\n return g.getTiles().every(function (t) {\n return t.getFamily() >= 4;\n });\n}\nfunction chii(g) {\n var t = g.getTiles();\n return t[0].getValue() !== t[1].getValue();\n}\nfunction pon(g) {\n var t = g.getTiles();\n return t[0].getValue() === t[1].getValue();\n}\nvar yakus = {\n lipekou: function (\n /**\n * double suite pure\n * 0/1\n */\n hand, groups, wind) {\n if (groups.length > 0 && !yakus.ryanpeikou(hand, groups, wind)) { // ouvert\n return 0;\n }\n var gr = hand.toGroup();\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n for (var i = 0; i < 3; i++) {\n var g1 = gr[i].getTiles();\n var g2 = gr[i + 1].getTiles();\n if (g1[0].isEqual(g2[0].getFamily(), g2[0].getValue()) &&\n chii(gr[i]) && chii(gr[i + 1])) {\n return 1;\n }\n }\n return 0;\n },\n ryanpeikou: function (\n /**\n * deux doubles suites pures\n * 0/3\n */\n hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n var gr = hand.toGroup();\n gr.filter(function (g) { return chii(g); });\n if (gr.length < 4) { // pas assez de suite\n return 0;\n }\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n var t1 = gr[0].getTiles()[0];\n var t2 = gr[1].getTiles()[0];\n var t3 = gr[2].getTiles()[0];\n var t4 = gr[3].getTiles()[0];\n if (t1.compare(t2) === 0 &&\n t3.compare(t4) === 0) {\n return 3;\n }\n return 0;\n },\n pinfu: function (\n /**\n * tout suite\n * 0/1\n */\n hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n var h = hand.toGroup();\n if (h !== undefined &&\n h.every(function (g) {\n var tiles = g.getTiles();\n return (chii(g) || tiles.length === 2);\n })) {\n return 1;\n }\n return 0;\n },\n sanshokuDoujun: function (\n /**\n * triple suite\n * 1/2\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n var gr = [];\n if (h !== undefined) {\n gr = groups.concat(h);\n }\n else {\n gr = groups;\n }\n gr = gr.filter(function (g) { return chii(g); });\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n if (gr.length < 3) { // pas assez de chii\n return 0;\n }\n else if (gr.length === 3) {\n var t0 = gr[0].getTiles();\n var t1 = gr[1].getTiles();\n var t2 = gr[2].getTiles();\n if (t0[0].getValue() === t1[0].getValue() &&\n t0[0].getValue() === t2[0].getValue() &&\n t0[0].getFamily() !== t1[0].getFamily() &&\n t0[0].getFamily() !== t2[0].getFamily() &&\n t1[0].getFamily() !== t2[0].getFamily()) {\n return groups.length > 0 ? 1 : 2;\n }\n return 0;\n }\n else { // il y a un intrus\n for (var i = 0; i < 4; i++) {\n var index = [];\n for (var j = 0; j < 4; j++) {\n if (j !== i) {\n index.push(j);\n }\n }\n var t0 = gr[index[0]].getTiles();\n var t1 = gr[index[1]].getTiles();\n var t2 = gr[index[2]].getTiles();\n if (t0[0].getValue() === t1[0].getValue() &&\n t0[0].getValue() === t2[0].getValue() &&\n t0[0].getFamily() !== t1[0].getFamily() &&\n t0[0].getFamily() !== t2[0].getFamily() &&\n t1[0].getFamily() !== t2[0].getFamily()) {\n return groups.length > 0 ? 1 : 2;\n }\n }\n return 0;\n }\n },\n ittsuu: function (\n /**\n * grande suite pure\n * 1/2\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n gr.filter(function (g) { return chii(g); });\n if (gr.length < 3) { // trop peu de suite\n return 0;\n }\n else if (gr.length === 3) { // pile le bon nombre\n var g1 = gr[0].getTiles();\n var g2 = gr[1].getTiles();\n var g3 = gr[2].getTiles();\n if (g1[0].getFamily() === g2[0].getFamily() &&\n g2[0].getFamily() === g3[0].getFamily() &&\n g1[0].getValue() === 1 &&\n g2[0].getValue() === 4 &&\n g3[0].getValue() === 7) {\n return groups.length > 0 ? 1 : 2;\n }\n }\n else { // il y a un intrus\n return 0; //TODO\n }\n return 0;\n },\n tanyao: function (\n /**\n * tout ordinaire\n * 1/1\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (h === undefined) {\n return 0;\n }\n if (groups.every(function (g) { return ord(g); }) &&\n h.every(function (g) { return ord(g); })) {\n return 1;\n }\n return 0;\n },\n yakuhai: function (\n /**\n * brelan de valeur\n * 1/1\n */\n // TODO multiplicité !\n hand, groups, wind) {\n return 0;\n },\n shousangen: function (//TODO\n /**\n * trois petits dragons\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n daisangen: function (//TODO\n /**\n * trois grands dragons\n * 13/13\n */\n hand, groups, wind) {\n return 0;\n },\n shousuushii: function (//TODO\n /**\n * quatre petits vents\n * 13/13\n */\n hand, groups, wind) {\n return 0;\n },\n daisuushi: function (//TODO\n /**\n * quatre grands vents\n * 13/13\n */\n hand, groups, wind) {\n return 0;\n },\n chanta: function (//TODO\n /**\n * terminales et honneurs partout\n * 1/2\n */\n hand, groups, wind) {\n return 0;\n },\n junchan: function (//TODO\n /**\n * terminales partout\n * 2/3\n */\n hand, groups, wind) {\n return 0;\n },\n honroutou: function (//TODO\n /**\n * tout terminale et honneur\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n chinroutou: function (\n /**\n * tout terminale\n * 13/13\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (h === undefined) {\n return 0;\n }\n if (groups.every(function (g) { return term(g); }) &&\n h.every(function (g) { return term(g); })) {\n return 13;\n }\n return 0;\n },\n tsuuiisou: function (\n /**\n * tout honneur\n * 13/13\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (h === undefined) {\n return 0;\n }\n if (groups.every(function (g) { return honn(g); }) &&\n h.every(function (g) { return honn(g); })) {\n return 13;\n }\n return 0;\n },\n kokushiMusou: function (\n /**\n * treize orphelins\n * 0/13\n */\n hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n if (yakus.honroutou(hand, groups, wind) === 0) {\n return 0;\n }\n var h = hand.getTiles();\n var count = 0;\n for (var i = 0; i < h.length - 1; i++) {\n if (h[i].isEqual(h[i + 1].getFamily(), h[i + 1].getValue())) {\n count++;\n }\n if (count > 1) {\n break;\n }\n }\n if (count === 1) {\n return 13;\n }\n return 0;\n },\n chiitoitsu: function (\n /**\n * sept paires\n * 0/2\n */\n hand, groups, wind) {\n return 0;\n if (groups.length > 0) {\n return 0;\n }\n //TODO\n },\n toitoi: function (\n /**\n * tout brelans\n * 2/2\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (groups.every(function (g) { return pon(g); }) &&\n (h === null || h === void 0 ? void 0 : h.every(function (g) { return pon(g); }))) {\n return 2;\n }\n return 0;\n },\n sanankou: function (\n /**\n * trois brelan cachés\n * 2/2\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n var count = 0;\n h === null || h === void 0 ? void 0 : h.forEach(function (g) {\n if (pon(g) && g.getTiles().length === 3) {\n count++;\n }\n });\n if (count === 3) {\n return 2;\n }\n return 0;\n },\n suuankou: function (\n /**\n * quatre brelans cachés\n * 0/13\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n var count = 0;\n h === null || h === void 0 ? void 0 : h.forEach(function (g) {\n if (pon(g) && g.getTiles().length === 3) {\n count++;\n }\n });\n if (count === 4) {\n return 13;\n }\n return 0;\n },\n sanshokuDoukou: function (//TODO\n /**\n * triple brelan\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n sankantsu: function (//TODO\n /**\n * trois carrés\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n suukantsu: function (//TODO\n /**\n * quatre carrés\n * 13/13\n */\n hand, groups, wind) {\n return 0;\n },\n honitsu: function (//TODO\n /**\n * semie pure\n * 2/3\n */\n hand, groups, wind) {\n return 0;\n },\n chinitsu: function (\n /**\n * main pure\n * 5/6\n */\n hand, groups, wind) {\n var h = hand.getTiles();\n var t0 = h[0];\n if (h.every(function (t) { return t.getFamily() === t0.getFamily(); }) &&\n groups.every(function (g) { return g.getTiles().every(function (t) { return t.getFamily() === t0.getFamily(); }); })) {\n return groups.length > 0 ? 5 : 6;\n }\n return 0;\n },\n ryuuisou: function (//TODO\n /**\n * main verte\n * 13/13\n */\n hand, groups, wind) {\n if (yakus.chinitsu(hand, groups, wind) === 0) {\n return 0;\n }\n return 0;\n },\n chuurenPoutou: function (//TODO\n /**\n * neuf portes\n * 0/13\n */\n hand, groups, wind) {\n if (groups.length > 0 || yakus.chinitsu(hand, groups, wind) === 0) {\n return 0;\n }\n return 0;\n }\n};\n\n\n//# sourceURL=webpack:///./src/yakus/yaku.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ yakus: () => (/* binding */ yakus)\n/* harmony export */ });\nfunction ord(g) {\n return g.getTiles().every(function (t) { return t.getFamily() < 4 &&\n t.getValue() > 1 &&\n t.getValue() < 9; });\n}\nfunction term(g) {\n return g.getTiles().every(function (t) {\n return t.getFamily() < 4 &&\n (t.getValue() === 0 ||\n t.getValue() === 9);\n });\n}\nfunction honn(g) {\n return g.getTiles().every(function (t) {\n return t.getFamily() >= 4;\n });\n}\nfunction chii(g) {\n var t = g.getTiles();\n return t[0].getValue() !== t[1].getValue();\n}\nfunction pon(g) {\n var t = g.getTiles();\n return t[0].getValue() === t[1].getValue();\n}\nvar yakus = {\n lipekou: function (\n /**\n * double suite pure\n * 0/1\n */\n hand, groups, wind) {\n if (groups.length > 0 && !yakus.ryanpeikou(hand, groups, wind)) { // ouvert\n return 0;\n }\n var gr = hand.toGroup();\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n for (var i = 0; i < 3; i++) {\n var g1 = gr[i].getTiles();\n var g2 = gr[i + 1].getTiles();\n if (g1[0].isEqual(g2[0].getFamily(), g2[0].getValue()) &&\n chii(gr[i]) && chii(gr[i + 1])) {\n return 1;\n }\n }\n return 0;\n },\n ryanpeikou: function (\n /**\n * deux doubles suites pures\n * 0/3\n */\n hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n var gr = hand.toGroup();\n gr.filter(function (g) { return chii(g); });\n if (gr.length < 4) { // pas assez de suite\n return 0;\n }\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n var t1 = gr[0].getTiles()[0];\n var t2 = gr[1].getTiles()[0];\n var t3 = gr[2].getTiles()[0];\n var t4 = gr[3].getTiles()[0];\n if (t1.compare(t2) === 0 &&\n t3.compare(t4) === 0) {\n return 3;\n }\n return 0;\n },\n pinfu: function (\n /**\n * tout suite\n * 0/1\n */\n hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n var h = hand.toGroup();\n if (h !== undefined &&\n h.every(function (g) {\n var tiles = g.getTiles();\n return (chii(g) || tiles.length === 2);\n })) {\n return 1;\n }\n return 0;\n },\n sanshokuDoujun: function (\n /**\n * triple suite\n * 1/2\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n var gr = [];\n if (h !== undefined) {\n gr = groups.concat(h);\n }\n else {\n gr = groups;\n }\n gr = gr.filter(function (g) { return chii(g); });\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n if (gr.length < 3) { // pas assez de chii\n return 0;\n }\n else if (gr.length === 3) {\n var t0 = gr[0].getTiles();\n var t1 = gr[1].getTiles();\n var t2 = gr[2].getTiles();\n if (t0[0].getValue() === t1[0].getValue() &&\n t0[0].getValue() === t2[0].getValue() &&\n t0[0].getFamily() !== t1[0].getFamily() &&\n t0[0].getFamily() !== t2[0].getFamily() &&\n t1[0].getFamily() !== t2[0].getFamily()) {\n return groups.length > 0 ? 1 : 2;\n }\n return 0;\n }\n else { // il y a un intrus\n for (var i = 0; i < 4; i++) {\n var index = [];\n for (var j = 0; j < 4; j++) {\n if (j !== i) {\n index.push(j);\n }\n }\n var t0 = gr[index[0]].getTiles();\n var t1 = gr[index[1]].getTiles();\n var t2 = gr[index[2]].getTiles();\n if (t0[0].getValue() === t1[0].getValue() &&\n t0[0].getValue() === t2[0].getValue() &&\n t0[0].getFamily() !== t1[0].getFamily() &&\n t0[0].getFamily() !== t2[0].getFamily() &&\n t1[0].getFamily() !== t2[0].getFamily()) {\n return groups.length > 0 ? 1 : 2;\n }\n }\n return 0;\n }\n },\n ittsuu: function (\n /**\n * grande suite pure\n * 1/2\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) { return chii(g); });\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n if (gr.length < 3) { // trop peu de suite\n return 0;\n }\n else if (gr.length === 3) { // pile le bon nombre\n var g1 = gr[0].getTiles();\n var g2 = gr[1].getTiles();\n var g3 = gr[2].getTiles();\n if (g1[0].getFamily() === g2[0].getFamily() &&\n g2[0].getFamily() === g3[0].getFamily() &&\n g1[0].getValue() === 1 &&\n g2[0].getValue() === 4 &&\n g3[0].getValue() === 7) {\n return groups.length > 0 ? 1 : 2;\n }\n }\n else { // il y a un intrus\n for (var i = 0; i < 4; i++) {\n var index = [];\n for (var j = 0; j < 4; j++) {\n if (j !== i) {\n index.push(j);\n }\n }\n var t0 = gr[index[0]].getTiles();\n var t1 = gr[index[1]].getTiles();\n var t2 = gr[index[2]].getTiles();\n if (t0[0].getValue() === 1 &&\n t1[0].getValue() === 4 &&\n t2[0].getValue() === 7 &&\n t0[0].getFamily() === t1[0].getFamily() &&\n t0[0].getFamily() === t2[0].getFamily()) {\n return groups.length > 0 ? 1 : 2;\n }\n }\n return 0;\n }\n return 0;\n },\n tanyao: function (\n /**\n * tout ordinaire\n * 1/1\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (h === undefined) {\n return 0;\n }\n if (groups.every(function (g) { return ord(g); }) &&\n h.every(function (g) { return ord(g); })) {\n return 1;\n }\n return 0;\n },\n yakuhai: function (\n /**\n * brelan de valeur\n * 1/1\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) { return pon(g) && g.getTiles().length === 3; });\n var han = 0;\n gr.forEach(function (g) {\n var t = g.getTiles();\n var f = t[0].getFamily();\n var v = t[0].getValue();\n if (f === 5) { // brelan de dragon\n han++;\n }\n if (f === 4 && v === 0) { // vent d'est\n han++;\n }\n if (f === 4 && v === wind) { // vent du joueur\n han++;\n }\n });\n return han;\n },\n shousangen: function (\n /**\n * trois petits dragons\n * 2/2\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) { return pon(g); });\n var nbPon = 0;\n var nbPair = 0;\n gr.forEach(function (g) {\n var t = g.getTiles();\n if (t[0].getFamily() === 5) {\n if (t.length === 3) {\n nbPon++;\n }\n else {\n nbPair++;\n }\n }\n });\n if (nbPon == 2 && nbPair == 1) {\n return 2;\n }\n return 0;\n },\n daisangen: function (\n /**\n * trois grands dragons\n * 13/13\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) { return pon(g) &&\n g.getTiles().length === 3 &&\n g.getTiles()[0].getFamily() === 5; });\n if (gr.length === 3) {\n return 13;\n }\n return 0;\n },\n shousuushii: function (\n /**\n * quatre petits vents\n * 13/13\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) { return pon(g); });\n var nbPon = 0;\n var nbPair = 0;\n gr.forEach(function (g) {\n var t = g.getTiles();\n if (t[0].getFamily() === 4) {\n if (t.length === 3) {\n nbPon++;\n }\n else {\n nbPair++;\n }\n }\n });\n if (nbPon == 3 && nbPair == 1) {\n return 13;\n }\n return 0;\n },\n daisuushi: function (\n /**\n * quatre grands vents\n * 13/13\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) { return pon(g); });\n var nbPon = 0;\n var nbPair = 0;\n gr.forEach(function (g) {\n var t = g.getTiles();\n if (t[0].getFamily() === 4) {\n if (t.length === 3) {\n nbPon++;\n }\n else {\n nbPair++;\n }\n }\n });\n if (nbPon == 4 && nbPair == 0) {\n return 13;\n }\n return 0;\n },\n chanta: function (//TODO\n /**\n * terminales et honneurs partout\n * 1/2\n */\n hand, groups, wind) {\n return 0;\n },\n junchan: function (//TODO\n /**\n * terminales partout\n * 2/3\n */\n hand, groups, wind) {\n return 0;\n },\n honroutou: function (//TODO\n /**\n * tout terminale et honneur\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n chinroutou: function (\n /**\n * tout terminale\n * 13/13\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (h === undefined) {\n return 0;\n }\n if (groups.every(function (g) { return term(g); }) &&\n h.every(function (g) { return term(g); })) {\n return 13;\n }\n return 0;\n },\n tsuuiisou: function (\n /**\n * tout honneur\n * 13/13\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (h === undefined) {\n return 0;\n }\n if (groups.every(function (g) { return honn(g); }) &&\n h.every(function (g) { return honn(g); })) {\n return 13;\n }\n return 0;\n },\n kokushiMusou: function (\n /**\n * treize orphelins\n * 0/13\n */\n hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n if (yakus.honroutou(hand, groups, wind) === 0) {\n return 0;\n }\n var h = hand.getTiles();\n var count = 0;\n for (var i = 0; i < h.length - 1; i++) {\n if (h[i].isEqual(h[i + 1].getFamily(), h[i + 1].getValue())) {\n count++;\n }\n if (count > 1) {\n break;\n }\n }\n if (count === 1) {\n return 13;\n }\n return 0;\n },\n chiitoitsu: function (\n /**\n * sept paires\n * 0/2\n */\n hand, groups, wind) {\n return 0;\n if (groups.length > 0) {\n return 0;\n }\n //TODO\n },\n toitoi: function (\n /**\n * tout brelans\n * 2/2\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (groups.every(function (g) { return pon(g); }) &&\n (h === null || h === void 0 ? void 0 : h.every(function (g) { return pon(g); }))) {\n return 2;\n }\n return 0;\n },\n sanankou: function (\n /**\n * trois brelan cachés\n * 2/2\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n var count = 0;\n h === null || h === void 0 ? void 0 : h.forEach(function (g) {\n if (pon(g) && g.getTiles().length === 3) {\n count++;\n }\n });\n if (count === 3) {\n return 2;\n }\n return 0;\n },\n suuankou: function (\n /**\n * quatre brelans cachés\n * 0/13\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n var count = 0;\n h === null || h === void 0 ? void 0 : h.forEach(function (g) {\n if (pon(g) && g.getTiles().length === 3) {\n count++;\n }\n });\n if (count === 4) {\n return 13;\n }\n return 0;\n },\n sanshokuDoukou: function (//TODO\n /**\n * triple brelan\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n sankantsu: function (//TODO\n /**\n * trois carrés\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n suukantsu: function (//TODO\n /**\n * quatre carrés\n * 13/13\n */\n hand, groups, wind) {\n return 0;\n },\n honitsu: function (//TODO\n /**\n * semie pure\n * 2/3\n */\n hand, groups, wind) {\n return 0;\n },\n chinitsu: function (\n /**\n * main pure\n * 5/6\n */\n hand, groups, wind) {\n var h = hand.getTiles();\n var t0 = h[0];\n if (h.every(function (t) { return t.getFamily() === t0.getFamily(); }) &&\n groups.every(function (g) { return g.getTiles().every(function (t) { return t.getFamily() === t0.getFamily(); }); })) {\n return groups.length > 0 ? 5 : 6;\n }\n return 0;\n },\n ryuuisou: function (//TODO\n /**\n * main verte\n * 13/13\n */\n hand, groups, wind) {\n if (yakus.chinitsu(hand, groups, wind) === 0) {\n return 0;\n }\n return 0;\n },\n chuurenPoutou: function (//TODO\n /**\n * neuf portes\n * 0/13\n */\n hand, groups, wind) {\n if (groups.length > 0 || yakus.chinitsu(hand, groups, wind) === 0) {\n return 0;\n }\n return 0;\n }\n};\n\n\n//# sourceURL=webpack:///./src/yakus/yaku.ts?"); /***/ }) diff --git a/build/test_yakus.js b/build/test_yakus.js index 5f51e55..f0035e7 100644 --- a/build/test_yakus.js +++ b/build/test_yakus.js @@ -46,7 +46,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _assert__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./assert */ \"./src/tests/assert.ts\");\n/* harmony import */ var _yakus_yaku__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../yakus/yaku */ \"./src/yakus/yaku.ts\");\n/* harmony import */ var _hand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../hand */ \"./src/hand.ts\");\n\n\n\nvar count = 0;\nvar total = 0;\nvar h1 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m4m5m6 m7m8m9 p1p2p3 p5p5\");\nvar h2 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1m1 m4m4m4 m7m7m7 p1p1p1 p5p5\");\nvar h3 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1m1 p9p9p9 s1s1s1 w2w2w2 d1d1\");\nvar h4 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m2m3m4 p3p3p3 p4p5p6 s4s4 s6s7s8\");\nvar h5 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m1m2m3 p7p8p9 p7p8p9 w3w3\");\nvar h6 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m1m2m3 p6p7p8 p7p8p9 w3w3\");\nvar h7 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 p1p2p3 s1s2s3 m7m8m9 p9p9\");\n// lipeikou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.lipekou(h5, [], 0) === 1, \"m123 m123 p789 p789 w33 is Lipeikou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.lipekou(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Lipeikou\");\ntotal += 2;\n// ryanpeikou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.ryanpeikou(h5, [], 0) === 3, \"m123 m123 p789 p789 w33 is Ryanpeikou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.ryanpeikou(h6, [], 0) === 0, \"m1123 m123 p678 p789 w33 is not Ryanpeikou\");\ntotal += 2;\n// pinfu\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.pinfu(h1, [], 0) === 1, \"m123 m456 m789 m123 p55 is Pinfu\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.pinfu(h2, [], 0) === 0, \"m111 m444 m777 p111 p55 is not Pinfu\");\ntotal += 2;\n// sanshoku doujun\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanshokuDoujun(h7, [], 0) === 2, \"m123 p123 s123 m789 p99 is Shanshokou Doujun\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanshokuDoujun(h2, [], 0) === 0, \"m111 m444 m777 p111 p55 is not Shanshokou Doujun\");\ntotal += 2;\n// chanta\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h3, [], 0) === 2, \"m111 p999 s111 w222 d11 is Chanta\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h1, [], 0) === 0, \"m123 m456 m789 m123 p55 is not Chanta\");\ntotal += 2;\n// total\nconsole.log(\"Succès: \" + count.toString() + \"/\" + total.toString());\n\n\n//# sourceURL=webpack:///./src/tests/test_yakus.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _assert__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./assert */ \"./src/tests/assert.ts\");\n/* harmony import */ var _yakus_yaku__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../yakus/yaku */ \"./src/yakus/yaku.ts\");\n/* harmony import */ var _hand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../hand */ \"./src/hand.ts\");\n\n\n\nvar count = 0;\nvar total = 0;\nvar h1 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m4m5m6 m7m8m9 m1m2m3 m5m5\");\nvar h2 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1m1 m4m4m4 m7m7m7 p1p1p1 p5p5\");\nvar h3 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1m1 p9p9p9 s1s1s1 w2w2w2 d1d1\");\nvar h4 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m2m3m4 p3p3p3 p4p5p6 s4s4 s6s7s8\");\nvar h5 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m1m2m3 p7p8p9 p7p8p9 w3w3\");\nvar h6 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m1m2m3 p6p7p8 p7p8p9 w3w3\");\nvar h7 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 p1p2p3 s1s2s3 m7m8m9 p9p9\");\nvar h8 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m1m2m3 p6p6 w0w0w0 w3w3w3\");\nvar h9 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m1m2m3 d1d1d1 d2d2d2 d3d3\");\nvar h10 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 p6p6 d1d1d1 d2d2d2 d3d3d3\");\nvar h11 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 w1w1w1 w2w2w2 w3w3w3 w4w4\");\nvar h12 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1 w1w1w1 w2w2w2 w3w3w3 w4w4w4\");\n// lipeikou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.lipekou(h5, [], 0) === 1, \"m123 m123 p789 p789 w33 is Lipeikou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.lipekou(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Lipeikou\");\ntotal += 2;\n// ryanpeikou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.ryanpeikou(h5, [], 0) === 3, \"m123 m123 p789 p789 w33 is Ryanpeikou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.ryanpeikou(h6, [], 0) === 0, \"m1123 m123 p678 p789 w33 is not Ryanpeikou\");\ntotal += 2;\n// pinfu\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.pinfu(h1, [], 0) === 1, \"m123 m456 m789 m123 p55 is Pinfu\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.pinfu(h2, [], 0) === 0, \"m111 m444 m777 p111 p55 is not Pinfu\");\ntotal += 2;\n// sanshoku doujun\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanshokuDoujun(h7, [], 0) === 2, \"m123 p123 s123 m789 p99 is Shanshokou Doujun\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanshokuDoujun(h2, [], 0) === 0, \"m111 m444 m777 p111 p55 is not Shanshokou Doujun\");\ntotal += 2;\n// ittsuu\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.ittsuu(h1, [], 0) === 2, \"m123 m456 m789 m123 m55 is Ittsuu\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.ittsuu(h2, [], 0) === 0, \"m111 m444 m777 p111 p55 is not Ittsu\");\ntotal += 2;\n// tanyao\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.tanyao(h4, [], 0) === 1, \"m234 p333 p456 s44 s678 is Tanyao\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.tanyao(h1, [], 0) === 0, \"m123 m456 m789 m123 p55 is not Tanyao\");\ntotal += 2;\n// yakuhai\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.yakuhai(h3, [], 2) === 1, \"m111 p999 s111 w222 d11 West is Yakuhai\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.yakuhai(h8, [], 3) === 2, \"m123 m123 p66 w000 w333 North is double Yakuhai\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.yakuhai(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 Est is not Yakuhai\");\ntotal += 3;\n// shousangen\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.shousangen(h9, [], 0) === 2, \"m123 m123 d111 d222 d33 is Shousangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.shousangen(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Shousangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.shousangen(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Shousangen\");\ntotal += 3;\n// daisangen\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.daisangen(h10, [], 0) === 13, \"m123 p66 d111 d222 d333 is Daisangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.daisangen(h9, [], 0) === 0, \"m123 m123 d111 d222 d33 is not Daisangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.daisangen(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Daisangen\");\ntotal += 3;\n// shousuushi\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.shousuushii(h11, [], 0) === 13, \"m123 w111 w222 w333 w44 is Daisangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.shousuushii(h12, [], 0) === 0, \"m11 w111 w222 w333 w444 is not Daisangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.shousuushii(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Daisangen\");\ntotal += 3;\n// daisuushi\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.daisuushi(h12, [], 0) === 13, \"m11 w111 w222 w333 w444 is Daisangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.daisuushi(h11, [], 0) === 0, \"m123 w111 w222 w333 w44 is not Daisangen\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.daisuushi(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Daisangen\");\ntotal += 3;\n// total\nconsole.log(\"Succès: \" + count.toString() + \"/\" + total.toString());\n\n\n//# sourceURL=webpack:///./src/tests/test_yakus.ts?"); /***/ }), @@ -66,7 +66,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ yakus: () => (/* binding */ yakus)\n/* harmony export */ });\nfunction ord(g) {\n return g.getTiles().every(function (t) { return t.getFamily() < 4 &&\n t.getValue() > 1 &&\n t.getValue() < 9; });\n}\nfunction term(g) {\n return g.getTiles().every(function (t) {\n return t.getFamily() < 4 &&\n (t.getValue() === 0 ||\n t.getValue() === 9);\n });\n}\nfunction honn(g) {\n return g.getTiles().every(function (t) {\n return t.getFamily() >= 4;\n });\n}\nfunction chii(g) {\n var t = g.getTiles();\n return t[0].getValue() !== t[1].getValue();\n}\nfunction pon(g) {\n var t = g.getTiles();\n return t[0].getValue() === t[1].getValue();\n}\nvar yakus = {\n lipekou: function (\n /**\n * double suite pure\n * 0/1\n */\n hand, groups, wind) {\n if (groups.length > 0 && !yakus.ryanpeikou(hand, groups, wind)) { // ouvert\n return 0;\n }\n var gr = hand.toGroup();\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n for (var i = 0; i < 3; i++) {\n var g1 = gr[i].getTiles();\n var g2 = gr[i + 1].getTiles();\n if (g1[0].isEqual(g2[0].getFamily(), g2[0].getValue()) &&\n chii(gr[i]) && chii(gr[i + 1])) {\n return 1;\n }\n }\n return 0;\n },\n ryanpeikou: function (\n /**\n * deux doubles suites pures\n * 0/3\n */\n hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n var gr = hand.toGroup();\n gr.filter(function (g) { return chii(g); });\n if (gr.length < 4) { // pas assez de suite\n return 0;\n }\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n var t1 = gr[0].getTiles()[0];\n var t2 = gr[1].getTiles()[0];\n var t3 = gr[2].getTiles()[0];\n var t4 = gr[3].getTiles()[0];\n if (t1.compare(t2) === 0 &&\n t3.compare(t4) === 0) {\n return 3;\n }\n return 0;\n },\n pinfu: function (\n /**\n * tout suite\n * 0/1\n */\n hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n var h = hand.toGroup();\n if (h !== undefined &&\n h.every(function (g) {\n var tiles = g.getTiles();\n return (chii(g) || tiles.length === 2);\n })) {\n return 1;\n }\n return 0;\n },\n sanshokuDoujun: function (\n /**\n * triple suite\n * 1/2\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n var gr = [];\n if (h !== undefined) {\n gr = groups.concat(h);\n }\n else {\n gr = groups;\n }\n gr = gr.filter(function (g) { return chii(g); });\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n if (gr.length < 3) { // pas assez de chii\n return 0;\n }\n else if (gr.length === 3) {\n var t0 = gr[0].getTiles();\n var t1 = gr[1].getTiles();\n var t2 = gr[2].getTiles();\n if (t0[0].getValue() === t1[0].getValue() &&\n t0[0].getValue() === t2[0].getValue() &&\n t0[0].getFamily() !== t1[0].getFamily() &&\n t0[0].getFamily() !== t2[0].getFamily() &&\n t1[0].getFamily() !== t2[0].getFamily()) {\n return groups.length > 0 ? 1 : 2;\n }\n return 0;\n }\n else { // il y a un intrus\n for (var i = 0; i < 4; i++) {\n var index = [];\n for (var j = 0; j < 4; j++) {\n if (j !== i) {\n index.push(j);\n }\n }\n var t0 = gr[index[0]].getTiles();\n var t1 = gr[index[1]].getTiles();\n var t2 = gr[index[2]].getTiles();\n if (t0[0].getValue() === t1[0].getValue() &&\n t0[0].getValue() === t2[0].getValue() &&\n t0[0].getFamily() !== t1[0].getFamily() &&\n t0[0].getFamily() !== t2[0].getFamily() &&\n t1[0].getFamily() !== t2[0].getFamily()) {\n return groups.length > 0 ? 1 : 2;\n }\n }\n return 0;\n }\n },\n ittsuu: function (\n /**\n * grande suite pure\n * 1/2\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n gr.filter(function (g) { return chii(g); });\n if (gr.length < 3) { // trop peu de suite\n return 0;\n }\n else if (gr.length === 3) { // pile le bon nombre\n var g1 = gr[0].getTiles();\n var g2 = gr[1].getTiles();\n var g3 = gr[2].getTiles();\n if (g1[0].getFamily() === g2[0].getFamily() &&\n g2[0].getFamily() === g3[0].getFamily() &&\n g1[0].getValue() === 1 &&\n g2[0].getValue() === 4 &&\n g3[0].getValue() === 7) {\n return groups.length > 0 ? 1 : 2;\n }\n }\n else { // il y a un intrus\n return 0; //TODO\n }\n return 0;\n },\n tanyao: function (\n /**\n * tout ordinaire\n * 1/1\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (h === undefined) {\n return 0;\n }\n if (groups.every(function (g) { return ord(g); }) &&\n h.every(function (g) { return ord(g); })) {\n return 1;\n }\n return 0;\n },\n yakuhai: function (\n /**\n * brelan de valeur\n * 1/1\n */\n // TODO multiplicité !\n hand, groups, wind) {\n return 0;\n },\n shousangen: function (//TODO\n /**\n * trois petits dragons\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n daisangen: function (//TODO\n /**\n * trois grands dragons\n * 13/13\n */\n hand, groups, wind) {\n return 0;\n },\n shousuushii: function (//TODO\n /**\n * quatre petits vents\n * 13/13\n */\n hand, groups, wind) {\n return 0;\n },\n daisuushi: function (//TODO\n /**\n * quatre grands vents\n * 13/13\n */\n hand, groups, wind) {\n return 0;\n },\n chanta: function (//TODO\n /**\n * terminales et honneurs partout\n * 1/2\n */\n hand, groups, wind) {\n return 0;\n },\n junchan: function (//TODO\n /**\n * terminales partout\n * 2/3\n */\n hand, groups, wind) {\n return 0;\n },\n honroutou: function (//TODO\n /**\n * tout terminale et honneur\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n chinroutou: function (\n /**\n * tout terminale\n * 13/13\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (h === undefined) {\n return 0;\n }\n if (groups.every(function (g) { return term(g); }) &&\n h.every(function (g) { return term(g); })) {\n return 13;\n }\n return 0;\n },\n tsuuiisou: function (\n /**\n * tout honneur\n * 13/13\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (h === undefined) {\n return 0;\n }\n if (groups.every(function (g) { return honn(g); }) &&\n h.every(function (g) { return honn(g); })) {\n return 13;\n }\n return 0;\n },\n kokushiMusou: function (\n /**\n * treize orphelins\n * 0/13\n */\n hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n if (yakus.honroutou(hand, groups, wind) === 0) {\n return 0;\n }\n var h = hand.getTiles();\n var count = 0;\n for (var i = 0; i < h.length - 1; i++) {\n if (h[i].isEqual(h[i + 1].getFamily(), h[i + 1].getValue())) {\n count++;\n }\n if (count > 1) {\n break;\n }\n }\n if (count === 1) {\n return 13;\n }\n return 0;\n },\n chiitoitsu: function (\n /**\n * sept paires\n * 0/2\n */\n hand, groups, wind) {\n return 0;\n if (groups.length > 0) {\n return 0;\n }\n //TODO\n },\n toitoi: function (\n /**\n * tout brelans\n * 2/2\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (groups.every(function (g) { return pon(g); }) &&\n (h === null || h === void 0 ? void 0 : h.every(function (g) { return pon(g); }))) {\n return 2;\n }\n return 0;\n },\n sanankou: function (\n /**\n * trois brelan cachés\n * 2/2\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n var count = 0;\n h === null || h === void 0 ? void 0 : h.forEach(function (g) {\n if (pon(g) && g.getTiles().length === 3) {\n count++;\n }\n });\n if (count === 3) {\n return 2;\n }\n return 0;\n },\n suuankou: function (\n /**\n * quatre brelans cachés\n * 0/13\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n var count = 0;\n h === null || h === void 0 ? void 0 : h.forEach(function (g) {\n if (pon(g) && g.getTiles().length === 3) {\n count++;\n }\n });\n if (count === 4) {\n return 13;\n }\n return 0;\n },\n sanshokuDoukou: function (//TODO\n /**\n * triple brelan\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n sankantsu: function (//TODO\n /**\n * trois carrés\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n suukantsu: function (//TODO\n /**\n * quatre carrés\n * 13/13\n */\n hand, groups, wind) {\n return 0;\n },\n honitsu: function (//TODO\n /**\n * semie pure\n * 2/3\n */\n hand, groups, wind) {\n return 0;\n },\n chinitsu: function (\n /**\n * main pure\n * 5/6\n */\n hand, groups, wind) {\n var h = hand.getTiles();\n var t0 = h[0];\n if (h.every(function (t) { return t.getFamily() === t0.getFamily(); }) &&\n groups.every(function (g) { return g.getTiles().every(function (t) { return t.getFamily() === t0.getFamily(); }); })) {\n return groups.length > 0 ? 5 : 6;\n }\n return 0;\n },\n ryuuisou: function (//TODO\n /**\n * main verte\n * 13/13\n */\n hand, groups, wind) {\n if (yakus.chinitsu(hand, groups, wind) === 0) {\n return 0;\n }\n return 0;\n },\n chuurenPoutou: function (//TODO\n /**\n * neuf portes\n * 0/13\n */\n hand, groups, wind) {\n if (groups.length > 0 || yakus.chinitsu(hand, groups, wind) === 0) {\n return 0;\n }\n return 0;\n }\n};\n\n\n//# sourceURL=webpack:///./src/yakus/yaku.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ yakus: () => (/* binding */ yakus)\n/* harmony export */ });\nfunction ord(g) {\n return g.getTiles().every(function (t) { return t.getFamily() < 4 &&\n t.getValue() > 1 &&\n t.getValue() < 9; });\n}\nfunction term(g) {\n return g.getTiles().every(function (t) {\n return t.getFamily() < 4 &&\n (t.getValue() === 0 ||\n t.getValue() === 9);\n });\n}\nfunction honn(g) {\n return g.getTiles().every(function (t) {\n return t.getFamily() >= 4;\n });\n}\nfunction chii(g) {\n var t = g.getTiles();\n return t[0].getValue() !== t[1].getValue();\n}\nfunction pon(g) {\n var t = g.getTiles();\n return t[0].getValue() === t[1].getValue();\n}\nvar yakus = {\n lipekou: function (\n /**\n * double suite pure\n * 0/1\n */\n hand, groups, wind) {\n if (groups.length > 0 && !yakus.ryanpeikou(hand, groups, wind)) { // ouvert\n return 0;\n }\n var gr = hand.toGroup();\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n for (var i = 0; i < 3; i++) {\n var g1 = gr[i].getTiles();\n var g2 = gr[i + 1].getTiles();\n if (g1[0].isEqual(g2[0].getFamily(), g2[0].getValue()) &&\n chii(gr[i]) && chii(gr[i + 1])) {\n return 1;\n }\n }\n return 0;\n },\n ryanpeikou: function (\n /**\n * deux doubles suites pures\n * 0/3\n */\n hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n var gr = hand.toGroup();\n gr.filter(function (g) { return chii(g); });\n if (gr.length < 4) { // pas assez de suite\n return 0;\n }\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n var t1 = gr[0].getTiles()[0];\n var t2 = gr[1].getTiles()[0];\n var t3 = gr[2].getTiles()[0];\n var t4 = gr[3].getTiles()[0];\n if (t1.compare(t2) === 0 &&\n t3.compare(t4) === 0) {\n return 3;\n }\n return 0;\n },\n pinfu: function (\n /**\n * tout suite\n * 0/1\n */\n hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n var h = hand.toGroup();\n if (h !== undefined &&\n h.every(function (g) {\n var tiles = g.getTiles();\n return (chii(g) || tiles.length === 2);\n })) {\n return 1;\n }\n return 0;\n },\n sanshokuDoujun: function (\n /**\n * triple suite\n * 1/2\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n var gr = [];\n if (h !== undefined) {\n gr = groups.concat(h);\n }\n else {\n gr = groups;\n }\n gr = gr.filter(function (g) { return chii(g); });\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n if (gr.length < 3) { // pas assez de chii\n return 0;\n }\n else if (gr.length === 3) {\n var t0 = gr[0].getTiles();\n var t1 = gr[1].getTiles();\n var t2 = gr[2].getTiles();\n if (t0[0].getValue() === t1[0].getValue() &&\n t0[0].getValue() === t2[0].getValue() &&\n t0[0].getFamily() !== t1[0].getFamily() &&\n t0[0].getFamily() !== t2[0].getFamily() &&\n t1[0].getFamily() !== t2[0].getFamily()) {\n return groups.length > 0 ? 1 : 2;\n }\n return 0;\n }\n else { // il y a un intrus\n for (var i = 0; i < 4; i++) {\n var index = [];\n for (var j = 0; j < 4; j++) {\n if (j !== i) {\n index.push(j);\n }\n }\n var t0 = gr[index[0]].getTiles();\n var t1 = gr[index[1]].getTiles();\n var t2 = gr[index[2]].getTiles();\n if (t0[0].getValue() === t1[0].getValue() &&\n t0[0].getValue() === t2[0].getValue() &&\n t0[0].getFamily() !== t1[0].getFamily() &&\n t0[0].getFamily() !== t2[0].getFamily() &&\n t1[0].getFamily() !== t2[0].getFamily()) {\n return groups.length > 0 ? 1 : 2;\n }\n }\n return 0;\n }\n },\n ittsuu: function (\n /**\n * grande suite pure\n * 1/2\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) { return chii(g); });\n gr.sort(function (g1, g2) { return g1.compare(g2); });\n if (gr.length < 3) { // trop peu de suite\n return 0;\n }\n else if (gr.length === 3) { // pile le bon nombre\n var g1 = gr[0].getTiles();\n var g2 = gr[1].getTiles();\n var g3 = gr[2].getTiles();\n if (g1[0].getFamily() === g2[0].getFamily() &&\n g2[0].getFamily() === g3[0].getFamily() &&\n g1[0].getValue() === 1 &&\n g2[0].getValue() === 4 &&\n g3[0].getValue() === 7) {\n return groups.length > 0 ? 1 : 2;\n }\n }\n else { // il y a un intrus\n for (var i = 0; i < 4; i++) {\n var index = [];\n for (var j = 0; j < 4; j++) {\n if (j !== i) {\n index.push(j);\n }\n }\n var t0 = gr[index[0]].getTiles();\n var t1 = gr[index[1]].getTiles();\n var t2 = gr[index[2]].getTiles();\n if (t0[0].getValue() === 1 &&\n t1[0].getValue() === 4 &&\n t2[0].getValue() === 7 &&\n t0[0].getFamily() === t1[0].getFamily() &&\n t0[0].getFamily() === t2[0].getFamily()) {\n return groups.length > 0 ? 1 : 2;\n }\n }\n return 0;\n }\n return 0;\n },\n tanyao: function (\n /**\n * tout ordinaire\n * 1/1\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (h === undefined) {\n return 0;\n }\n if (groups.every(function (g) { return ord(g); }) &&\n h.every(function (g) { return ord(g); })) {\n return 1;\n }\n return 0;\n },\n yakuhai: function (\n /**\n * brelan de valeur\n * 1/1\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) { return pon(g) && g.getTiles().length === 3; });\n var han = 0;\n gr.forEach(function (g) {\n var t = g.getTiles();\n var f = t[0].getFamily();\n var v = t[0].getValue();\n if (f === 5) { // brelan de dragon\n han++;\n }\n if (f === 4 && v === 0) { // vent d'est\n han++;\n }\n if (f === 4 && v === wind) { // vent du joueur\n han++;\n }\n });\n return han;\n },\n shousangen: function (\n /**\n * trois petits dragons\n * 2/2\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) { return pon(g); });\n var nbPon = 0;\n var nbPair = 0;\n gr.forEach(function (g) {\n var t = g.getTiles();\n if (t[0].getFamily() === 5) {\n if (t.length === 3) {\n nbPon++;\n }\n else {\n nbPair++;\n }\n }\n });\n if (nbPon == 2 && nbPair == 1) {\n return 2;\n }\n return 0;\n },\n daisangen: function (\n /**\n * trois grands dragons\n * 13/13\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) { return pon(g) &&\n g.getTiles().length === 3 &&\n g.getTiles()[0].getFamily() === 5; });\n if (gr.length === 3) {\n return 13;\n }\n return 0;\n },\n shousuushii: function (\n /**\n * quatre petits vents\n * 13/13\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) { return pon(g); });\n var nbPon = 0;\n var nbPair = 0;\n gr.forEach(function (g) {\n var t = g.getTiles();\n if (t[0].getFamily() === 4) {\n if (t.length === 3) {\n nbPon++;\n }\n else {\n nbPair++;\n }\n }\n });\n if (nbPon == 3 && nbPair == 1) {\n return 13;\n }\n return 0;\n },\n daisuushi: function (\n /**\n * quatre grands vents\n * 13/13\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) { return pon(g); });\n var nbPon = 0;\n var nbPair = 0;\n gr.forEach(function (g) {\n var t = g.getTiles();\n if (t[0].getFamily() === 4) {\n if (t.length === 3) {\n nbPon++;\n }\n else {\n nbPair++;\n }\n }\n });\n if (nbPon == 4 && nbPair == 0) {\n return 13;\n }\n return 0;\n },\n chanta: function (//TODO\n /**\n * terminales et honneurs partout\n * 1/2\n */\n hand, groups, wind) {\n return 0;\n },\n junchan: function (//TODO\n /**\n * terminales partout\n * 2/3\n */\n hand, groups, wind) {\n return 0;\n },\n honroutou: function (//TODO\n /**\n * tout terminale et honneur\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n chinroutou: function (\n /**\n * tout terminale\n * 13/13\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (h === undefined) {\n return 0;\n }\n if (groups.every(function (g) { return term(g); }) &&\n h.every(function (g) { return term(g); })) {\n return 13;\n }\n return 0;\n },\n tsuuiisou: function (\n /**\n * tout honneur\n * 13/13\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (h === undefined) {\n return 0;\n }\n if (groups.every(function (g) { return honn(g); }) &&\n h.every(function (g) { return honn(g); })) {\n return 13;\n }\n return 0;\n },\n kokushiMusou: function (\n /**\n * treize orphelins\n * 0/13\n */\n hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n if (yakus.honroutou(hand, groups, wind) === 0) {\n return 0;\n }\n var h = hand.getTiles();\n var count = 0;\n for (var i = 0; i < h.length - 1; i++) {\n if (h[i].isEqual(h[i + 1].getFamily(), h[i + 1].getValue())) {\n count++;\n }\n if (count > 1) {\n break;\n }\n }\n if (count === 1) {\n return 13;\n }\n return 0;\n },\n chiitoitsu: function (\n /**\n * sept paires\n * 0/2\n */\n hand, groups, wind) {\n return 0;\n if (groups.length > 0) {\n return 0;\n }\n //TODO\n },\n toitoi: function (\n /**\n * tout brelans\n * 2/2\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n if (groups.every(function (g) { return pon(g); }) &&\n (h === null || h === void 0 ? void 0 : h.every(function (g) { return pon(g); }))) {\n return 2;\n }\n return 0;\n },\n sanankou: function (\n /**\n * trois brelan cachés\n * 2/2\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n var count = 0;\n h === null || h === void 0 ? void 0 : h.forEach(function (g) {\n if (pon(g) && g.getTiles().length === 3) {\n count++;\n }\n });\n if (count === 3) {\n return 2;\n }\n return 0;\n },\n suuankou: function (\n /**\n * quatre brelans cachés\n * 0/13\n */\n hand, groups, wind) {\n var h = hand.toGroup();\n var count = 0;\n h === null || h === void 0 ? void 0 : h.forEach(function (g) {\n if (pon(g) && g.getTiles().length === 3) {\n count++;\n }\n });\n if (count === 4) {\n return 13;\n }\n return 0;\n },\n sanshokuDoukou: function (//TODO\n /**\n * triple brelan\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n sankantsu: function (//TODO\n /**\n * trois carrés\n * 2/2\n */\n hand, groups, wind) {\n return 0;\n },\n suukantsu: function (//TODO\n /**\n * quatre carrés\n * 13/13\n */\n hand, groups, wind) {\n return 0;\n },\n honitsu: function (//TODO\n /**\n * semie pure\n * 2/3\n */\n hand, groups, wind) {\n return 0;\n },\n chinitsu: function (\n /**\n * main pure\n * 5/6\n */\n hand, groups, wind) {\n var h = hand.getTiles();\n var t0 = h[0];\n if (h.every(function (t) { return t.getFamily() === t0.getFamily(); }) &&\n groups.every(function (g) { return g.getTiles().every(function (t) { return t.getFamily() === t0.getFamily(); }); })) {\n return groups.length > 0 ? 5 : 6;\n }\n return 0;\n },\n ryuuisou: function (//TODO\n /**\n * main verte\n * 13/13\n */\n hand, groups, wind) {\n if (yakus.chinitsu(hand, groups, wind) === 0) {\n return 0;\n }\n return 0;\n },\n chuurenPoutou: function (//TODO\n /**\n * neuf portes\n * 0/13\n */\n hand, groups, wind) {\n if (groups.length > 0 || yakus.chinitsu(hand, groups, wind) === 0) {\n return 0;\n }\n return 0;\n }\n};\n\n\n//# sourceURL=webpack:///./src/yakus/yaku.ts?"); /***/ }) diff --git a/src/tests/test_yakus.ts b/src/tests/test_yakus.ts index fd42f19..798a483 100644 --- a/src/tests/test_yakus.ts +++ b/src/tests/test_yakus.ts @@ -5,13 +5,18 @@ import { Hand } from "../hand" let count = 0; let total = 0; -let h1 = new Hand("m1m2m3 m4m5m6 m7m8m9 p1p2p3 p5p5"); +let h1 = new Hand("m1m2m3 m4m5m6 m7m8m9 m1m2m3 m5m5"); let h2 = new Hand("m1m1m1 m4m4m4 m7m7m7 p1p1p1 p5p5"); let h3 = new Hand("m1m1m1 p9p9p9 s1s1s1 w2w2w2 d1d1"); let h4 = new Hand("m2m3m4 p3p3p3 p4p5p6 s4s4 s6s7s8"); let h5 = new Hand("m1m2m3 m1m2m3 p7p8p9 p7p8p9 w3w3"); let h6 = new Hand("m1m2m3 m1m2m3 p6p7p8 p7p8p9 w3w3"); let h7 = new Hand("m1m2m3 p1p2p3 s1s2s3 m7m8m9 p9p9"); +let h8 = new Hand("m1m2m3 m1m2m3 p6p6 w0w0w0 w3w3w3"); +let h9 = new Hand("m1m2m3 m1m2m3 d1d1d1 d2d2d2 d3d3"); +let h10 = new Hand("m1m2m3 p6p6 d1d1d1 d2d2d2 d3d3d3"); +let h11 = new Hand("m1m2m3 w1w1w1 w2w2w2 w3w3w3 w4w4"); +let h12 = new Hand("m1m1 w1w1w1 w2w2w2 w3w3w3 w4w4w4"); // lipeikou count += assert(yakus.lipekou(h5, [], 0) === 1, "m123 m123 p789 p789 w33 is Lipeikou"); @@ -33,10 +38,45 @@ count += assert(yakus.sanshokuDoujun(h7, [], 0) === 2, "m123 p123 s123 m789 p99 count += assert(yakus.sanshokuDoujun(h2, [], 0) === 0, "m111 m444 m777 p111 p55 is not Shanshokou Doujun"); total += 2; -// chanta -count += assert(yakus.chanta(h3, [], 0) === 2, "m111 p999 s111 w222 d11 is Chanta"); -count += assert(yakus.chanta(h1, [], 0) === 0, "m123 m456 m789 m123 p55 is not Chanta"); +// ittsuu +count += assert(yakus.ittsuu(h1, [], 0) === 2, "m123 m456 m789 m123 m55 is Ittsuu"); +count += assert(yakus.ittsuu(h2, [], 0) === 0, "m111 m444 m777 p111 p55 is not Ittsu"); total += 2; +// tanyao +count += assert(yakus.tanyao(h4, [], 0) === 1, "m234 p333 p456 s44 s678 is Tanyao"); +count += assert(yakus.tanyao(h1, [], 0) === 0, "m123 m456 m789 m123 p55 is not Tanyao"); +total += 2; + +// yakuhai +count += assert(yakus.yakuhai(h3, [], 2) === 1, "m111 p999 s111 w222 d11 West is Yakuhai"); +count += assert(yakus.yakuhai(h8, [], 3) === 2, "m123 m123 p66 w000 w333 North is double Yakuhai"); +count += assert(yakus.yakuhai(h3, [], 0) === 0, "m111 p999 s111 w222 d11 Est is not Yakuhai"); +total += 3; + +// shousangen +count += assert(yakus.shousangen(h9, [], 0) === 2, "m123 m123 d111 d222 d33 is Shousangen"); +count += assert(yakus.shousangen(h10, [], 0) === 0, "m123 p66 d111 d222 d333 is not Shousangen"); +count += assert(yakus.shousangen(h3, [], 0) === 0, "m111 p999 s111 w222 d11 is not Shousangen"); +total += 3; + +// daisangen +count += assert(yakus.daisangen(h10, [], 0) === 13, "m123 p66 d111 d222 d333 is Daisangen"); +count += assert(yakus.daisangen(h9, [], 0) === 0, "m123 m123 d111 d222 d33 is not Daisangen"); +count += assert(yakus.daisangen(h3, [], 0) === 0, "m111 p999 s111 w222 d11 is not Daisangen"); +total += 3; + +// shousuushi +count += assert(yakus.shousuushii(h11, [], 0) === 13, "m123 w111 w222 w333 w44 is Daisangen"); +count += assert(yakus.shousuushii(h12, [], 0) === 0, "m11 w111 w222 w333 w444 is not Daisangen"); +count += assert(yakus.shousuushii(h3, [], 0) === 0, "m111 p999 s111 w222 d11 is not Daisangen"); +total += 3; + +// daisuushi +count += assert(yakus.daisuushi(h12, [], 0) === 13, "m11 w111 w222 w333 w444 is Daisangen"); +count += assert(yakus.daisuushi(h11, [], 0) === 0, "m123 w111 w222 w333 w44 is not Daisangen"); +count += assert(yakus.daisuushi(h3, [], 0) === 0, "m111 p999 s111 w222 d11 is not Daisangen"); +total += 3; + // total console.log("Succès: " + count.toString() + "/" + total.toString()); diff --git a/src/yakus/yaku.ts b/src/yakus/yaku.ts index 109ce2c..a70128a 100644 --- a/src/yakus/yaku.ts +++ b/src/yakus/yaku.ts @@ -195,8 +195,8 @@ ittsuu: function( wind: number ): number { let gr = groups.concat(hand.toGroup() as NonNullable>); + gr = gr.filter(g => chii(g)); gr.sort((g1, g2) => g1.compare(g2)); - gr.filter(g => chii(g)); if (gr.length < 3) { // trop peu de suite return 0; } else if (gr.length === 3) { // pile le bon nombre @@ -213,7 +213,27 @@ ittsuu: function( return groups.length > 0 ? 1 : 2; } } else { // il y a un intrus - return 0 //TODO + for (let i = 0; i < 4; i++) { + let index = [] + for (let j = 0; j < 4; j++) { + if (j !== i) { + index.push(j); + } + } + let t0 = gr[index[0]].getTiles(); + let t1 = gr[index[1]].getTiles(); + let t2 = gr[index[2]].getTiles(); + if ( + t0[0].getValue() === 1 && + t1[0].getValue() === 4 && + t2[0].getValue() === 7 && + t0[0].getFamily() === t1[0].getFamily() && + t0[0].getFamily() === t2[0].getFamily() + ) { + return groups.length > 0 ? 1 : 2; + } + } + return 0; } return 0; }, @@ -245,15 +265,33 @@ yakuhai: function( * brelan de valeur * 1/1 */ - // TODO multiplicité ! hand: Hand, groups: Array, wind: number ): number { - return 0; + let gr = groups.concat(hand.toGroup() as NonNullable>); + gr = gr.filter(g => pon(g) && g.getTiles().length === 3); + let han = 0; + gr.forEach( + g => { + let t = g.getTiles(); + let f = t[0].getFamily(); + let v = t[0].getValue(); + if (f === 5) { // brelan de dragon + han++; + } + if (f === 4 && v === 0) { // vent d'est + han++; + } + if (f === 4 && v === wind) { // vent du joueur + han++; + } + } + ); + return han; }, -shousangen: function( //TODO +shousangen: function( /** * trois petits dragons * 2/2 @@ -262,10 +300,29 @@ shousangen: function( //TODO groups: Array, wind: number ): number { + let gr = groups.concat(hand.toGroup() as NonNullable>); + gr = gr.filter(g => pon(g)); + let nbPon = 0; + let nbPair = 0; + gr.forEach( + g => { + let t = g.getTiles(); + if (t[0].getFamily() === 5) { + if (t.length === 3) { + nbPon++; + } else { + nbPair++; + } + } + } + ) + if (nbPon == 2 && nbPair == 1) { + return 2; + } return 0; }, -daisangen: function( //TODO +daisangen: function( /** * trois grands dragons * 13/13 @@ -274,10 +331,19 @@ daisangen: function( //TODO groups: Array, wind: number ): number { + let gr = groups.concat(hand.toGroup() as NonNullable>); + gr = gr.filter( + g => pon(g) && + g.getTiles().length === 3 && + g.getTiles()[0].getFamily() === 5 + ); + if (gr.length === 3) { + return 13; + } return 0; }, -shousuushii: function( //TODO +shousuushii: function( /** * quatre petits vents * 13/13 @@ -286,10 +352,29 @@ shousuushii: function( //TODO groups: Array, wind: number ): number { + let gr = groups.concat(hand.toGroup() as NonNullable>); + gr = gr.filter(g => pon(g)); + let nbPon = 0; + let nbPair = 0; + gr.forEach( + g => { + let t = g.getTiles(); + if (t[0].getFamily() === 4) { + if (t.length === 3) { + nbPon++; + } else { + nbPair++; + } + } + } + ) + if (nbPon == 3 && nbPair == 1) { + return 13; + } return 0; }, -daisuushi: function( //TODO +daisuushi: function( /** * quatre grands vents * 13/13 @@ -298,6 +383,25 @@ daisuushi: function( //TODO groups: Array, wind: number ): number { + let gr = groups.concat(hand.toGroup() as NonNullable>); + gr = gr.filter(g => pon(g)); + let nbPon = 0; + let nbPair = 0; + gr.forEach( + g => { + let t = g.getTiles(); + if (t[0].getFamily() === 4) { + if (t.length === 3) { + nbPon++; + } else { + nbPair++; + } + } + } + ) + if (nbPon == 4 && nbPair == 0) { + return 13; + } return 0; },