我正在为一个类似于地铁冲浪者的大学项目编写游戏。我让一切正常工作,但我的问题出现在我编码的书签选项中。
当您在游戏中输掉时,您必须输入一个名称,该名称将以<int score> <string name>
格式写入并保存在文本文件中,例如:
11245 Lucas
10123 Marco
2394 Ricky
因此,在游戏菜单中,您可以选择书签,然后读取文本文件并将其显示在屏幕上,一个分数在另一个分数下,每个游戏中都写着名称。
现在我的问题是我希望对书签进行排序,最高在顶部,但我不知道我该怎么做,因为我每行都有一个 int 和一个字符串,它们是相关的,因此我不能有一个文件用于分数和一个文件用于名称,因此当我对分数进行排序时,我丢失了有关谁获得了每个分数的信息。
我能做些什么来解决这个问题?
编辑: 我正在添加与我的问题相关的代码部分。 这是显示书签的方法
static void ReadBookmark()
{
Console.Clear();
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("BOOKMARKS");
string myfile = @"bookmarks.txt";
if (File.Exists(myfile) == false)
{
Console.WriteLine("n");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("NO BOOKMARKS. PLAY SOME GAMES!");
Console.Write("nPRESS A KEY TO RETURN...");
Console.ReadKey();
}
else
{
Console.WriteLine("n");
Console.ForegroundColor = ConsoleColor.Green;
using (StreamReader sr = File.OpenText(myfile))
{
string s = "";
while ((s = sr.ReadLine()) != null)
{
Console.WriteLine($"t{s}");
}
}
Console.ForegroundColor = ConsoleColor.White;
Console.Write("nnPRESS A KEY TO RETURN...");
Console.ReadKey();
}
}
这是将名称和分数写在文件上的代码。
public void SaveBookmark(int score, string name)
{
string myfile = @"bookmarks.txt";
using (StreamWriter sw = File.AppendText(myfile))
{
sw.WriteLine($"{score} {name}");
}
}
您可以在空格上拆分每一行,然后使用int.Parse
获取第一部分的数值,然后使用该值OrderByDescending
:
var orderedLines = File.ReadLines(myfile)
.OrderByDescending(line => int.Parse(line.Split()[0]))
.ToList();
如何安全执行的完整示例,在发布代码之前完成。 这将允许名称中有一个空格。
public List<ScoreItem> GetScores()
{
var scoreList = new List<ScoreItem>();
using (var fs = File.OpenRead("myPath"))
using (var sr = new StreamReader(fs))
{
while (!sr.EndOfStream)
{
var line = sr.ReadLine();
if (string.IsNullOrWhiteSpace(line)) continue;
var scoreMatch = Regex.Match(line, @"Ad*");
if (!scoreMatch.Success)
throw new Exception($"Failed to parse score from line [{line}].");
var nameMatch = Regex.Match(line, @"(?<!Ad*).*Z");
if (!nameMatch.Success)
throw new Exception($"Failed to parse name from line [{line}].");
if (!int.TryParse(scoreMatch.Value, out var score))
throw new Exception($"Failed to cast score to a number from line [{line}].");
scoreList.Add(new ScoreItem {Name = nameMatch.Value, Score = score});
}
return scoreList.OrderByDescending(s => s.Score).ToList();
}
}
public class ScoreItem
{
public string Name { get; set; }
public int Score { get; set; }
}