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

Python控制台格斗游戏JSON高分存储覆盖问题求助

问题根源

你当前的代码是直接用新生成的完整数据覆盖旧JSON文件,完全没做任何字段级的比较/合并逻辑,所以不管新成绩好坏、道具掉落多少,都会直接替换掉历史记录。

解决方案

核心思路是先加载历史数据,再和本次游戏的新数据做针对性合并:保留最高击杀数、累加道具总掉落数、合并解锁内容,最后保存合并后的结果,而不是直接覆盖。

以下是修改后的完整代码,附带详细逻辑说明:

import json

def loadPrefs(filename):
    try:
        with open(filename, "r") as file:
            return json.load(file)
    except FileNotFoundError:
        # 首次运行返回默认初始值,避免字段缺失导致后续合并报错
        return {
            "settings": {},
            "unlockedTreasures": [],
            "unlockedEnemies": [],
            "highestKillCount": 0,
            "healthPotionDrops": 0,
            "strengthPotionDrops": 0,
            "criticalTokenDrops": 0,
        }

def merge_data(old_data, new_data):
    # 复制旧数据作为基础,避免直接修改原字典
    merged = old_data.copy()
    
    # 最高击杀数:取历史记录和本次记录的最大值
    merged["highestKillCount"] = max(old_data["highestKillCount"], new_data["highestKillCount"])
    
    # 道具掉落:累加总次数(如果需求是记录单次最高掉落,把+=换成max()即可)
    merged["healthPotionDrops"] += new_data["healthPotionDrops"]
    merged["strengthPotionDrops"] += new_data["strengthPotionDrops"]
    merged["criticalTokenDrops"] += new_data["criticalTokenDrops"]
    
    # 解锁内容:合并列表并去重(保留顺序的话可以用循环判断替代集合)
    for treasure in new_data["unlockedTreasures"]:
        if treasure not in merged["unlockedTreasures"]:
            merged["unlockedTreasures"].append(treasure)
    for enemy in new_data["unlockedEnemies"]:
        if enemy not in merged["unlockedEnemies"]:
            merged["unlockedEnemies"].append(enemy)
    
    # 设置:用新设置覆盖旧设置(如果需要保留旧设置未修改的项,改用merged["settings"].update(new_data["settings"]))
    merged["settings"] = new_data["settings"]
    
    return merged

def savePrefs(filename, data):
    with open(filename, "w") as file:
        json.dump(data, file, indent=4)  # indent参数让JSON文件更易读

# ------------------- 游戏结束后的执行逻辑 -------------------
# 这里替换为你游戏结束后生成的真实数据
settings = {"difficulty": "normal", "sound": True}
current_kills = 12  # 本次游戏击杀数
current_hp_drops = 2  # 本次游戏血瓶掉落数
current_sp_drops = 1
current_ct_drops = 0
new_game_data = {
    "settings": settings,
    "unlockedTreasures": ["Silver Ring"],
    "unlockedEnemies": ["Werewolf"],
    "highestKillCount": current_kills,
    "healthPotionDrops": current_hp_drops,
    "strengthPotionDrops": current_sp_drops,
    "criticalTokenDrops": current_ct_drops,
}

prefsFilename = "userPrefsNPerfs.json"
# 1. 加载历史数据
old_data = loadPrefs(prefsFilename)
# 2. 合并新旧数据
final_data = merge_data(old_data, new_game_data)
# 3. 保存合并后的最终数据
savePrefs(prefsFilename, final_data)

# 验证结果
loaded_prefs = loadPrefs(prefsFilename)
print("Loaded preferences:", loaded_prefs)
关键逻辑说明
  • 最高击杀数:通过max()函数确保始终保留历史最高值,不会被后续低分覆盖
  • 道具掉落数:采用累加逻辑统计总掉落次数,若你需要记录单次最高掉落,只需将+=替换为max()
  • 解锁内容:用循环判断避免重复添加已解锁的道具/敌人,同时保留解锁顺序(如果不在意顺序,也可以用list(set(old + new))简化,但会打乱顺序)
  • 设置项:默认用新设置覆盖旧设置,若需要保留旧设置中未修改的选项,可将merged["settings"] = new_data["settings"]改为merged["settings"].update(new_data["settings"])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:26:18