Zum Hauptinhalt springen
claw
am
tools
Werkzeuge
Dokumente
Daoark
EN
Startseite
Startseite
/
Unterhaltung & Mystik
›
Startseite
manifest.json
0; }); var tiles = []; for (var i = 0; i < tokens.length; i++) { var t = tokens[i]; var n = parseInt(t); var suit = t[t.length - 1].toLowerCase(); if (suit === 'm') tiles.push(n - 1); else if (suit === 's') tiles.push(9 + n - 1); else if (suit === 'p') tiles.push(18 + n - 1); else if (suit === 'z' || suit === 'e' || suit === 's' || suit === 'w' || suit === 'n' || suit === 'f' || suit === 'b') { var zmap = { 'e': 1, 's': 2, 'w': 3, 'n': 4, 'z': 5, 'f': 6, 'b': 7 }; var suitZ = suit === 's' && t.length === 2 ? 's' : t[t.length - 1].toLowerCase(); if (suitZ === 's' && t.length === 2) tiles.push(27 + 1); // 南(2) else tiles.push(27 + zmap[suit] - 1); } else if (!isNaN(n) && n >= 1 && n <= 9) { // 默认万 tiles.push(n - 1); } } return tiles; } // 数牌面子/雀头检测 function checkStandard(tiles) { if (tiles.length !== 14) return { ok: false, reason: '需要 14 张' }; var count = {}; for (var i = 0; i < tiles.length; i++) count[tiles[i]] = (count[tiles[i]] || 0) + 1; // 4 张相同特殊:不能有 5+ 张,最多 4 for (var k in count) if (count[k] > 4) return { ok: false, reason: '牌 ' + k + ' 超过 4 张' }; // 雀头尝试 var keys = Object.keys(count); for (var i = 0; i < keys.length; i++) { var p = parseInt(keys[i]); if (count[p] < 2) continue; count[p] -= 2; var rest = {}; for (var k in count) { var v = count[k]; if (v > 0) rest[parseInt(k)] = v; } if (canMeldAll(rest)) { return { ok: true, eye: p }; } count[p] += 2; } return { ok: false, reason: '不构成 4 面子+1 雀头' }; } function canMeldAll(count) { var keys = Object.keys(count).map(function(k) { return parseInt(k); }).sort(function(a, b) { return a - b; }); for (var i = 0; i < keys.length; i++) { var k = keys[i]; var v = count[k]; if (v <= 0) continue; if (k >= 27) { // 字牌只能刻 if (v < 3) return false; count[k] = v - 3; } else { var suit = Math.floor(k / 9); var num = k % 9; if (v >= 3) { count[k] = v - 3; } else { // 顺:需要同花色 num+1, num+2 if (num >= 7) return false; if ((count[suit * 9 + num + 1] || 0) < 1) return false; if ((count[suit * 9 + num + 2] || 0) < 1) return false; count[k] = v - 1; count[suit * 9 + num + 1]--; count[suit * 9 + num + 2]--; } } } return true; } // 七对 function checkQiDui(tiles) { if (tiles.length !== 14) return { ok: false, reason: '七对需 14 张' }; var count = {}; for (var i = 0; i < tiles.length; i++) count[tiles[i]] = (count[tiles[i]] || 0) + 1; var pairs = 0; for (var k in count) { pairs += Math.floor(count[k] / 2); } return pairs === 7 ? { ok: true } : { ok: false, reason: '只有 ' + pairs + ' 对' }; } // 听牌检测(13 张 -> 加任意 1 张,判断胡) function checkTenpai(tiles) { if (tiles.length !== 13) return []; var allTiles = []; for (var i = 0; i < 34; i++) allTiles.push(i); var tenpai = []; for (var i = 0; i < 34; i++) { var test = tiles.concat([i]); var std = checkStandard(test); var qd = checkQiDui(test); if (std.ok || qd.ok) tenpai.push(i); } return tenpai; } function tileName(t) { if (t < 9) return (t + 1) + 'm'; if (t < 18) return (t - 8) + 's'; if (t < 27) return (t - 17) + 'p'; var z = ['E', 'S', 'W', 'N', 'Z', 'F', 'B']; return z[t - 27]; } function doProcess() { try { var rule = getVal('rule'); var tiles = parseTiles(getVal('tiles')); if (tiles.length === 0) { showError('请输入手牌'); return; } var out = '手牌: ' + tiles.length + ' 张 → ' + tiles.map(tileName).join(' ') + '\n\n'; if (tiles.length === 13) { var tp = checkTenpai(tiles); out += '听牌检测(13 张):\n'; if (tp.length === 0) out += ' 未听牌\n'; else out += ' 听: ' + tp.map(tileName).join(' ') + ' (' + tp.length + ' 门)\n'; showResult(out, '13 张手牌'); return; } if (tiles.length !== 14) { showError('需 14 张(标准)或 13 张(听牌检测),当前 ' + tiles.length); return; } var results = []; if (rule === 'std' || rule === 'guobiao') { var s = checkStandard(tiles); out += '标准胡: ' + (s.ok ? ' 胡! 雀头=' + tileName(s.eye) : ' ' + s.reason) + '\n'; if (s.ok) results.push('标准'); } if (rule === 'qidu' || rule === 'guobiao') { var q = checkQiDui(tiles); out += '七对: ' + (q.ok ? ' 胡!' : ' ' + q.reason) + '\n'; if (q.ok) results.push('七对'); } out += '\n结论: ' + (results.length > 0 ? '胡牌 (' + results.join('/') + ')' : '未胡'); showResult(out, rule + ', ' + tiles.length + ' 张'); } catch (e) { showError('检测失败: ' + (e.message || e)); } } $('btn-main').addEventListener('click', function(e) { e.preventDefault(); doProcess(); }); $('btn-clear').addEventListener('click', function() { var inputs = document.querySelectorAll('input,textarea,select'); for (var i = 0; i < inputs.length; i++) { if (inputs[i].tagName === 'SELECT') inputs[i].selectedIndex = 0; else inputs[i].value = inputs[i].defaultValue; } var ra = $('result-area'); ra.hidden = true; ra.style.display = 'none'; var em = $('error-msg'); em.hidden = true; em.style.display = 'none'; }); })();