JS石头剪刀布开发如何简洁实现分数递增避免重复更新DOM
石头剪刀布游戏分数逻辑优化方案
你当前代码的核心问题是把分数数值更新和页面DOM渲染两个完全独立的逻辑耦合在了胜负判断分支里,既造成了代码重复,也容易因为变量名混淆导致全局分数修改失败——你之前尝试写compAns++不生效,就是把存储电脑出拳结果的形参compAns和全局分数变量compScore搞混了,修改函数内部的局部形参不会影响外部全局变量的值,分数自然始终显示为0。
符合最佳实践的实现思路是把两类逻辑拆开,所有分支走完后统一更新页面,不需要在每个if/else块里重复写DOM更新代码。
具体实现步骤
- 抽离独立的分数渲染函数,专门负责把当前最新的全局分数同步到页面上,需要更新显示时直接调用即可
- 胜负判断分支里只做单纯的分数值修改,不操作DOM
- 移除
gameRound函数多余的compAns形参(你调用时根本没有传这个参数,电脑出拳结果是函数内部生成的) - 所有胜负判断逻辑走完后,统一调用一次渲染函数更新页面,平局时分数无变化,调用渲染也不会产生副作用
优化后完整代码
// 全局配置与状态 let compScore = 0; let userScore = 0; const options = ['Rock', 'Paper', 'Scissors']; // 补全你之前缺失的选项数组定义 // 初始化结果展示DOM const body = document.querySelector('body'); const result = document.createElement('div'); result.className = 'result'; body.appendChild(result); /** * 独立渲染函数:仅负责同步最新分数到页面 * 需要更新分数显示时直接调用,无需重复写DOM操作逻辑 */ function renderScore() { result.textContent = `YOUR SCORE ${userScore} :: COMPUTER SCORE ${compScore}`; } // 页面加载完成后先渲染初始0:0分数 renderScore(); // 电脑随机出拳逻辑 function compPlay() { return options[Math.floor(Math.random() * options.length)]; } // 单轮游戏逻辑 function gameRound(userAns) { alert(`${userAns}, eyy? Let's see what the computer chose..`); const userChoice = userAns.toLowerCase(); const compChoice = compPlay().toLowerCase(); alert(`Computer answered ${compChoice}.`); // 分支内仅处理分数变化,不操作DOM if (userChoice === compChoice) { alert('Draw'); } else if ( (userChoice === "rock" && compChoice === "scissors") || (userChoice === "scissors" && compChoice === "paper") || (userChoice === "paper" && compChoice === "rock") ) { userScore += 1; } else { compScore += 1; } // 所有逻辑处理完成后,统一更新页面显示 renderScore(); } // 按钮事件绑定 document.getElementById("rock").addEventListener('click', () => gameRound('Rock')); document.querySelector(".paper").addEventListener('click', () => gameRound('Paper')); document.getElementById("scissors").addEventListener('click', () => gameRound('Scissors'));
额外优化点说明
- 后续如果需要修改分数展示样式、追加连胜统计、新增重置分数功能,只需要修改
renderScore函数或者分数修改逻辑即可,不需要在多个分支里同步改代码,维护成本低很多 - 变量命名做了区分:出拳结果统一用
xxxChoice命名,分数变量保留xxxScore命名,从根源上避免把出拳变量和分数变量搞混的问题 - 逻辑分层后作用域关系非常清晰:全局分数变量在分支里直接修改,渲染函数读取全局变量更新显示,不会出现局部变量覆盖全局变量导致分数不更新的问题
内容的提问来源于stack exchange,提问作者Henderino
相关产品推荐
相关产品推荐

