From 15a6341879b3be261c3a7cf6c55b74c3d7b411ed Mon Sep 17 00:00:00 2001 From: Didictateur Date: Fri, 11 Apr 2025 20:54:49 +0200 Subject: [PATCH] Much more yakus --- build/dp0.js | 2 +- build/test.js | 4 +- build/test_yakus.js | 4 +- src/display/dp0.ts | 1 - src/tests/test_yakus.ts | 52 +++++++++ src/yakus/yaku.ts | 241 ++++++++++++++++++++++------------------ 6 files changed, 192 insertions(+), 112 deletions(-) diff --git a/build/dp0.js b/build/dp0.js index a03d6a3..c45e1e0 100644 --- a/build/dp0.js +++ b/build/dp0.js @@ -26,7 +26,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 */ cleanup: () => (/* binding */ cleanup),\n/* harmony export */ initDisplay: () => (/* binding */ initDisplay)\n/* harmony export */ });\n/* harmony import */ var _rain__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../rain */ \"./src/rain.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (undefined && undefined.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\n\n// Configuration globale\nvar CANVAS_ID = \"myCanvas\";\nvar BG_RECT = { x: 0, y: 0, w: 1050, h: 1050 };\nvar MOUSE = { x: 0, y: 0 };\nvar FPS = 60; // Réduit de 90 à 60 pour de meilleures performances\nvar FRAME_INTERVAL = 1000 / FPS;\nvar RAIN = new _rain__WEBPACK_IMPORTED_MODULE_0__.Rain();\n// Optimisation des références\nvar animationFrameId;\nvar lastFrameTime = 0;\nvar accumulatedTime = 0;\nvar callbacks = [];\nvar timeStep = 1 / FPS;\n// Pré-calcul des dimensions\nvar canvas = document.getElementById(CANVAS_ID);\nvar ctx = canvas.getContext(\"2d\", { alpha: false });\ncanvas.width = BG_RECT.w;\ncanvas.height = BG_RECT.h;\n// Cache statique\nvar staticCanvas = document.createElement('canvas');\nvar staticCtx = staticCanvas.getContext(\"2d\", { alpha: false });\nstaticCanvas.width = canvas.width;\nstaticCanvas.height = canvas.height;\n// Optimisation du rendu avec requestAnimationFrame\nfunction drawFrame(deltaTime) {\n if (!ctx)\n return;\n // Mise à jour avec pas de temps fixe pour stabilité physique\n accumulatedTime += deltaTime / 1000; // Convertir en secondes\n // Mettre à jour la simulation avec un pas de temps fixe\n while (accumulatedTime >= timeStep) {\n RAIN.update(timeStep);\n accumulatedTime -= timeStep;\n }\n // Optimisation du rendu\n staticCtx.fillStyle = \"#007730\"; // Couleur de fond\n staticCtx.fillRect(BG_RECT.x, BG_RECT.y, BG_RECT.w, BG_RECT.h);\n // Dessin de la pluie\n console.log(\"draw\");\n RAIN.drawRain(staticCtx);\n // Copier le buffer au canvas principal\n ctx.drawImage(staticCanvas, 0, 0);\n}\nfunction animationLoop(currentTime) {\n if (!lastFrameTime) {\n lastFrameTime = currentTime;\n animationFrameId = requestAnimationFrame(animationLoop);\n return;\n }\n var deltaTime = currentTime - lastFrameTime;\n lastFrameTime = currentTime;\n // Limiter la fréquence des mises à jour si le navigateur est trop lent\n if (deltaTime < 100) { // Ignorer les deltas trop grands (changement d'onglet, etc.)\n drawFrame(deltaTime);\n }\n animationFrameId = requestAnimationFrame(animationLoop);\n}\nfunction initEventListeners() {\n // Gestion des événements de redimensionnement et de pause\n var handleVisibilityChange = function () {\n if (document.hidden) {\n cancelAnimationFrame(animationFrameId);\n lastFrameTime = 0;\n }\n else {\n lastFrameTime = performance.now();\n animationFrameId = requestAnimationFrame(animationLoop);\n }\n };\n document.addEventListener('visibilitychange', handleVisibilityChange);\n // Ajouter le nettoyage de l'event listener\n callbacks.push(function () {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n });\n}\nfunction cleanup() {\n cancelAnimationFrame(animationFrameId);\n callbacks.forEach(function (fn) { return fn(); });\n}\nfunction initDisplay() {\n return __awaiter(this, void 0, void 0, function () {\n var error_1;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (!ctx) {\n console.error(\"Context canvas indisponible\");\n return [2 /*return*/];\n }\n console.log(\"Load beginning\");\n _a.label = 1;\n case 1:\n _a.trys.push([1, 3, , 4]);\n // Préchargement des ressources\n return [4 /*yield*/, RAIN.preloadRain()];\n case 2:\n // Préchargement des ressources\n _a.sent();\n console.log(\"Loading completed\");\n // Initialiser les écouteurs d'événements\n initEventListeners();\n // Démarrer la boucle d'animation avec le temps actuel\n lastFrameTime = performance.now();\n animationFrameId = requestAnimationFrame(animationLoop);\n window.cleanup = cleanup;\n return [3 /*break*/, 4];\n case 3:\n error_1 = _a.sent();\n console.error(\"Erreur lors de l'initialisation:\", error_1);\n return [3 /*break*/, 4];\n case 4: return [2 /*return*/];\n }\n });\n });\n}\n// Initialisation automatique si le script est chargé directement\nif (typeof window !== 'undefined') {\n initDisplay().catch(console.error);\n}\n\n\n//# sourceURL=webpack:///./src/display/dp0.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ cleanup: () => (/* binding */ cleanup),\n/* harmony export */ initDisplay: () => (/* binding */ initDisplay)\n/* harmony export */ });\n/* harmony import */ var _rain__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../rain */ \"./src/rain.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (undefined && undefined.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\n\n// Configuration globale\nvar CANVAS_ID = \"myCanvas\";\nvar BG_RECT = { x: 0, y: 0, w: 1050, h: 1050 };\nvar MOUSE = { x: 0, y: 0 };\nvar FPS = 60; // Réduit de 90 à 60 pour de meilleures performances\nvar FRAME_INTERVAL = 1000 / FPS;\nvar RAIN = new _rain__WEBPACK_IMPORTED_MODULE_0__.Rain();\n// Optimisation des références\nvar animationFrameId;\nvar lastFrameTime = 0;\nvar accumulatedTime = 0;\nvar callbacks = [];\nvar timeStep = 1 / FPS;\n// Pré-calcul des dimensions\nvar canvas = document.getElementById(CANVAS_ID);\nvar ctx = canvas.getContext(\"2d\", { alpha: false });\ncanvas.width = BG_RECT.w;\ncanvas.height = BG_RECT.h;\n// Cache statique\nvar staticCanvas = document.createElement('canvas');\nvar staticCtx = staticCanvas.getContext(\"2d\", { alpha: false });\nstaticCanvas.width = canvas.width;\nstaticCanvas.height = canvas.height;\n// Optimisation du rendu avec requestAnimationFrame\nfunction drawFrame(deltaTime) {\n if (!ctx)\n return;\n // Mise à jour avec pas de temps fixe pour stabilité physique\n accumulatedTime += deltaTime / 1000; // Convertir en secondes\n // Mettre à jour la simulation avec un pas de temps fixe\n while (accumulatedTime >= timeStep) {\n RAIN.update(timeStep);\n accumulatedTime -= timeStep;\n }\n // Optimisation du rendu\n staticCtx.fillStyle = \"#007730\"; // Couleur de fond\n staticCtx.fillRect(BG_RECT.x, BG_RECT.y, BG_RECT.w, BG_RECT.h);\n // Dessin de la pluie\n RAIN.drawRain(staticCtx);\n // Copier le buffer au canvas principal\n ctx.drawImage(staticCanvas, 0, 0);\n}\nfunction animationLoop(currentTime) {\n if (!lastFrameTime) {\n lastFrameTime = currentTime;\n animationFrameId = requestAnimationFrame(animationLoop);\n return;\n }\n var deltaTime = currentTime - lastFrameTime;\n lastFrameTime = currentTime;\n // Limiter la fréquence des mises à jour si le navigateur est trop lent\n if (deltaTime < 100) { // Ignorer les deltas trop grands (changement d'onglet, etc.)\n drawFrame(deltaTime);\n }\n animationFrameId = requestAnimationFrame(animationLoop);\n}\nfunction initEventListeners() {\n // Gestion des événements de redimensionnement et de pause\n var handleVisibilityChange = function () {\n if (document.hidden) {\n cancelAnimationFrame(animationFrameId);\n lastFrameTime = 0;\n }\n else {\n lastFrameTime = performance.now();\n animationFrameId = requestAnimationFrame(animationLoop);\n }\n };\n document.addEventListener('visibilitychange', handleVisibilityChange);\n // Ajouter le nettoyage de l'event listener\n callbacks.push(function () {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n });\n}\nfunction cleanup() {\n cancelAnimationFrame(animationFrameId);\n callbacks.forEach(function (fn) { return fn(); });\n}\nfunction initDisplay() {\n return __awaiter(this, void 0, void 0, function () {\n var error_1;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (!ctx) {\n console.error(\"Context canvas indisponible\");\n return [2 /*return*/];\n }\n console.log(\"Load beginning\");\n _a.label = 1;\n case 1:\n _a.trys.push([1, 3, , 4]);\n // Préchargement des ressources\n return [4 /*yield*/, RAIN.preloadRain()];\n case 2:\n // Préchargement des ressources\n _a.sent();\n console.log(\"Loading completed\");\n // Initialiser les écouteurs d'événements\n initEventListeners();\n // Démarrer la boucle d'animation avec le temps actuel\n lastFrameTime = performance.now();\n animationFrameId = requestAnimationFrame(animationLoop);\n window.cleanup = cleanup;\n return [3 /*break*/, 4];\n case 3:\n error_1 = _a.sent();\n console.error(\"Erreur lors de l'initialisation:\", error_1);\n return [3 /*break*/, 4];\n case 4: return [2 /*return*/];\n }\n });\n });\n}\n// Initialisation automatique si le script est chargé directement\nif (typeof window !== 'undefined') {\n initDisplay().catch(console.error);\n}\n\n\n//# sourceURL=webpack:///./src/display/dp0.ts?"); /***/ }), diff --git a/build/test.js b/build/test.js index ba9a831..80e187b 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 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\");\nvar h13 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"d1d1 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 Shousuushi\");\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 Shousuushi\");\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 Shousuushi\");\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 Daisuushi\");\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 Daisuushi\");\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 Daisuushi\");\ntotal += 3;\n// chanta\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h13, [], 0) === 2, \"d11 w111 w222 w333 w444 is Chanta\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h12, [], 0) === 2, \"m11 w111 w222 w333 w444 is Chanta\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Chanta\");\ntotal += 3;\n// junchan\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.junchan(h7, [], 0) === 3, \"m123 p123 s123 m789 p99 is Junchan\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.junchan(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Junchan\");\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\");\nvar h13 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"d1d1 w1w1w1 w2w2w2 w3w3w3 w4w4w4\");\nvar h14 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1 m9m9m9 p1p1p1 p9p9p9 s1s1s1\");\nvar h15 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m9m9 p1p9 s1s9 w1w2w3w4 d1d2d3\");\nvar h16 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1 m2m2 m3m3 m4m4 m5m5 m6m6 m7m7\");\nvar h17 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1 m2m2 m3m3 m4m4 m5m5 m6m6 m6m6\");\nvar h18 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m4m4m4 m7m7m7 p1p1p1 p5p5\");\nvar h19 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m7m7m7 p1p1p1 p5p5\");\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 Shousuushi\");\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 Shousuushi\");\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 Shousuushi\");\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 Daisuushi\");\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 Daisuushi\");\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 Daisuushi\");\ntotal += 3;\n// chanta\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h13, [], 0) === 2, \"d11 w111 w222 w333 w444 is Chanta\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h12, [], 0) === 2, \"m11 w111 w222 w333 w444 is Chanta\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Chanta\");\ntotal += 3;\n// junchan\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.junchan(h7, [], 0) === 3, \"m123 p123 s123 m789 p99 is Junchan\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.junchan(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Junchan\");\ntotal += 2;\n// honroutou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.honroutou(h14, [], 0) === 2, \"m11 m999 p111 p999 s111 is Honroutou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.honroutou(h3, [], 0) === 2, \"m111 p999 s111 w222 d11 is Honroutou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.honroutou(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Honroutou\");\ntotal += 3;\n// chinroutou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chinroutou(h14, [], 0) === 13, \"m11 m999 p111 p999 s111 is Chinroutou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chinroutou(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Chinroutou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chinroutou(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Chinroutou\");\ntotal += 3;\n// tsuuisou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.tsuuiisou(h13, [], 0) === 13, \"d11 w111 w222 w333 w444 is Tsuuisou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.tsuuiisou(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Tsuuisou\");\ntotal += 2;\n// kokushiMusou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.kokushiMusou(h15, [], 0) === 13, \"m1m9m9 p1p9 s1s9 w1w2w3w4 d1d2d3 is Kokushi Musou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.kokushiMusou(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Kokushi Musou\");\ntotal += 2;\n// chiitoitsu\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chiitoitsu(h16, [], 0) === 2, \"m11 m22 m33 m44 m55 m66 m77 is Chiitoitsu\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chiitoitsu(h17, [], 0) === 0, \"m11 m22 m33 m44 m55 m66 m66 is not Chiitoitsu\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chiitoitsu(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Chiitoitsu\");\ntotal += 3;\n// toitoi\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.toitoi(h2, [], 0) === 2, \"m111 m444 m777 p111 p55 is Toitoi\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.toitoi(h7, [], 0) === 0, \"m123 p123 s123 m789 p99 is not Toitoi\");\ntotal += 2;\n// sanankou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanankou(h18, [], 0) === 2, \"m123 m444 m777 p111 p55 is Sanankou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanankou(h2, [], 0) === 0, \"m111 m444 m777 p111 p55 is not Sanankou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanankou(h7, [], 0) === 0, \"m123 p123 s123 m789 p99 is not Sanankou\");\ntotal += 3;\n// sanankou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.suuankou(h2, [], 0) === 13, \"m111 m444 m777 p111 p55 is Sanankou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.suuankou(h18, [], 0) === 0, \"m123 m444 m777 p111 p55 is not Sanankou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.suuankou(h7, [], 0) === 0, \"m123 p123 s123 m789 p99 is not Sanankou\");\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 = 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 (\n /**\n * terminales et honneurs partout\n * 1/2\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) {\n var tiles = g.getTiles();\n var f = tiles[0].getFamily();\n var v = tiles[0].getValue();\n var vd = tiles[tiles.length - 1].getValue();\n return f < 4 && v !== 1 && vd !== 9;\n });\n if (gr.length > 0) {\n return 0;\n }\n return groups.length > 0 ? 1 : 2;\n },\n junchan: function (\n /**\n * terminales partout\n * 2/3\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) {\n var tiles = g.getTiles();\n var f = tiles[0].getFamily();\n var v = tiles[0].getValue();\n var vd = tiles[tiles.length - 1].getValue();\n return f > 3 || (v !== 1 && vd !== 9);\n });\n if (gr.length > 0) {\n return 0;\n }\n return groups.length > 0 ? 2 : 3;\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 t.getFamily() < 4 &&\n (t.getValue() === 1 ||\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 /**\n * double suite pure\n * 0/1\n */\n lipekou: function (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 /**\n * deux doubles suites pures\n * 0/3\n */\n ryanpeikou: function (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 /**\n * tout suite\n * 0/1\n */\n pinfu: function (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 /**\n * triple suite\n * 1/2\n */\n sanshokuDoujun: function (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 /**\n * grande suite pure\n * 1/2\n */\n ittsuu: function (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 /**\n * tout ordinaire\n * 1/1\n */\n tanyao: function (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 /**\n * brelan de valeur\n * 1/1\n */\n yakuhai: function (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 /**\n * trois petits dragons\n * 2/2\n */\n shousangen: function (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 /**\n * trois grands dragons\n * 13/13\n */\n daisangen: function (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 /**\n * quatre petits vents\n * 13/13\n */\n shousuushii: function (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 /**\n * quatre grands vents\n * 13/13\n */\n daisuushi: function (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 /**\n * terminales et honneurs partout\n * 1/2\n */\n chanta: function (hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) {\n var tiles = g.getTiles();\n var f = tiles[0].getFamily();\n var v = tiles[0].getValue();\n var vd = tiles[tiles.length - 1].getValue();\n return f < 4 && v !== 1 && vd !== 9;\n });\n if (gr.length > 0) {\n return 0;\n }\n return groups.length > 0 ? 1 : 2;\n },\n /**\n * terminales partout\n * 2/3\n */\n junchan: function (hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) {\n var tiles = g.getTiles();\n var f = tiles[0].getFamily();\n var v = tiles[0].getValue();\n var vd = tiles[tiles.length - 1].getValue();\n return f > 3 || (v !== 1 && vd !== 9);\n });\n if (gr.length > 0) {\n return 0;\n }\n return groups.length > 0 ? 2 : 3;\n },\n /**\n * tout terminale et honneur\n * 2/2\n */\n honroutou: function (hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) {\n var tiles = g.getTiles();\n var f = tiles[0].getFamily();\n var v = tiles[1].getValue();\n return f < 4 && v !== 1 && v !== 9;\n });\n if (gr.length > 0) {\n return 0;\n }\n return 2;\n },\n /**\n * tout terminale\n * 13/13\n */\n chinroutou: function (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 /**\n * tout honneur\n * 13/13\n */\n tsuuiisou: function (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 /**\n * treize orphelins\n * 0/13\n */\n kokushiMusou: function (hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n var h = hand.getTiles();\n if (h.some(function (t) {\n return t.getFamily() < 4 &&\n t.getValue() > 1 &&\n t.getValue() < 9;\n })) {\n return 0;\n }\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 /**\n * sept paires\n * 0/2\n */\n chiitoitsu: function (hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n var h = hand.getTiles();\n if (h.length !== 14) {\n return 0;\n }\n for (var i = 0; i < 14; i += 2) {\n if (h[i].compare(h[i + 1]) !== 0 ||\n (i > 0 && h[i].compare(h[i - 1]) === 0)) {\n return 0;\n }\n }\n return 2;\n },\n /**\n * tout brelans\n * 2/2\n */\n toitoi: function (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 /**\n * trois brelan cachés\n * 2/2\n */\n sanankou: function (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 /**\n * quatre brelans cachés\n * 0/13\n */\n suuankou: function (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 1b1bf1f..dae4d9c 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 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\");\nvar h13 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"d1d1 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 Shousuushi\");\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 Shousuushi\");\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 Shousuushi\");\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 Daisuushi\");\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 Daisuushi\");\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 Daisuushi\");\ntotal += 3;\n// chanta\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h13, [], 0) === 2, \"d11 w111 w222 w333 w444 is Chanta\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h12, [], 0) === 2, \"m11 w111 w222 w333 w444 is Chanta\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Chanta\");\ntotal += 3;\n// junchan\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.junchan(h7, [], 0) === 3, \"m123 p123 s123 m789 p99 is Junchan\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.junchan(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Junchan\");\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\");\nvar h13 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"d1d1 w1w1w1 w2w2w2 w3w3w3 w4w4w4\");\nvar h14 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1 m9m9m9 p1p1p1 p9p9p9 s1s1s1\");\nvar h15 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m9m9 p1p9 s1s9 w1w2w3w4 d1d2d3\");\nvar h16 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1 m2m2 m3m3 m4m4 m5m5 m6m6 m7m7\");\nvar h17 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m1 m2m2 m3m3 m4m4 m5m5 m6m6 m6m6\");\nvar h18 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m4m4m4 m7m7m7 p1p1p1 p5p5\");\nvar h19 = new _hand__WEBPACK_IMPORTED_MODULE_2__.Hand(\"m1m2m3 m7m7m7 p1p1p1 p5p5\");\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 Shousuushi\");\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 Shousuushi\");\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 Shousuushi\");\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 Daisuushi\");\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 Daisuushi\");\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 Daisuushi\");\ntotal += 3;\n// chanta\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h13, [], 0) === 2, \"d11 w111 w222 w333 w444 is Chanta\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h12, [], 0) === 2, \"m11 w111 w222 w333 w444 is Chanta\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chanta(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Chanta\");\ntotal += 3;\n// junchan\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.junchan(h7, [], 0) === 3, \"m123 p123 s123 m789 p99 is Junchan\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.junchan(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Junchan\");\ntotal += 2;\n// honroutou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.honroutou(h14, [], 0) === 2, \"m11 m999 p111 p999 s111 is Honroutou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.honroutou(h3, [], 0) === 2, \"m111 p999 s111 w222 d11 is Honroutou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.honroutou(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Honroutou\");\ntotal += 3;\n// chinroutou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chinroutou(h14, [], 0) === 13, \"m11 m999 p111 p999 s111 is Chinroutou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chinroutou(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Chinroutou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chinroutou(h10, [], 0) === 0, \"m123 p66 d111 d222 d333 is not Chinroutou\");\ntotal += 3;\n// tsuuisou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.tsuuiisou(h13, [], 0) === 13, \"d11 w111 w222 w333 w444 is Tsuuisou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.tsuuiisou(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Tsuuisou\");\ntotal += 2;\n// kokushiMusou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.kokushiMusou(h15, [], 0) === 13, \"m1m9m9 p1p9 s1s9 w1w2w3w4 d1d2d3 is Kokushi Musou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.kokushiMusou(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Kokushi Musou\");\ntotal += 2;\n// chiitoitsu\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chiitoitsu(h16, [], 0) === 2, \"m11 m22 m33 m44 m55 m66 m77 is Chiitoitsu\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chiitoitsu(h17, [], 0) === 0, \"m11 m22 m33 m44 m55 m66 m66 is not Chiitoitsu\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.chiitoitsu(h3, [], 0) === 0, \"m111 p999 s111 w222 d11 is not Chiitoitsu\");\ntotal += 3;\n// toitoi\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.toitoi(h2, [], 0) === 2, \"m111 m444 m777 p111 p55 is Toitoi\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.toitoi(h7, [], 0) === 0, \"m123 p123 s123 m789 p99 is not Toitoi\");\ntotal += 2;\n// sanankou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanankou(h18, [], 0) === 2, \"m123 m444 m777 p111 p55 is Sanankou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanankou(h2, [], 0) === 0, \"m111 m444 m777 p111 p55 is not Sanankou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.sanankou(h7, [], 0) === 0, \"m123 p123 s123 m789 p99 is not Sanankou\");\ntotal += 3;\n// sanankou\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.suuankou(h2, [], 0) === 13, \"m111 m444 m777 p111 p55 is Sanankou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.suuankou(h18, [], 0) === 0, \"m123 m444 m777 p111 p55 is not Sanankou\");\ncount += (0,_assert__WEBPACK_IMPORTED_MODULE_0__.assert)(_yakus_yaku__WEBPACK_IMPORTED_MODULE_1__.yakus.suuankou(h7, [], 0) === 0, \"m123 p123 s123 m789 p99 is not Sanankou\");\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 = 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 (\n /**\n * terminales et honneurs partout\n * 1/2\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) {\n var tiles = g.getTiles();\n var f = tiles[0].getFamily();\n var v = tiles[0].getValue();\n var vd = tiles[tiles.length - 1].getValue();\n return f < 4 && v !== 1 && vd !== 9;\n });\n if (gr.length > 0) {\n return 0;\n }\n return groups.length > 0 ? 1 : 2;\n },\n junchan: function (\n /**\n * terminales partout\n * 2/3\n */\n hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) {\n var tiles = g.getTiles();\n var f = tiles[0].getFamily();\n var v = tiles[0].getValue();\n var vd = tiles[tiles.length - 1].getValue();\n return f > 3 || (v !== 1 && vd !== 9);\n });\n if (gr.length > 0) {\n return 0;\n }\n return groups.length > 0 ? 2 : 3;\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 t.getFamily() < 4 &&\n (t.getValue() === 1 ||\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 /**\n * double suite pure\n * 0/1\n */\n lipekou: function (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 /**\n * deux doubles suites pures\n * 0/3\n */\n ryanpeikou: function (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 /**\n * tout suite\n * 0/1\n */\n pinfu: function (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 /**\n * triple suite\n * 1/2\n */\n sanshokuDoujun: function (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 /**\n * grande suite pure\n * 1/2\n */\n ittsuu: function (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 /**\n * tout ordinaire\n * 1/1\n */\n tanyao: function (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 /**\n * brelan de valeur\n * 1/1\n */\n yakuhai: function (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 /**\n * trois petits dragons\n * 2/2\n */\n shousangen: function (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 /**\n * trois grands dragons\n * 13/13\n */\n daisangen: function (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 /**\n * quatre petits vents\n * 13/13\n */\n shousuushii: function (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 /**\n * quatre grands vents\n * 13/13\n */\n daisuushi: function (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 /**\n * terminales et honneurs partout\n * 1/2\n */\n chanta: function (hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) {\n var tiles = g.getTiles();\n var f = tiles[0].getFamily();\n var v = tiles[0].getValue();\n var vd = tiles[tiles.length - 1].getValue();\n return f < 4 && v !== 1 && vd !== 9;\n });\n if (gr.length > 0) {\n return 0;\n }\n return groups.length > 0 ? 1 : 2;\n },\n /**\n * terminales partout\n * 2/3\n */\n junchan: function (hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) {\n var tiles = g.getTiles();\n var f = tiles[0].getFamily();\n var v = tiles[0].getValue();\n var vd = tiles[tiles.length - 1].getValue();\n return f > 3 || (v !== 1 && vd !== 9);\n });\n if (gr.length > 0) {\n return 0;\n }\n return groups.length > 0 ? 2 : 3;\n },\n /**\n * tout terminale et honneur\n * 2/2\n */\n honroutou: function (hand, groups, wind) {\n var gr = groups.concat(hand.toGroup());\n gr = gr.filter(function (g) {\n var tiles = g.getTiles();\n var f = tiles[0].getFamily();\n var v = tiles[1].getValue();\n return f < 4 && v !== 1 && v !== 9;\n });\n if (gr.length > 0) {\n return 0;\n }\n return 2;\n },\n /**\n * tout terminale\n * 13/13\n */\n chinroutou: function (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 /**\n * tout honneur\n * 13/13\n */\n tsuuiisou: function (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 /**\n * treize orphelins\n * 0/13\n */\n kokushiMusou: function (hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n var h = hand.getTiles();\n if (h.some(function (t) {\n return t.getFamily() < 4 &&\n t.getValue() > 1 &&\n t.getValue() < 9;\n })) {\n return 0;\n }\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 /**\n * sept paires\n * 0/2\n */\n chiitoitsu: function (hand, groups, wind) {\n if (groups.length > 0) {\n return 0;\n }\n var h = hand.getTiles();\n if (h.length !== 14) {\n return 0;\n }\n for (var i = 0; i < 14; i += 2) {\n if (h[i].compare(h[i + 1]) !== 0 ||\n (i > 0 && h[i].compare(h[i - 1]) === 0)) {\n return 0;\n }\n }\n return 2;\n },\n /**\n * tout brelans\n * 2/2\n */\n toitoi: function (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 /**\n * trois brelan cachés\n * 2/2\n */\n sanankou: function (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 /**\n * quatre brelans cachés\n * 0/13\n */\n suuankou: function (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/display/dp0.ts b/src/display/dp0.ts index cc92247..869d7a0 100644 --- a/src/display/dp0.ts +++ b/src/display/dp0.ts @@ -45,7 +45,6 @@ function drawFrame(deltaTime: number) { staticCtx.fillRect(BG_RECT.x, BG_RECT.y, BG_RECT.w, BG_RECT.h); // Dessin de la pluie - console.log("draw") RAIN.drawRain(staticCtx); // Copier le buffer au canvas principal diff --git a/src/tests/test_yakus.ts b/src/tests/test_yakus.ts index 841896c..932e472 100644 --- a/src/tests/test_yakus.ts +++ b/src/tests/test_yakus.ts @@ -1,6 +1,7 @@ import { assert } from "./assert" import { yakus } from "../yakus/yaku" import { Hand } from "../hand" +import { Group } from "../group"; let count = 0; let total = 0; @@ -18,6 +19,12 @@ 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"); let h13 = new Hand("d1d1 w1w1w1 w2w2w2 w3w3w3 w4w4w4"); +let h14 = new Hand("m1m1 m9m9m9 p1p1p1 p9p9p9 s1s1s1"); +let h15 = new Hand("m1m9m9 p1p9 s1s9 w1w2w3w4 d1d2d3"); +let h16 = new Hand("m1m1 m2m2 m3m3 m4m4 m5m5 m6m6 m7m7"); +let h17 = new Hand("m1m1 m2m2 m3m3 m4m4 m5m5 m6m6 m6m6"); +let h18 = new Hand("m1m2m3 m4m4m4 m7m7m7 p1p1p1 p5p5"); +let h19 = new Hand("m1m2m3 m7m7m7 p1p1p1 p5p5"); // lipeikou count += assert(yakus.lipekou(h5, [], 0) === 1, "m123 m123 p789 p789 w33 is Lipeikou"); @@ -90,5 +97,50 @@ count += assert(yakus.junchan(h7, [], 0) === 3, "m123 p123 s123 m789 p99 is Junc count += assert(yakus.junchan(h10, [], 0) === 0, "m123 p66 d111 d222 d333 is not Junchan"); total += 2; +// honroutou +count += assert(yakus.honroutou(h14, [], 0) === 2, "m11 m999 p111 p999 s111 is Honroutou"); +count += assert(yakus.honroutou(h3, [], 0) === 2, "m111 p999 s111 w222 d11 is Honroutou"); +count += assert(yakus.honroutou(h10, [], 0) === 0, "m123 p66 d111 d222 d333 is not Honroutou"); +total += 3; + +// chinroutou +count += assert(yakus.chinroutou(h14, [], 0) === 13, "m11 m999 p111 p999 s111 is Chinroutou"); +count += assert(yakus.chinroutou(h3, [], 0) === 0, "m111 p999 s111 w222 d11 is not Chinroutou"); +count += assert(yakus.chinroutou(h10, [], 0) === 0, "m123 p66 d111 d222 d333 is not Chinroutou"); +total += 3; + +// tsuuisou +count += assert(yakus.tsuuiisou(h13, [], 0) === 13, "d11 w111 w222 w333 w444 is Tsuuisou"); +count += assert(yakus.tsuuiisou(h3, [], 0) === 0, "m111 p999 s111 w222 d11 is not Tsuuisou"); +total += 2; + +// kokushiMusou +count += assert(yakus.kokushiMusou(h15, [], 0) === 13, "m1m9m9 p1p9 s1s9 w1w2w3w4 d1d2d3 is Kokushi Musou"); +count += assert(yakus.kokushiMusou(h3, [], 0) === 0, "m111 p999 s111 w222 d11 is not Kokushi Musou"); +total += 2; + +// chiitoitsu +count += assert(yakus.chiitoitsu(h16, [], 0) === 2, "m11 m22 m33 m44 m55 m66 m77 is Chiitoitsu"); +count += assert(yakus.chiitoitsu(h17, [], 0) === 0, "m11 m22 m33 m44 m55 m66 m66 is not Chiitoitsu"); +count += assert(yakus.chiitoitsu(h3, [], 0) === 0, "m111 p999 s111 w222 d11 is not Chiitoitsu"); +total += 3; + +// toitoi +count += assert(yakus.toitoi(h2, [], 0) === 2, "m111 m444 m777 p111 p55 is Toitoi"); +count += assert(yakus.toitoi(h7, [], 0) === 0, "m123 p123 s123 m789 p99 is not Toitoi"); +total += 2; + +// sanankou +count += assert(yakus.sanankou(h18, [], 0) === 2, "m123 m444 m777 p111 p55 is Sanankou"); +count += assert(yakus.sanankou(h2, [], 0) === 0, "m111 m444 m777 p111 p55 is not Sanankou"); +count += assert(yakus.sanankou(h7, [], 0) === 0, "m123 p123 s123 m789 p99 is not Sanankou"); +total += 3; + +// sanankou +count += assert(yakus.suuankou(h2, [], 0) === 13, "m111 m444 m777 p111 p55 is Sanankou"); +count += assert(yakus.suuankou(h18, [], 0) === 0, "m123 m444 m777 p111 p55 is not Sanankou"); +count += assert(yakus.suuankou(h7, [], 0) === 0, "m123 p123 s123 m789 p99 is not Sanankou"); +total += 3; + // total console.log("Succès: " + count.toString() + "/" + total.toString()); diff --git a/src/yakus/yaku.ts b/src/yakus/yaku.ts index af53732..6e0a028 100644 --- a/src/yakus/yaku.ts +++ b/src/yakus/yaku.ts @@ -11,10 +11,10 @@ function ord(g: Group): boolean { function term(g: Group): boolean { return g.getTiles().every( - t => + t => { t.getFamily() < 4 && - (t.getValue() === 0 || - t.getValue() === 9) + (t.getValue() === 1 || + t.getValue() === 9)} ); } @@ -41,15 +41,15 @@ function pon(g: Group): boolean { export const yakus = { +/** + * double suite pure + * 0/1 + */ lipekou: function ( - /** - * double suite pure - * 0/1 - */ hand: Hand, groups: Array, wind: number -): number { +): number { if (groups.length > 0 && !yakus.ryanpeikou(hand, groups, wind)) { // ouvert return 0; } @@ -68,11 +68,11 @@ lipekou: function ( return 0; }, +/** + * deux doubles suites pures + * 0/3 + */ ryanpeikou: function ( - /** - * deux doubles suites pures - * 0/3 - */ hand: Hand, groups: Array, wind: number @@ -99,11 +99,11 @@ ryanpeikou: function ( return 0; }, -pinfu: function( - /** - * tout suite - * 0/1 - */ +/** + * tout suite + * 0/1 + */ +pinfu: function( hand: Hand, groups: Array, wind: number @@ -126,11 +126,11 @@ pinfu: function( return 0; }, +/** + * triple suite + * 1/2 + */ sanshokuDoujun: function( - /** - * triple suite - * 1/2 - */ hand: Hand, groups: Array, wind: number @@ -185,11 +185,11 @@ sanshokuDoujun: function( } }, -ittsuu: function( - /** - * grande suite pure - * 1/2 - */ +/** + * grande suite pure + * 1/2 + */ +ittsuu: function( hand: Hand, groups: Array, wind: number @@ -238,11 +238,11 @@ ittsuu: function( return 0; }, -tanyao: function( - /** - * tout ordinaire - * 1/1 - */ +/** + * tout ordinaire + * 1/1 + */ +tanyao: function( hand: Hand, groups: Array, wind: number @@ -260,11 +260,11 @@ tanyao: function( return 0; }, -yakuhai: function( - /** - * brelan de valeur - * 1/1 - */ +/** + * brelan de valeur + * 1/1 + */ +yakuhai: function( hand: Hand, groups: Array, wind: number @@ -291,11 +291,11 @@ yakuhai: function( return han; }, -shousangen: function( - /** - * trois petits dragons - * 2/2 - */ +/** + * trois petits dragons + * 2/2 + */ +shousangen: function( hand: Hand, groups: Array, wind: number @@ -322,11 +322,11 @@ shousangen: function( return 0; }, -daisangen: function( - /** - * trois grands dragons - * 13/13 - */ +/** + * trois grands dragons + * 13/13 + */ +daisangen: function( hand: Hand, groups: Array, wind: number @@ -343,11 +343,11 @@ daisangen: function( return 0; }, -shousuushii: function( - /** - * quatre petits vents - * 13/13 - */ +/** + * quatre petits vents + * 13/13 + */ +shousuushii: function( hand: Hand, groups: Array, wind: number @@ -374,11 +374,11 @@ shousuushii: function( return 0; }, -daisuushi: function( - /** - * quatre grands vents - * 13/13 - */ +/** + * quatre grands vents + * 13/13 + */ +daisuushi: function( hand: Hand, groups: Array, wind: number @@ -405,11 +405,11 @@ daisuushi: function( return 0; }, -chanta: function( - /** - * terminales et honneurs partout - * 1/2 - */ +/** + * terminales et honneurs partout + * 1/2 + */ +chanta: function( hand: Hand, groups: Array, wind: number @@ -430,11 +430,11 @@ chanta: function( return groups.length > 0 ? 1 : 2; }, +/** + * terminales partout + * 2/3 + */ junchan: function( - /** - * terminales partout - * 2/3 - */ hand: Hand, groups: Array, wind: number @@ -455,23 +455,35 @@ junchan: function( return groups.length > 0 ? 2 : 3; }, -honroutou: function( //TODO - /** - * tout terminale et honneur - * 2/2 - */ +/** + * tout terminale et honneur + * 2/2 + */ +honroutou: function( hand: Hand, groups: Array, wind: number ): number { - return 0; + let gr = groups.concat(hand.toGroup() as NonNullable>); + gr = gr.filter( + g => { + let tiles = g.getTiles(); + let f = tiles[0].getFamily(); + let v = tiles[1].getValue(); + return f < 4 && v !== 1 && v !== 9 + } + ); + if (gr.length > 0) { + return 0; + } + return 2; }, -chinroutou: function( - /** - * tout terminale - * 13/13 - */ +/** + * tout terminale + * 13/13 + */ +chinroutou: function( hand: Hand, groups: Array, wind: number @@ -489,11 +501,11 @@ chinroutou: function( return 0; }, -tsuuiisou: function( - /** - * tout honneur - * 13/13 - */ +/** + * tout honneur + * 13/13 + */ +tsuuiisou: function( hand: Hand, groups: Array, wind: number @@ -511,11 +523,11 @@ tsuuiisou: function( return 0; }, +/** + * treize orphelins + * 0/13 + */ kokushiMusou: function( - /** - * treize orphelins - * 0/13 - */ hand: Hand, groups: Array, wind: number @@ -523,10 +535,16 @@ kokushiMusou: function( if (groups.length > 0) { return 0; } - if (yakus.honroutou(hand, groups, wind) === 0) { + let h = hand.getTiles(); + if ( + h.some(t => + t.getFamily() < 4 && + t.getValue() > 1 && + t.getValue() < 9 + ) + ) { return 0; } - let h = hand.getTiles(); let count = 0; for (let i = 0; i < h.length - 1; i++) { if (h[i].isEqual(h[i+1].getFamily(), h[i+1].getValue())) { @@ -542,27 +560,38 @@ kokushiMusou: function( return 0; }, +/** + * sept paires + * 0/2 + */ chiitoitsu: function( - /** - * sept paires - * 0/2 - */ hand: Hand, groups: Array, wind: number ): number { - return 0; if (groups.length > 0) { return 0; } - //TODO + let h = hand.getTiles(); + if (h.length !== 14) { + return 0; + } + for (let i = 0; i < 14; i += 2) { + if ( + h[i].compare(h[i+1]) !== 0 || + (i > 0 && h[i].compare(h[i-1]) === 0) + ) { + return 0 + } + } + return 2; }, +/** + * tout brelans + * 2/2 + */ toitoi: function( - /** - * tout brelans - * 2/2 - */ hand: Hand, groups: Array, wind: number @@ -577,11 +606,11 @@ toitoi: function( return 0; }, -sanankou: function( - /** - * trois brelan cachés - * 2/2 - */ +/** + * trois brelan cachés + * 2/2 + */ +sanankou: function( hand: Hand, groups: Array, wind: number @@ -601,11 +630,11 @@ sanankou: function( return 0; }, +/** + * quatre brelans cachés + * 0/13 + */ suuankou: function( - /** - * quatre brelans cachés - * 0/13 - */ hand: Hand, groups: Array, wind: number