迷路のデータ

もくじへ戻る


DRPG を作ろうとしているなら迷路のマップデータが必要だ.
どうやって用意するのかな?


ハードコーディングという手もあるが

必要なデータはすべてハードコーディング……うん.最も手っ取り早いという意味では良いと思う.

でも,できれば「データをファイルから読込む」にしていきたいという思いがある.

最初から全てをそうするのはきついけど,特に調整頻度が高そうなやつだけは最初から外部ファイルにしておきたい.
で,そういう調整が多そうなデータってのが,迷路の形(:マップデータ)なわけだ.


マップエディタとか言わない

【マップデータファイルが必要? そしたら「マップエディタ」みたいなのを作ろう!】とか言い始めるのは,初心者の行動としては極めて × であろう.
1つのプログラムを作るのに苦労している奴が2つのプログラムを作ろうとか,手に負えなくなるのは想像に難くない.

それに「マップエディタが完成するまで→ゲーム本体側は休止状態になる」ということになりそうなのが非常にまずい雰囲気だ.
初心者プログラミングで 「休止状態」はダメ,絶対 .再開しない率が150%だ.
150%というのは「モチベーションを失って終了→遠い将来に再開しようとしても今度はコードの意味がさっぱりわからなくてやめる率が50%」とかなんとかいう意味だ.

つまり「可及的速やかにデータだけを用意しろ」ということだ.
言い換えれば【「僕が考えた素敵な独自バイナリデータ」とか考えずに,今手元にある手段で作れるデータ形式でやれ】ということだな.
自分の場合,その条件に合致するデータ形式というと……

くらいだ.
前者も「2次元状にデータ値が並んだもの」だからマップデータの表現としては悪くないような気もするけど, プログラムで画像データを読込んでどうこうする実装が大変そうなので敬遠し,今回は後者を選ぶことにする.

データ形式は編集の利便性で決める

というわけで無事に「メモ帳で迷路かくよ!」という話になったので,具体的にフォーマットを考える.
必要なのは

後者が重要.
5A8600FD... みたいな謎の16進数らしきテキスト」とかでも前者は満たせるだろうが,そんなのをテキストエディタで頑張って入力する作業とか,やりたくないです,絶対.
サクッと作れてサクッと直せるような形式がいい.
(あと,読込の実装がなるべく楽な形がいい)

そんなわけで今回はこんな↓感じのフォーマットを考えた.

#########
# | X | #
#-###-+-#
# # # | #
#-#X#####
# | | | #
#########

これは,横方向4マス×縦方向3マスな広さの迷路のデータだ.
空白文字になってる部分がマスであり,マスとマスの間にある文字は,隣接する2つのマスの間に何があるのかを示している.
ここでは # は壁であり, X は扉のつもりだ.その他の文字( |- )の場合には「何もない=通れる」.

要はこんな↓マップだ.黒いところが壁で赤いのは扉.

このフォーマットだと,全くデータとして参照されない部分がかなりある.下図はそんな場所を * に書き換えたものだ.

*#*#*#*#*
# | X | #
*-*#*-*-*
# # # | #
*-*X*#*#*
# | | | #
*#*#*#*#*

この例だと 9x7=63 文字のうちの 20 文字がゲームのデータとして使用されない.
情報密度の薄さ(っていう言葉で合ってるかな?)に残念さがある気もするが, データの「見た目」を確保しつつそのへんの無駄を減らす良い方策は思いつかないからこれでOKということにする.
使用されない箇所の文字は何でもいい(プログラムがチェックしない)から.この * だらけの記述は先の記述と全く同じ意味のデータということになる.

外周をぐるっと取り囲んでいる壁についても「それはデータとして示さずとも自明では?」という気もするが, これも「見た目」重視で「あった方が良い」と判断した.

ファイルフォーマット

このような記述を読込む際には,先に迷路の広さがわかっている方がやりやすいので,

4 3
#########
# | X | #
#-###-+-#
# # # | #
#-#X#####
# | | | #
#########

みたいな感じでファイルの先頭側にサイズ情報を書いておくことにしよう.
1ファイルに複数階層分のマップを書くならこんな感じ↓とかでよかろう.

[MazeMapFileHeader]
//ファイルバージョン(拙い経験上,こういうのを入れとくと後で救われることがある)
Ver = 1

//広さ(4x3) で全2階層(話を簡単にするため,広さは全階層で共通)
Size = 4 3 2

//第1階層(B1)のマップ
[Map0]
#########
# | X | #
#-###-+-#
# # # |U#
#-#X#####
# | | |D#
#########

//第2階層(B2)のマップ
[Map1]
#########
# | | # #
#-+-+-#-#
# | | X #
#-+-+-#-#
# | | #U#
#########

この例では,上の階に移動できる場所を U, 下の階に移動できる場所を D としてある.
隣接階層間で UD の位置を対応させておく必要がありそうだが,それはデータ側で担保するということで良かろう.

第一階層にある U はスタート地点のつもりだけど,
これだと迷路の入り口の座標は示すことができるけども「迷路に入った際に向いている方角」は示せていないから情報不足感.
まぁそういうのは必要に応じて最初のセクションに追加すれば良いであろう.