在JS中如何实例化Team类直至满足队伍平衡条件?
解决随机平衡队伍生成问题
你的问题核心在于generateTeams函数只在最开始打乱一次玩家数组,后续循环里没重新打乱分组,导致一直用同一套拆分结果,永远过不了平衡校验,陷入死循环。只要每次循环都重新打乱数组再拆分,就能解决这个问题。
以下是修正后的完整代码示例:
// 示例玩家数组 const players = [ { name: "玩家A", tier: 3 }, { name: "玩家B", tier: 2 }, { name: "玩家C", tier: 3 }, { name: "玩家D", tier: 2 }, { name: "玩家E", tier: 1 }, { name: "玩家F", tier: 1 } ]; // 计算差值的工具函数 function diff(a, b) { return Math.abs(a - b); } // 打乱数组的工具函数(Fisher-Yates 洗牌算法) function shuffle(array) { const newArray = [...array]; for (let i = newArray.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [newArray[i], newArray[j]] = [newArray[j], newArray[i]]; } return newArray; } // 队伍类 class Team { constructor(players) { this.players = players; // 计算队伍总 tier this.tier = players.reduce((sum, player) => sum + player.tier, 0); } } // 校验队伍平衡性 function checkTeamsLevel(team1, team2) { return diff(team1.tier, team2.tier) <= 1; } // 修正后的核心生成函数 function generateTeams() { let team1, team2; // 循环直到生成符合条件的队伍 do { // 每次循环都重新打乱玩家数组 const shuffledPlayers = shuffle(players); // 拆分数组:前半部分给队伍1,后半部分给队伍2 const mid = Math.floor(shuffledPlayers.length / 2); team1 = new Team(shuffledPlayers.slice(0, mid)); team2 = new Team(shuffledPlayers.slice(mid)); } while (!checkTeamsLevel(team1, team2)); // 不满足平衡就继续循环 return { team1, team2 }; } // 调用示例 const result = generateTeams(); console.log("队伍1:", result.team1); console.log("队伍2:", result.team2);
关键修改说明
- 采用do-while循环(也可用while循环,do-while更直观,确保至少执行一次分组逻辑)
- 每次循环内部重新调用shuffle函数打乱玩家数组,保证每次拆分的分组都是全新的随机结果
- 基于新打乱的数组重新实例化Team类,直到checkTeamsLevel返回true为止
这样就能保证每次循环都尝试不同的随机分组,直到生成符合平衡条件的两支队伍。
内容的提问来源于stack exchange,提问作者Bukpulp
相关产品推荐
相关产品推荐

