【C#.NET】スコアのランキング機能を実装する【ヨット】

2021.10.26

CATEGORY : C#.NET プログラミング

こんにちは、あんみんどうふです。

ここ最近時間が取れずヨットの開発に手を付けられていませんが、ランキング機能だけでも実装しようと思います。
少なくとも月に一つぐらいは進捗があってほしいので・・・。

「ヨットって何?」という方は前回の記事をご覧ください。

ご無沙汰してます、あんみんどうふです。 少し前までC#でテトリスを制作しており、(バグはいくつか残っているものの)なんとか完成させることができました。 現在は「ヨット」というゲームを時間を見つけてちまちまと作っています・・・。 ...

ざっくり仕様

ランキングのデータはCSVで管理します。1行ごとに1データ。項目は「名前」と「スコア」のみ。

CSVファイルを作成する機能、CSVに名前とスコアのデータを登録する機能、CSVを読み込んで内容を表示する機能の3つを主に作ります。

CSV関連は「ControlCsv」というクラスにまとめ、ランキング登録用の「RankingAdd」、ランキング表示用の「ViewRanking」というフォームを使います。

ちなみにCSVファイルの名前はわかりやすく「ranking.csv」とします。

CSVファイル作成

特に難しいことは無く、出力先のパスを決めてFireStreamからファイル作成するだけです。
※名前空間「System.IO」必須です。

usingを使うと、処理が終わったら勝手にDispose(破棄)してくれる上にコードがスッキリするのでとても便利です。
わかりやすく言うと、使った物を自動で元の場所に戻してくれるようなイメージ。

ランキングに登録

登録するデータは先程の通り「名前」と「スコア」です。これらは呼び出される時に引数からそれぞれ受け取ります。
CSVファイルはカンマ区切りで項目が分けられているので、「名前,スコア」のフォーマットでCSVに追記することになります。

また、CSVファイルが無いと何もできないので、存在しない場合はさっきのCreateメソッドを呼び出してファイルを作ります。

登録処理

登録フォーム

次にこれらの処理を実行するフォームを作成します。

とてもシンプルに、名前だけ入力して登録できるようにしています。ゲーム終了したらこの画面が表示されるようなイメージで。

順位取得

まず、CSVの中身をListに全部格納するメソッドを作ります。

 

次にCSVが格納されたListをスコア基準に降順でソートし、上から順番に引数のスコアとList内のスコアで比較します。
※ソートの部分でLinqを使っているので、名前空間「System.Linq」必須です。

List内のスコアより引数のスコアの方が高ければそこで順位が確定されます(13行目)。

 

ここまでの処理で取得した順位とスコアを表示するため、フォーム側に以下のコードを書きます。

別の画面からスコアを格納できるように、score変数はpublicにしています。
ゲーム画面側は未完成なので、とりあえず以下のデバッグ用乱数でスコアを代用します・・・。

これで実行すると、

スコアの値によって順位が変わるようになりました。

 

ちなみに、登録ボタンは最初に書いたregistScoreを引数込みで実行するだけです。処理を終えたらフォームを閉じます。

ランキングをフォームに表示

今回の本題です。

「フォームが開かれる→CSVを開く→中身をフォーム内の表に展開」の順に実行していきます。

フォーム

DataGridViewというコントロールで表っぽく表示する領域を作りました。見た目はプロパティでちょっぴり調整していますが、細かい部分なので割愛します。

CSV取得・表示

フォーム側のコードを書いていきます。
※ここでもLinqを使ってソートしているので名前空間「System.Linq」を忘れずに。

CSVを展開し、ソートして上から順番にDataGridViewへ追加しています。

適当にデータを入れて開いてみるとこうなります。


というわけでランキング完成です!

今までLinqは全然使っていなかったんですけど、SQL文みたいにいろいろできるみたいで便利そうですね。

次回までには全部完成させたいです・・・。