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。这种场景能通过你原本设计的部分校验条件,如果不做排除会造成误判。
- JS原生
修正后的可运行判定逻辑
基于你已经做数组排序的前提,把所有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
相关产品推荐
相关产品推荐

