今作っているドットイートゲームでスコアを記録する機能を作りたくなり、CSVファイルにスコアを読み書きして管理するシステムを作りました。今回はそれについて書きます。
はじめに:CSVとは
CSVはカンマで区切られたデータのことです(例:0,1,2)。単なるテキストデータなのでエクセルのほかテキストエディタでも扱えますし、もちろんウディタでも読み書きすることができます。
CSVでデータを管理するメリット
今回ウディタのセーブ・ロード機能ではなくCSVでデータを管理しようと思った理由は以下の通りです。
- コモンを組むとき、セーブデータよりも直感的に操作できる
- データベース⇔CSV間のやりとりが楽
まず、ウディタのセーブファイルの操作って難しくて未だによく分かりません。なのでCSVを操作する方が分かりやすいと思ったのと、「DB操作」コマンドから直接読み書きができるので便利だなと思ってCSVを採用しました。
もちろん、ゲームごとの進捗状況を記録したい場合はセーブ・ロード機能を使わないと大変だと思いますが、今回は最終的なスコアと日付だけが分かればよかったのでこの方法でもOKなのです。CSVでの管理法はこのように「個々のセーブでは管理できない、ゲーム全体のデータ」を簡易的に管理したいときに便利だと思います。
CSVによるスコア管理システムの仕様
- 可変DBにタイプ「スコア情報格納」を作成し使用する。
- スコア管理システムは次のコモンイベントで構成される。
- スコア入出力コモン
- スコアデータ作成コモン
- ハイスコア検索コモン
- スコア入出力コモンは、CSV⇔可変DB間のデータの読み書きを行う。
- スコアデータ作成コモンは、今回のスコアと日付を可変DBの末尾に追加する。
- ハイスコア検索コモンは、可変DBのスコアから最も高いスコアを抽出し、そのデータ番号を返却する。
- 処理の流れは「CSVからDBへ入力」→「スコアデータ作成」→「DBからCSVに出力」→「ハイスコア検索」→「スコア画面描画処理(※ここでは割愛)」とする。
コモンイベントの内容
スコア入出力コモン
■条件分岐(変数): 【1】 CSelf0[モード] が 0 と同じ 【2】 CSelf0[モード] が 1 と同じ -◇分岐: 【1】 [ CSelf0[モード] が 0 と同じ ]の場合↓ |■可変DB書込:[タイプ スコア情報格納(29) を初期化] |▼ |■CSVファイルからDBに読込: ファイル "〇〇.csv" → 可変DB[スコア情報格納:0](スコア情報格納 : ) から [CSelf1[読込データ数] データ] |■ -◇分岐: 【2】 [ CSelf0[モード] が 1 と同じ ]の場合↓ |■DB読込(可変): CSelf10[書き込みデータ数] = 可変DB[タイプスコア情報格納(29)のデータ数] |▼ |■DBからCSVファイルに保存: 可変DB[スコア情報格納:0](スコア情報格納 : ) から [CSelf10[書き込みデータ数] データ] → ファイル "〇〇.csv" |■ ◇分岐終了◇
スコアデータ作成コモン
▼ ▼ データ取得 ■変数操作: CSelf11[年] = Sys77:現在の[年] + 0 ■変数操作: CSelf12[月] = Sys78:現在の[月] + 0 ■変数操作: CSelf13[日] = Sys79:現在の[日] + 0 ▼ スコアの追加位置=データ数 ■DB読込(可変): CSelf14[データ追加位置] = 可変DB[タイプスコア情報格納(29)のデータ数] ▼ ▼ 文字列作成 ■文字列操作:CSelf6[日付] = "\cself[11]/\cself[12]/\cself[13]" ▼ ▼ 書き込み ■可変DB書込:DB[ スコア情報格納 : CSelf14[データ追加位置] : スコア ] (29 : - : 0) = CSelf0[スコア] ■可変DB書込:DB[ スコア情報格納 : CSelf14[データ追加位置] : 日付 ] (29 : - : 1) = CSelf6[日付]
ハイスコア検索コモン
■DB読込(可変): CSelf10[データ数] = 可変DB[タイプスコア情報格納(29)のデータ数] ▼ ■変数操作: CSelf11[カウンタ] = 0 + 0 ■変数操作: CSelf13[ハイスコア] = 0 + 0 ▼ ■回数付きループ [ CSelf10[データ数] ]回 |■DB読込(可変): CSelf12[スコア] = 可変DB[ スコア情報格納 : CSelf11[カウンタ] : スコア ] (29 : - : 0) |▼ |■条件分岐(変数): 【1】 CSelf12[スコア] が CSelf13[ハイスコア] 以上 |-◇分岐: 【1】 [ CSelf12[スコア] が CSelf13[ハイスコア] 以上 ]の場合↓ | |■変数操作: CSelf13[ハイスコア] = CSelf12[スコア] + 0 | |▼ | |■変数操作: CSelf14[ハイスコアのデータ番号] = CSelf11[カウンタ] + 0 | |■ |◇分岐終了◇ |▼ |■変数操作: CSelf11[カウンタ] += 1 + 0 |■ ◇ループここまで◇◇