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

