C# WinForm 游戏如何实现存储并展示Top10高分排行榜功能
解决WinForm游戏高分榜数组实现问题
错误根因
你之前的两类报错都是混淆了单局当前得分和历史高分存储数组的用途:
- 单局得分
Score是单个int变量,用来记录当前游玩的实时分数,不能改成数组类型,否则自然不能用++运算累加 - 高分数组是专门用来存储多局历史得分的独立变量,和实时得分变量是两个完全独立的对象
实现步骤
第一步:修改game.cs逻辑
保留原有的Score单局得分变量,在游戏结束时将本次得分传递给高分榜窗体,示例代码如下:
// 原有实时得分逻辑保留 int Score = 0; Scorelabel.Text ="score:" + Score; if (Picturebox.Left < -180) { Picturebox.Left = 800; Score++; } // 新增:游戏结束时打开高分榜,传递本次得分 private void GameOver() { Highscore highscoreForm = new Highscore(Score); // 把当前得分传给高分榜窗体 highscoreForm.ShowDialog(); }
第二步:修改Highscore.cs逻辑
新增带参数的构造方法接收当前得分,用数组存储历史得分,排序后展示到ListBox控件:
namespace Game { public partial class Highscore : Form { // 静态高分数组,全局生效,程序运行期间会保留所有历史高分 private static int[] _highScores = new int[10]; // 新增带参数的构造方法,接收game.cs传来的本次得分 public Highscore(int currentScore) { InitializeComponent(); UpdateHighScores(currentScore); BindHighScoresToListBox(); } // 更新高分数组 private void UpdateHighScores(int newScore) { // 把新得分加到数组最后一位 _highScores[_highScores.Length - 1] = newScore; // 数组按从高到低排序 Array.Sort(_highScores); Array.Reverse(_highScores); } // 把高分绑定到ListBox展示 private void BindHighScoresToListBox() { listBox1.Items.Clear(); for (int i = 0; i < _highScores.Length; i++) { if (_highScores[i] > 0) // 只展示有得分的记录 { listBox1.Items.Add($"第{i+1}名:{_highScores[i]}分"); } } } } }
注意事项
- 如果需要关闭程序后依然保留高分记录,可以把高分数组序列化存到本地文件,下次启动时读取即可
- 如果不需要全局保留高分,也可以把高分数组存在game.cs中,打开高分榜时直接把整个数组传过去
内容的提问来源于stack exchange,提问作者Luc van Gestel
相关产品推荐
相关产品推荐

