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

井字棋游戏排行榜优化:实现分数更新与字典合并

解决方案

你现在的问题出在用了追加模式写入新的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:30:56