You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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);

关键修改说明

  1. 采用do-while循环(也可用while循环,do-while更直观,确保至少执行一次分组逻辑)
  2. 每次循环内部重新调用shuffle函数打乱玩家数组,保证每次拆分的分组都是全新的随机结果
  3. 基于新打乱的数组重新实例化Team类,直到checkTeamsLevel返回true为止

这样就能保证每次循环都尝试不同的随机分组,直到生成符合平衡条件的两支队伍。

内容的提问来源于stack exchange,提问作者Bukpulp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:21:50