ドットイートゲームとは、コンピュータゲームのアクションゲームのジャンルのひとつです。敵の追跡から逃れつつ、迷路内に敷き詰められた目標(大抵はドットで表現される)の上を通過することで消していくゲームです。パックマンはドットイートゲームの典型であるといえます。

今回は時間の経過とともに形状が変化する迷路でドットイートゲームをつくります。

迷路の生成

迷路はどうやって生成すればいいのでしょうか?

まず迷路の交差点になりうる頂点を用意します。それらの頂点を繋いだり繋がなかったりを切り替えることで迷路のようなものを作ることができるのではないでしょうか?

このような頂点を用意し、隣の頂点とつなぎます。その際に辺に重みを設定し、最小全域木を構築します。

最小全域木とは、重み付き無向連結グラフにおいて、全頂点を結びつつ閉路を含まず、辺の重みの総和が最小となる全域木のことです。

最小全域木はクラスカル法で構築します。辺の重みが小さいものから繋いでいくのですが、繋ぐことで閉路ができる場合は飛ばします。辺を繋ぐことで閉路ができるかどうかはUnionFind木を使って判定します。

UnionFind木とはグループ分けを木構造で管理するデータ構造です。ふたつの頂点がすでに同じグループに属するのであれば閉路ができることがわかります。

参考:
データ構造 Union-Find 木 蟻本読書会
グラフ理論 最小全域木問題 クラスカル法 蟻本読書会

最後に最小全域木の葉に該当する頂点を近くの頂点につなげることで閉路がある迷路を生成することができます。

HTML部分

HTML部分を示します。

style.css

グローバル定数

グローバル定数を示します。

index.js

Vertexクラスの定義

頂点を描画するために Vertexクラスを定義します。

Edgeクラスの定義

通路(頂点と頂点を繋ぐ辺)を描画するために Edgeクラスを定義します。

Playerクラスの定義

プレイヤーの状態の管理と描画のためにPlayerクラスを定義します。

Enemyクラスの定義

モンスターの状態の管理と描画のためにEnemyクラスを定義します。

UnionFindTreeクラスの定義

データ構造 UnionFind木を利用できるようにUnionFindTreeクラスを定義します。

続きは次回とします。