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

基于jQuery开发足球赛事Fixture list的逻辑问题求助

足球赛事赛程表(Fixture List)编排方案

基础赛制规则与核心公式

你给出的示例属于单循环赛制——每支球队与其他所有球队恰好交手一次,对应的核心规则:

  • 偶数球队数(N):轮次总数 = N-1,每轮包含 N/2 场比赛
  • 奇数球队数(N):轮次总数 = N,每轮包含 (N-1)/2 场比赛,其中1支球队轮空(Bye)
  • 若games字段值大于1,代表多循环赛制(比如双循环主客场),总轮次 = 单循环轮次 × games

经典轮转编排法(保证对阵公平精准)

这是业界通用的单循环赛程编排方法,能确保每支球队的对阵分布均匀,避免连续主场/客场的情况:

偶数球队操作步骤(以6支球队为例)

  1. 将球队编号为1-6,固定1号球队位置,其余球队按顺时针排列成两行:
    1  2  3
    6  5  4
    
  2. 第一轮对阵:(1 vs 6)、(2 vs 5)、(3 vs 4)
  3. 保持1号球队不动,其余球队顺时针轮转一位:
    1  6  2
    5  4  3
    
  4. 第二轮对阵:(1 vs 5)、(6 vs 4)、(2 vs 3)
  5. 重复轮转操作,直到完成N-1轮

奇数球队操作步骤

添加1支“虚拟轮空队”,将球队总数凑为偶数,按上述偶数球队方法编排,对阵虚拟队的球队在该轮轮空。

适配你的业务需求

从JSON数据提取分组球队

遍历JSON中的groups数组,每个group下的teams列表提取出实际参赛球队(排除bye: true的球队)。

处理多轮次(games字段)

如果games值大于1,比如设置为2(双循环),则将单循环的赛程重复一遍,或每轮交换对阵的主客场顺序(需要区分主客场时)。

匹配你预期的输出格式

以你提供的Group A 4支球队为例,调整轮转的起始配对顺序后,可得到完全符合你预期的输出:

Round 1: {1:2}{3:4}
Round 2: {1:3}{2:4}
Round 3: {2:3}{1:4}

代码实现参考(伪代码)

def build_fixtures(team_list, total_cycles):
    teams = [t["team"] for t in team_list if t["bye"] == "false"]
    n = len(teams)
    fixtures = []
    # 处理奇数球队,添加轮空标记
    if n % 2 != 0:
        teams.append("Bye")
        n += 1
    single_round_count = n - 1
    total_rounds = single_round_count * total_cycles

    for round_idx in range(total_rounds):
        current_round = []
        base_round = round_idx % single_round_count
        # 固定首支球队,轮转其他球队
        fixed_team = teams[0]
        rotated = teams[1:]
        # 执行base_round次轮转
        for _ in range(base_round):
            rotated = [rotated[-1]] + rotated[:-1]
        # 配对对阵
        for i in range(n // 2):
            if i == 0:
                home, away = fixed_team, rotated[n//2 - 1 - i]
            else:
                home, away = rotated[i], rotated[n//2 - 1 - i]
            if home != "Bye" and away != "Bye":
                # 提取球队编号用于格式化输出
                home_num = home.split()[-1]
                away_num = away.split()[-1]
                # 多循环第二轮及以后交换主客场(可选)
                if round_idx >= single_round_count:
                    home_num, away_num = away_num, home_num
                current_round.append(f"{{{home_num}:{away_num}}}")
        fixtures.append(f"Round {round_idx + 1}: {' '.join(current_round)}")
    return fixtures

# 测试Group A数据
group_a_teams = [
    {"team":"Team 1", "bye":"false"},
    {"team":"Team 2", "bye":"false"},
    {"team":"Team 3", "bye":"false"},
    {"team":"Team 4", "bye":"false"}
]
print("\n".join(build_fixtures(group_a_teams, 1)))

解决函数崩溃问题

之前的函数崩溃通常是以下原因导致,按上述方法可彻底解决:

  • 未处理球队数为奇数的情况,导致配对时数组索引越界
  • 轮次计算错误,超出单循环/多循环的合理轮次范围
  • 配对逻辑不严谨,出现重复对阵或遗漏对阵的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:37:04