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
相关产品推荐
相关产品推荐

