当前位置:首页 > JavaScript

js实现赛程

2026-01-31 16:09:59JavaScript

赛程生成的基本思路

赛程生成通常涉及循环赛或淘汰赛的编排,需要合理安排比赛顺序避免冲突。循环赛确保每支队伍与其他队伍至少交锋一次,淘汰赛则逐步淘汰队伍直至决出冠军。

循环赛算法实现

使用双循环法可以生成主客场赛程。将队伍列表分为两部分,通过旋转数组模拟对战组合。

js实现赛程

function generateRoundRobin(teams) {
  const schedule = [];
  const numTeams = teams.length;
  const half = Math.floor(numTeams / 2);

  for (let round = 0; round < numTeams - 1; round++) {
    const roundMatches = [];
    for (let i = 0; i < half; i++) {
      const home = teams[i];
      const away = teams[numTeams - 1 - i];
      if (home && away) {
        roundMatches.push({ home, away });
      }
    }
    schedule.push(roundMatches);

    // 旋转数组(保留第一个元素)
    teams.splice(1, 0, teams.pop());
  }
  return schedule;
}

淘汰赛算法实现

淘汰赛需要处理队伍数量不是2的幂次方的情况,通过首轮轮空实现平衡。

js实现赛程

function generateKnockout(teams) {
  const rounds = [];
  let currentRound = [...teams];

  while (currentRound.length > 1) {
    const nextRound = [];
    const matches = [];

    for (let i = 0; i < currentRound.length; i += 2) {
      if (i + 1 < currentRound.length) {
        matches.push({
          team1: currentRound[i],
          team2: currentRound[i + 1]
        });
        nextRound.push(null); // 胜者待定
      } else {
        nextRound.push(currentRound[i]); // 轮空
      }
    }

    rounds.push(matches);
    currentRound = nextRound;
  }
  return rounds;
}

可视化赛程输出

将生成的赛程格式化为可读性更高的表格形式。

function printSchedule(schedule) {
  schedule.forEach((round, index) => {
    console.log(`Round ${index + 1}:`);
    round.forEach(match => {
      console.log(`  ${match.home} vs ${match.away}`);
    });
  });
}

处理奇数队伍情况

当队伍数量为奇数时,自动添加轮空位保持算法稳定性。

function prepareTeams(rawTeams) {
  const teams = [...rawTeams];
  if (teams.length % 2 !== 0) {
    teams.push(null); // 轮空标记
  }
  return teams;
}

完整调用示例

const teams = ['Team A', 'Team B', 'Team C', 'Team D'];
const preparedTeams = prepareTeams(teams);

const roundRobin = generateRoundRobin(preparedTeams);
printSchedule(roundRobin);

const knockout = generateKnockout(teams);
console.log(knockout);

标签: 赛程js
分享给朋友:

相关文章

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…