井字棋游戏排行榜优化:实现分数更新与字典合并
解决方案
你现在的问题出在用了追加模式写入新的JSON对象,导致文件里堆了多个独立字典,不是一个完整的玩家分数字典。要实现「更新老玩家分数、把新玩家加到同一个字典里」的需求,得改改读写逻辑:
修改后的完整代码
import json import os def save_score(score): filename = 'leaderboard.txt' player = input('What is your name? ').strip() leaderboard_dict = {} # 读现有文件里的分数(如果文件存在) if os.path.exists(filename): with open(filename, "r") as f: try: leaderboard_dict = json.load(f) except json.JSONDecodeError: print("注意:现有排行榜文件格式有问题,将重新创建") leaderboard_dict = {} # 更新分数:有这个玩家就覆盖分数,没有就新增 leaderboard_dict[player] = score # 按分数从高到低排序(不需要的话删掉这段就行) sorted_leaderboard = dict(sorted(leaderboard_dict.items(), key=lambda x: x[1], reverse=True)) # 把完整字典写回文件(覆盖原来的内容) with open(filename, "w") as f: json.dump(sorted_leaderboard, f, indent=4) # indent让JSON看起来更整齐 print(f"Score {score} for {player} saved.")
关键改动说明
- 换掉追加模式:不再用
"a"往文件里塞新字典,而是先读出现有数据,改完后用"w"把整个完整字典写回去,覆盖原来的内容。 - 复用已有数据:每次保存前先加载文件里的老玩家分数,不会丢之前的记录。
- 防错处理:加了
try-except,如果之前的文件格式坏了(比如你之前追加的多个字典),程序不会直接崩,会重新建一个干净的字典。 - 分数排序:用
sorted()把玩家按分数从高到低排好,保存到文件里也是有序的;要是不需要排序,把排序那行删掉就行。 - 优化输出:用f-string简化打印语句,
indent=4让保存的JSON文件更易读,不用挤成一团。
效果示例
初始文件内容:
{"Bob": 50,"Jane": 2,"Sarah": 5, "Amelia": 20}
当Bob再得70分,新玩家Tina得15分后,文件会变成:
{ "Bob": 70, "Amelia": 20, "Tina": 15, "Sarah": 5, "Jane": 2 }
内容的提问来源于stack exchange,提问作者efe apoki
相关产品推荐
相关产品推荐

