如何在JavaScript Cookie Clicker游戏中优化计数提升逻辑(无需大量if语句)
你当前的代码里,up()函数依赖读取DOM元素的文本内容来判断乘数,写了一堆重复的if语句,完全是没必要的——你已经在内存里维护了multiplier变量,直接用它来计算点击收益就行,逻辑会简洁很多。
优化后的完整JavaScript代码
let counter = document.getElementById("counter"); let count = 0; let multiplier = 1; let multiplierDisplay = document.getElementById("multiplier"); // 变量名更贴合用途 function up(){ // 直接用multiplier计算每次点击的总收益,替代所有if判断 count += multiplier; // 只更新一次DOM,减少不必要的重绘 counter.innerHTML = count; } function buyGrandma(){ if (count >= 30) { count -= 30; counter.innerHTML = count; multiplier += 1; multiplierDisplay.innerHTML = "Multiplier: " + multiplier; } else { alert("not enough cookies"); } }
优化说明
- 去掉冗余判断:原来的
if语句本质是实现「每次点击基础+1,再额外加multiplier-1」,等价于直接加multiplier,一行代码搞定所有逻辑。 - 减少DOM操作:原来的函数多次设置
counter.innerHTML,现在只更新一次,性能更优。 - 避免依赖DOM状态:不再靠读取元素文本判断乘数,直接用内存变量,避免DOM文本被意外修改导致逻辑出错。
- 变量名更清晰:把
multiplierButton改成multiplierDisplay,更符合它作为显示元素的用途。
扩展建议(针对未来加新升级项)
如果以后要加入更多类型的升级(比如Cookie Factory、Farm等),可以用对象来统一管理升级配置,方便扩展:
// 用对象管理所有升级项 let upgrades = { grandma: { cost: 30, perUnitBonus: 1, // 每个grandma提供的加成 owned: 0 } }; let counter = document.getElementById("counter"); let count = 0; let multiplier = 1; let multiplierDisplay = document.getElementById("multiplier"); function up(){ count += multiplier; counter.innerHTML = count; } function buyGrandma(){ const grandma = upgrades.grandma; if (count >= grandma.cost) { count -= grandma.cost; grandma.owned += 1; // 重新计算总乘数:基础1 + 所有grandma的总加成 multiplier = 1 + grandma.owned * grandma.perUnitBonus; multiplierDisplay.innerHTML = "Multiplier: " + multiplier; counter.innerHTML = count; } else { alert("not enough cookies"); } }
这种方式下,新增升级项只需要在upgrades里添加新的配置对象,不需要修改核心的点击逻辑,扩展性更强。
内容的提问来源于stack exchange,提问作者ThatGuyWhoNeedsHelp
相关产品推荐
相关产品推荐

