矢印をたどってゴールまで行くタイプの迷路があります。 任意の矢印の迷路を作るのは大変ですが、正方形や六角形のマス上で矢印を書いていくのは、比較的簡単に出来ます。 特に正方形のマス上で、斜めにも進めるようにすると、道がクロスするので、一見難しそうな迷路が出来ます。 但し、実際に迷路を解いて見ると、見た目ほど難しくないのです。
このような迷路は道が矢印になっただけで、迷路を作る時の考え方は道延ばし法と同じで作れます。 但し、矢印のないマスがあると見た目によくないので工夫がいります。 矢印のないマスは行き止まりを意味するので、行き止まりを作らない事が必要です。 1つのアイデアは、最初に答を決めてしまい、 行き止まりの道は答え以外の方向に矢印を向けて、矢印のループにする事です。 これ以外にも、スタート方向に矢印の道を戻すとか、うまい方法があると思います。
また、迷路の生成の都合でどうしようもない行き止まりが出来てしまう事があります。 こういう場合は、あきらめて無意味な矢印を書いておいてもいいかと思います。
もう一つ、この迷路で大事なのは、矢印を書く事です。
通常の単純な画像ルーチンは線や多角形を書く事はできても、矢印はないかもしれません。
矢印は線と三角形を組み合わせれば作れるので、座標さえ計算できれば書くことは簡単です。
以下に線の角度を元に座標計算して矢印を書く例を示します。
// 矢印を書く C++Builder6ソース void drawArrow(TCanvas *Canvas,TPoint from, TPoint to, int alowLen, int angle) { TPoint points[3]; double a = (double)(180-angle) /180.0*M_PI; double r = atan2((double)(to.y - from.y), (double)(to.x - from.x)); points[0] = Point( to.x + (int)((double)alowLen * cos(r + a)), to.y + (int)((double)alowLen * sin(r + a)) ); points[1] = to; points[2] = Point( to.x + (int)((double)alowLen * cos(r - a)), to.y + (int)((double)alowLen * sin(r - a)) ); Canvas->MoveTo(from.x, from.y); Canvas->LineTo(to.x , to.y ); Canvas->Polygon(points, 2); } |