游戏回放元数据处理代码优化咨询:提升可读性与执行效率
问题描述
我开发了一个机器人,负责从二进制回放文件中读取元数据并解析所需变量。由于游戏开发者的设计问题,回放文件结构复杂,我写了一段代码来筛选结果——将玩家分别归入胜者列表和败者列表,之后导入到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
相关产品推荐
相关产品推荐

