XNA ゲームのスコアボードを作成しようとしていますが、方法がわかりません。プレーヤーは、レベルを終了した後、プロンプトが表示されたら自分の名前を入力します。彼の名前と時間は、次のようなテキスト ファイルに記録されます。
sam 90
james 64
matthew 100
名前を考慮せずに、このデータを時間のみでソートする方法を見つけようとしています。
私はまだこれをコーディングし始めていませんが、誰かが私に何かアイデアを与えることができれば、それは大歓迎です.
まず、を使用してテキスト ファイルを読み取り、File.ReadAllLines(...)
文字列配列を取得します。次に、配列を反復処理し、各文字列を空白スペースで分割し (ユーザーが名前にスペースを入力できないと仮定します)、スコアである 2 番目の要素で並べ替えます。int.Parse(...)
適切に並べ替えるには、文字列にキャストする必要があります。
string[] scores = File.ReadAllLines("scorefile.txt");
var orderedScores = scores.OrderByDescending(x => int.Parse(x.Split(' ')[1]));
foreach (var score in orderedScores)
{
Console.WriteLine(score);
}
//outputs:
//matthew 100
//sam 90
//james 64
ユーザーが名前にスペースを入力できる場合に扱いやすいように、スペースの代わりにセミコロンのようなものを使用して名前とスコアを区切ることをお勧めします。
これを必要に応じてその場で簡単に作成できる .sdf というデータベース ファイルにしないでください。並べ替えと将来の再利用を可能にするデータを追跡するのに最適です。
SQLite はまさにこの目的のために設計されており、基本的な CRUD 操作を簡単にします。ゲームが成長し、ハイスコアをダウンロード/アップロードし、友人/世界とスコアを共有する方法として使用を開始したい場合は、データベース ファイルを暗号化することもできます。
誤解しないでほしいのですが、これは単純にテキスト ファイルを解析するよりも少し手間がかかることは間違いありませんが、これは将来性があり、パーサーや複雑な検索ルーチンなどを記述する必要なく、すぐに多くの機能を利用できます。
XML または JSON も明確な選択肢の 1 つです。3 つすべてが優れた代替手段です。ただし、最終的にはおそらくより多くの作業が必要になるため、プレーンテキストファイルはおそらく適切ではありません。
次のようにスコア テーブルを作成します。
name::score
すべての行とその上を読む
string line = "Sam::255";
string name = line.split("::")[0];
スコアも同様に行います。