如何将多个while循环改为遍历对象生成武器随机坐标的函数?
简化回合制桌游武器坐标生成代码的方案
嘿,这个问题我熟!你现在用多个独立while循环确实有点冗余,咱们可以把坐标生成逻辑封装成一个通用函数,不管以后加多少武器都能直接复用,省心多了。先把你给出的现有代码补全一下(看起来没写完),再给你优化方案:
先看你原有的基础代码(补全版)
var GameObjects={ Weapon1:4, Weapon2:5, Weapon3:6, Weapon4:7, }; this.size=10; map=[]; // 补全地图初始化逻辑(假设是size*size的网格) map = Array.from({ length: this.size }, () => Array(this.size).fill(null)); // 你原来的单个while循环(补全核心逻辑) var i=0; while (i<1) { var x = Math.floor(Math.random()*map.length); var y = Math.floor(Math.random()*map.length); // 这里应该是判断坐标是否可用并赋值的逻辑 i++; }
优化后的通用函数方案
核心思路是遍历武器对象的键值对,用统一逻辑生成坐标(还能顺便处理坐标不重复的需求,这应该是你需要的吧?):
// 封装坐标生成函数 function generateWeaponPositions(weaponObj, mapSize) { // 用Set存储已占用的坐标,避免重复(不需要唯一坐标可去掉此部分) const usedCoords = new Set(); // 存储带坐标的武器对象 const result = {}; // 遍历每个武器 for (const [weaponName, weaponValue] of Object.entries(weaponObj)) { let x, y; // 生成不重复的坐标 do { x = Math.floor(Math.random() * mapSize); y = Math.floor(Math.random() * mapSize); } while (usedCoords.has(`${x},${y}`)); // 记录已用坐标 usedCoords.add(`${x},${y}`); // 给武器添加坐标,同时保留原有属性值 result[weaponName] = { value: weaponValue, x, y }; // 如果想直接修改原GameObjects对象,也可以这么写: // weaponObj[weaponName] = { value: weaponValue, x, y }; } return result; } // 调用函数,生成所有武器的坐标 const weaponsWithPositions = generateWeaponPositions(GameObjects, this.size); console.log(weaponsWithPositions);
这个方案的好处
- 复用性强:以后新增Weapon5、Weapon6,只要加到
GameObjects里,函数自动处理,不用再写新循环 - 逻辑统一:坐标生成的规则(比如范围、是否去重)都集中在函数里,改需求只需要改这一处
- 可读性高:函数名和变量名清晰,别人一看就知道是干啥的
如果你的需求里不需要坐标唯一(比如允许武器重叠),那可以直接去掉do-while循环和usedCoords集合,直接生成x和y就行,代码会更简洁。
内容的提问来源于stack exchange,提问作者geebrand
相关产品推荐
相关产品推荐

