地味に便利な2次元配列管理クラス

こんにちは。プログラマーの尾関です。

今回は2次元配列を管理する便利なクラスを紹介します。

2次元配列は昔ながらのゲームを作る時、よく使われます。
例えば、パズルゲームの盤面やダンジョンRPGのマップなどです。

○×ゲームのデータ構造ダンジョンのデータ構造

このように、オブジェクトの情報がグリッド(格子状)に配置されるゲームの場合、情報を2次元配列にすると管理しやすいです。ただ、通常はこれを直接参照するのは危険なので、領域外アクセスのチェック処理を挟みます。

とはいえ、2次元配列を定義するたびに、このようなチェック処理を毎回書くのは面倒なので、私はArray2Dという自作の便利クラスを使っています。

■Array2D.h

■Array2D.cpp

もともとこのクラスは私が趣味でゲームを作るときに使っていたものですが、社内でパズルゲームを作るときに「これを使うと便利だよ」とこのコードを渡したら、意外に評判が良かったので、それなりに使いやすいのでは……、と思っています。

使い方の例は以下のとおりです。

Array2D::Set() 関数では、XY座標を指定し、3番目の引数に設定する値を指定します。
値の取得は Array2D::Get() 関数を使用します。

設定されている値をデバッグ出力して確認する場合は、Array2D.Dump() を使います。

■出力結果

視覚的にわかりやすいので、この出力機能もなかなか便利だと思います(自画自賛)
あと、すべての値に対して何らかの処理を行う場合には、Array2D::ForEach() を使うと、関数ポインタを渡してまとめて処理をすることもできます。
C++11が使える環境であれば、ラムダ式を渡せます。

forループを書く必要がないので、簡潔な記述になりますね。

また、このクラスでは、XY座標系とは別にインデックス座標系を用意しています。
インデックス座標系とは、私の造語ですが、通し番号で各要素にアクセスするためのものです。

インデックス座標系

このインデックス座標系は一見、不要に思えるのですが(XY座標系の方が直感的なため)、実際に配置するオブジェクト情報を1次元配列で管理する際に、相互に連携するためのキーとして使うことがあります。
例えば、マップの配置情報はこのArray2Dで管理し、実際に配置するマップチップモデルは1次元配列で管理する、などです。

他にもゲームで使うと便利な関数も用意しています。

  • Array2D::Count(int v) : vに一致する値の存在数をカウントする → 配置したコインをすべて回収したかどうかの判定など
  • Array2D::Fill(int v) : vに指定した値をすべての要素に設定する → 0以外で初期化したい場合に使う
  • Array2D::Swap(int x1, int y1, int x2, int y2) : 値を交換する → 「パネルでポン」のようなブロックを交換するゲームで使う

ということで、2次元配列を便利に扱えるクラスの紹介でした。

なお、今回紹介したコードは自由に使っていただいて構いませんが、運用した結果については保証いたしませんので、各自の責任で利用をお願いします。

Tweet about this on TwitterShare on Facebook0Share on Google+0

コメント投稿は締め切りました。