成果物
四角形
六角形
三角形
仕組み
指定した場所からスタートし、まだ行ったことがなくて進める方向に、壁を壊しながら進んでいくという仕組みです。どこにも進めない場合は、前にいた場所に戻ります。これほどシンプルなコードで、深さ優先探索で全て塗りつくせるようになっています。なぜこうなるのか、考えてみると面白いですよ。
作り方・コード
全てのコードは、こちらに含まれています。
STEP1(四角形の迷路自動生成)
プログラムの難易度は次のようになっています。三角形は上下反転があるのでややこしいです。
四角形<六角形<三角形
それでは、まず、CodingTrainの解説を見て、四角形の迷路生成アルゴリズムの仕組みを理解してください。
STEP2(多角形の表示プログラム)
次に、今回使う多角形を表示するプログラムのデモを見てください。Processingのデモコードは、Polygonという名前です。
多角形の面を描画するにはpolygon関数を使います。
polygon(x, y, n, r, invY,rot)
横倒しが標準ですが、今回は、縦にしたいのでrotには-90度にしています。invYは、-1で上下反転です。普段は1でいいです。
多角形の壁(辺)を描画するにはpolygonLines関数を使います。
polygonLines(x, y, n, r, invY,rot,walls)
wallsがtrueの時、辺が描画されます。インデックスは、時計回りに割り当てられていて、今回は、-90°回転させているので、一番上の頂点から割り当てられています。wallsの要素の数が、辺の数だけ必要なことに注意してください。
STEP3(六角形のプログラム)
進める方向が6つに増えています。偶数列、奇数列で配置がずれるので、奇数列の時一つ左側のマスを選択するようになっています。詳しい数式は、ページの一番下に改定あります。ProcessingのコードはMazeHexagonです。
STEP4(三角形のプログラム)
規則的に三角形を反対にしなければなりません。ページの一番下で紹介しているinvTest()が-1の時上下を反転させ、さらには、場所をそろえるために、少し上に動かさなければなりません。別の方法で、三角形を描画するのもいいと思います。ぜひ、いろいろな方法を試してみてください。ProcessingのコードはMazeTriangleです。
BONUS(具体的な数式)
今回は、四角形も三角形も六角形も横幅(w)が同じになるようにしています。
iが配列の横の番号、jが配列の縦の番号として、座標x,yと半径rを求めるには、六角形の場合。
今回は、画面からはみ出ないように座標にオフセットを足しています。列によってxoffは変わります。条件式は、満たしたときのみ、その式が実行されると思ってください。
三角形の場合は、
invTestは偶数列、偶数列、もしくは、奇数列、奇数列の時に1を返しそれ以外では-1を返すというものですが、コンパクトな数式で表すとこうなります。また、オフセットは次のようになります。
うーん、難解!!
パフォーマンス
4K、w=100の時
四角形:1:10
六角形:5:25
三角形:13:36