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

游戏回放元数据处理代码优化咨询:提升可读性与执行效率

问题描述

我开发了一个机器人,负责从二进制回放文件中读取元数据并解析所需变量。由于游戏开发者的设计问题,回放文件结构复杂,我写了一段代码来筛选结果——将玩家分别归入胜者列表和败者列表,之后导入到embed展示。这段代码已覆盖所有元数据场景,但可读性极差,想请教更高效、可读性更强的实现方式。

原代码

if ownervictory < 3:
    for player in playersdata:
        if len(playersdata) == 2:
            if owneralliance == int(player['PlayerAlliance']):
                loserlist.append(player)
            else:
                winnerlist.append(player)
        elif len(playersdata) == 4:
            replayPlayer = 0
            if owneralliance == 2 or owneralliance == 3:
                replayPlayer = 1
            if replayPlayer == int(player['PlayerAlliance']):
                loserlist.append(player)
            else:
                winnerlist.append(player)
        elif len(playersdata) == 6:
            replayPlayer = 0
            if owneralliance == 3 or owneralliance == 4:
                replayPlayer = 1
            if replayPlayer == int(player['PlayerAlliance']):
                loserlist.append(player)
            else:
                winnerlist.append(player)
        elif len(playersdata) == 8:
            replayPlayer = 0
            if owneralliance == 4 or owneralliance == 5 or owneralliance == 6 or owneralliance == 7:
                replayPlayer = 1
            if replayPlayer == int(player['PlayerAlliance']):
                loserlist.append(player)
            else:
                winnerlist.append(player)
elif ownervictory >= 3:
    for player in playersdata:
        if len(playersdata) == 2:
            if owneralliance != int(player['PlayerAlliance']):
                loserlist.append(player)
            else:
                winnerlist.append(player)
        elif len(playersdata) == 4:
            replayPlayer = 0
            if owneralliance == 2 or owneralliance == 3:
                replayPlayer = 1
            if replayPlayer != int(player['PlayerAlliance']):
                loserlist.append(player)
            else:
                winnerlist.append(player)
        elif len(playersdata) == 6:
            replayPlayer = 0
            if owneralliance == 3 or owneralliance == 4 or owneralliance == 4:
                replayPlayer = 1
            if replayPlayer != int(player['PlayerAlliance']):
                loserlist.append(player)
            else:
                winnerlist.append(player)
        elif len(playersdata) == 8:
            replayPlayer = 0
            if owneralliance == 4 or owneralliance == 5 or owneralliance == 6 or owneralliance == 7:
                replayPlayer = 1
            if replayPlayer != int(player['PlayerAlliance']):
                loserlist.append(player)
            else:
                winnerlist.append(player)

优化方案

1. 提取规则配置

把不同玩家数量对应的「败者联盟判定规则」抽成字典,避免重复的分支判断:

# 键:玩家总数;值:判断当前所有者联盟是否属于败者联盟的条件函数
loser_alliance_rules = {
    2: lambda alliance: alliance == owneralliance,
    4: lambda alliance: alliance in (2, 3),
    6: lambda alliance: alliance in (3, 4),
    8: lambda alliance: alliance in (4, 5, 6, 7)
}

2. 统一胜负逻辑

根据ownervictory的值,确定「玩家联盟匹配规则时是败者还是胜者」:

  • 当ownervictory < 3:匹配规则的玩家是败者
  • 当ownervictory >= 3:匹配规则的玩家是胜者

3. 简化循环遍历

遍历玩家时,先根据玩家总数获取对应的规则,再判断玩家归属:

player_count = len(playersdata)
# 获取当前玩家数量对应的败者判定规则
is_loser_rule = loser_alliance_rules.get(player_count)
if not is_loser_rule:
    # 处理未覆盖的玩家数量场景(可选)
    pass

# 根据ownervictory确定匹配规则时的归属
match_is_loser = ownervictory < 3

winnerlist = []
loserlist = []
for player in playersdata:
    player_alliance = int(player['PlayerAlliance'])
    # 判断当前玩家是否符合败者规则
    fits_loser_rule = is_loser_rule(player_alliance)
    
    if (fits_loser_rule and match_is_loser) or (not fits_loser_rule and not match_is_loser):
        loserlist.append(player)
    else:
        winnerlist.append(player)

优化后优势

  • 可读性:规则集中配置,逻辑一目了然,新增玩家数量场景只需在字典中添加规则
  • 复用性:避免了原代码中大量重复的循环和分支判断
  • 可维护性:修改规则时只需调整字典中的条件,无需改动多处代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:45:35