游戏击杀效果Web应用:144种assassins组合批量匹配方案问询
解决方案:用组合映射表替代大量条件判断
当然可以用组合列表/映射表来解决这个问题,完全不用写144个函数。核心思路是把所有击杀组合的规则统一存在一个数据结构里,通过查询这个结构来获取对应结果,具体实现如下:
1. 定义击杀组合规则
推荐用对象映射表来存储规则,查询效率更高(O(1)),结构也更清晰:
// 键格式为 "攻击者类型-受害者类型",值为对应的击杀结果 const killOutcomeMap = { "Classic-Oxford": "No special effect", "Classic-Poison": "Victim is eliminated, the attacker receives 2-day death countdown", // 在这里补充剩下的142种组合... };
如果觉得键的拼接不够直观,也可以用数组存储对象的形式:
const killOutcomes = [ { attacker: "Classic", victim: "Oxford", outcome: "No special effect" }, { attacker: "Classic", victim: "Poison", outcome: "Victim is eliminated, the attacker receives 2-day death countdown" }, // 补充其他组合... ];
2. 重构查询函数
根据上面的规则结构,修改checkSelection函数,直接查询匹配的结果:
用对象映射表的版本(推荐)
function checkSelection() { // 直接获取下拉框当前选中值 const attacker = attackerSel.value; const victim = victimSel.value; const resultElement = document.querySelector('#outcome'); // 拼接查询键,找不到结果时显示默认文本 const ruleKey = `${attacker}-${victim}`; resultElement.textContent = killOutcomeMap[ruleKey] || "Unknown outcome"; }
用数组的版本
function checkSelection() { const attacker = attackerSel.value; const victim = victimSel.value; const resultElement = document.querySelector('#outcome'); // 在数组中查找匹配的组合 const matchedRule = killOutcomes.find(rule => rule.attacker === attacker && rule.victim === victim ); // 显示结果,找不到则用默认文本 resultElement.textContent = matchedRule ? matchedRule.outcome : "Unknown outcome"; }
3. 修正原代码的问题
原代码里的作用域、事件监听和setInterval用法都有问题,直接替换成下面的完整代码即可:
// 1. 定义所有击杀规则 const killOutcomeMap = { "Classic-Oxford": "No special effect", "Classic-Poison": "Victim is eliminated, the attacker receives 2-day death countdown", // 补充剩余组合... }; // 2. 获取DOM元素 const attackerSel = document.querySelector('#attackerSel'); const victimSel = document.querySelector('#victimSel'); // 3. 定义结果查询函数 function checkSelection() { const attacker = attackerSel.value; const victim = victimSel.value; const resultElement = document.querySelector('#outcome'); const ruleKey = `${attacker}-${victim}`; resultElement.textContent = killOutcomeMap[ruleKey] || "Unknown outcome"; } // 4. 绑定事件:下拉框选项变化时更新结果 attackerSel.addEventListener('change', checkSelection); victimSel.addEventListener('change', checkSelection); // 5. 页面加载时默认执行一次,显示初始选中项的结果 checkSelection();
关键修正点:
- 去掉了无效的
setInterval:不需要定时轮询,监听下拉框的change事件就能实时响应 - 解决了作用域问题:直接通过DOM元素获取当前选中值,不用在回调里维护变量
- 事件监听逻辑简化:两个下拉框都绑定同一个查询函数,代码更简洁
内容的提问来源于stack exchange,提问作者skedada
相关产品推荐
相关产品推荐

