You need to enable JavaScript to run this app. JavaScript实现Yahtzee游戏Full House牌型判定逻辑异常求助
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript实现Yahtzee游戏Full House牌型判定逻辑异常求助

Full House判定失效的核心问题
  • 你当前编写的判定代码存在完全重复的逻辑:if分支和else if分支写了一模一样的判断条件,根本没有覆盖你最开始设计的“一对点数在前、三个相同点数在后”的场景(比如[4,4,5,5,5]这种排序后的数组),等于白写了else if分支,自然无法触发正确判定。
  • 你最开始设计的两个分支条件本身是适配排序后数组结构的,但在组合逻辑的时候没有用逻辑或||把两个不同的场景连起来,反而重复了同一套判断,这就是为什么单独校验每个括号内的条件没问题,但整体逻辑跑不通。
  • 额外需要注意两个容易踩的坑:
    • JS原生sort()方法如果不传数字比较函数,会默认按照字符串Unicode编码排序,哪怕你现在的骰子点数都是个位数大概率不会出问题,也要养成写sort((a,b) => a - b)的习惯,避免后续改版出现排序错误。
    • 按照正规Yahtzee规则,五个骰子点数完全相同的场景属于Yahtzee牌型,不算Full House。这种场景能通过你原本设计的部分校验条件,如果不做排除会造成误判。
修正后的可运行判定逻辑

基于你已经做数组排序的前提,把所有Full House的覆盖场景、误判排除逻辑整合后,代码可以调整为如下结构:

function fullHouseFunc() {
    // 确保骰子数组按数字规则升序排序
    newRoll.sort((a, b) => a - b);
    // 拆分两种排序后会出现的Full House场景
    const threeThenTwo = (newRoll[0] === newRoll[2]) && (newRoll[3] === newRoll[4]); // 匹配[1,1,1,6,6]这类结构
    const twoThenThree = (newRoll[0] === newRoll[1]) && (newRoll[2] === newRoll[4]); // 匹配[4,4,5,5,5]这类结构
    // 排除五同的Yahtzee场景
    const isYahtzee = newRoll[0] === newRoll[4];

    // 满足任意一种Full House场景,且不属于五同,就计25分
    if ((threeThenTwo || twoThenThree) && !isYahtzee) {
        fullHouse.innerHTML = 25;
    } else {
        // 不符合规则时清零分值,避免保留上一次的计分结果
        fullHouse.innerHTML = 0;
    }
}

补充说明:你之前的代码里两个分支完全一致,哪怕把else if的条件改对,也建议直接用||把两个条件合并在同一个if判断里,不需要写冗余的else if分支,代码可读性会更高,也不容易出现复制粘贴错条件的问题。

内容的提问来源于stack exchange,提问作者listonator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 12:24:04