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

C#计时器实现:游戏获胜时长记录与最优成绩保存方案

扫雷排行榜实现方案:记录统计与分难度存储

嘿,很高兴你已经搞定了扫雷的核心功能和计时器!针对你的两个问题,我分享一下实际开发中常用的可行方案:

一、如何统计并保存优于当前最差记录的时长

首先得明确:咱们的排行榜应该是保留最快的N条记录(比如前10名),所以"优于当前最差"就是指玩家的耗时比排行榜里最慢的那条还短,或者当排行榜还没填满时直接加入。具体步骤和代码实现如下:

1. 定义记录结构

先创建一个类来存储每条记录的关键信息,比如玩家昵称、耗时、游戏日期和难度:

public class GameRecord
{
    public string PlayerName { get; set; } = "Anonymous"; // 默认匿名
    public int TimeInSeconds { get; set; }
    public DateTime GameDate { get; set; } = DateTime.Now;
    public DifficultyLevel Difficulty { get; set; }
}

public enum DifficultyLevel
{
    Easy,
    Medium,
    Hard
}

2. 核心逻辑:读取、筛选、保存记录

这里用JSON格式存储(易读易解析,适合Windows Forms项目),用Newtonsoft.Json(NuGet可安装)来序列化/反序列化数据:

// 定义排行榜最多保留的记录数
private const int MaxLeaderboardEntries = 10;

// 获取对应难度的排行榜文件路径(存在系统应用数据目录,避免权限问题)
private string GetLeaderboardFilePath(DifficultyLevel difficulty)
{
    string appDataDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
    string gameDir = Path.Combine(appDataDir, "MyMinesweeper");
    Directory.CreateDirectory(gameDir); // 确保目录存在
    return Path.Combine(gameDir, $"Leaderboard_{difficulty}.json");
}

// 保存新记录的方法
public void SaveLeaderboardRecord(GameRecord newRecord)
{
    string filePath = GetLeaderboardFilePath(newRecord.Difficulty);
    List<GameRecord> leaderboard = new List<GameRecord>();

    // 读取已有记录
    if (File.Exists(filePath))
    {
        try
        {
            string jsonContent = File.ReadAllText(filePath);
            leaderboard = JsonConvert.DeserializeObject<List<GameRecord>>(jsonContent) ?? new List<GameRecord>();
        }
        catch (Exception)
        {
            // 如果文件损坏,重置为空列表
            leaderboard = new List<GameRecord>();
        }
    }

    // 添加新记录
    leaderboard.Add(newRecord);

    // 按耗时升序排序(耗时越短排名越靠前)
    leaderboard = leaderboard.OrderBy(record => record.TimeInSeconds).ToList();

    // 只保留前MaxLeaderboardEntries条,自动剔除比"最差记录"慢的条目
    if (leaderboard.Count > MaxLeaderboardEntries)
    {
        leaderboard = leaderboard.Take(MaxLeaderboardEntries).ToList();
    }

    // 写回文件
    string updatedJson = JsonConvert.SerializeObject(leaderboard, Formatting.Indented);
    File.WriteAllText(filePath, updatedJson);
}

3. 调用时机

当玩家成功扫完所有地雷时,获取计时器的耗时,创建GameRecord对象并调用SaveLeaderboardRecord方法即可。

二、不同难度的记录是否需要分开保存?

必须分开!

不同难度的棋盘参数(大小、地雷数量)差异极大,耗时没有可比性:比如Easy难度最快可能10秒,Hard难度最快可能30秒,如果混在一起排行榜完全失去参考意义。分开存储每个难度的独立排行榜,玩家能清晰看到自己在对应难度下的排名,体验会好很多。

上面的代码已经实现了分难度存储——每个难度对应一个独立的JSON文件(比如Leaderboard_Easy.json、Leaderboard_Hard.json),完美匹配需求。

额外小建议

  • 可以在玩家获胜后弹出输入框,让玩家填写昵称,避免排行榜全是"Anonymous";
  • 显示排行榜时,按耗时排序展示,同时可以显示日期,让记录更有参考性;
  • 读取记录时一定要加异常捕获,防止文件损坏导致程序崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:02:02