OpenGL で 3D迷路(Ruby)

以前、平面の迷路の中を歩いてみるようなプログラムを作りましたが(参照)、今回は迷路も立体にしてみました。検索するとよくある、平面の迷路を立体視した「3D迷路」ではなく、迷路そのものが立体なのです。3D迷路を歩くとでも申しましょうか。デフォルトで 3×4×5 の大きさの迷路ですが、任意の大きさにできます。
20180712045608 20180712101539
20180712101537 20180712045606
 
Ruby + OpenGL で実装しています。Ruby 2.3.3, Linux Mint 18.3 で確認しました。Windows では動かないと思います。Linux への OpenGL のインストールはこちらを参照して下さい。コードは以下にあります。
3D maze · GitHub
3d_maze_walk.rb を実行して下さい。Gem は OpenGL 関係のもの('opengl', 'glut', 'glu')が必要です。また、自作の OpenGL ライブラリ 'miniopengl.rb' をカレントディレクトリに置いておいて下さい。


キー操作は迷いましたが、カーソルキーの左右で xy平面内の回転をします。カーソルキーの上下で、視線方向はそのままで上下(z軸方向)に移動します。スペースキーで前進。
常に真上が z軸の正の方向で固定されています。
スタート地点は原点からもっとも遠い位置です。ゴールは原点で、上の画像のごとく白い球が置いてあるので、その位置まで来たら 'e' キーで終了します。また、位置把握があまりにもむずかしいので、移動するたびにコンソールに位置を表示しています。これが [0, 0, 0] になるように移動して下さい。

実行のたびに新たな迷路が生成されます。ソースの x, y, z = 3, 4, 5 を変更すればどのような大きさの立体迷路でも作れますが((20, 20, 20) くらいが限界でしょうか)、既にこの大きさでもゴールするのはかなりむずかしいと思います。迷路生成のアルゴリズムここで使ったのと同じで、これを3次元にしただけです。ルートはひと通りしかありません。また、すべての場所に(唯一のルートで)行くことができます。壁は少しだけ透けて見えるようになっています。


迷路生成のバグがなかなか取れなくて、普段は書かないテストを書くはめになってしまいました。テストなしではちょっとむずかしかったと思います。やることはわかっていたにもかかわらず、コーディングには丸々一日かかってしまいました。

キー操作に慣れて自由に動きまわることができるようになると、ゲームとしても結構おもしろいと思います。


obelisk.hatenablog.com