当前位置:首页 > 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 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Promise…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…