迷路にハマった!

最近、迷路にハマっている。特に迷路のアルゴリズムが面白い。何か、アルゴリズムを活用できる分野があると思うのだが。。。

壁の厚さを変えて絵を描く

自動的に、迷路絵を描く手法としては、海外のサイトに面白いものがあった。

 

実際、プラグインの問題で、私自身はそのツールを試していないのだが、完成した迷路の図を見ただけで、仕組みは大体わかった。

 

また、日本で有名なアイドルの写真を使って、その迷路を作っている人がいて、その画像を偶然見つけたので、ツールの完成度が高いことがよくわかった。

 

迷路絵とはいっても、正解の道が絵になる類のものではない。

 

白黒の写真をもとに、濃度を計測し、濃度が濃い場所の迷路の線を太くする。

 

それだけである。

 

そうすると、迷路は白黒のイラストのようになる。

 

だが、写真がしっかりと浮き出るようにするには、かなり細かいグリッドにする必要がある。

 

そうなると、もう迷路としては機能しなくなるはずだ。

 

面白いアイデアではあるが、あまり役に立たないなと感じた。

 

やっぱり、自動化を考えるとなると、輪郭をスキャンして、その内部を迷路化するってのが、一番、楽しめる迷路を作りやすいのではないかと感じた。

絵が浮き出る迷路が意外に難しい

絵が浮き出る迷路について調べた時期があった。

 

結局、手書きが一番きれいにできそうな気がして、自動生成には不向きな印象。

 

問題は、絵が出る迷路を本当に楽しむ人がいるのかってこと。

 

まず、プリント迷路の場合、一度、迷路をやって、ゴールした後、マジックなどで、再び、正解の道だけをなぞる必要がある。

 

その点、ネット上でやる絵が出る迷路の場合、正解路だけを塗りつぶしてくれるので、絵が出やすい。

 

それで、絵が浮き出るようにするにはどうすればいいのかってこと。

 

どこかの大学生か大学院生の真面目なレポートがネット上で公開されていた。

 

その人の方法によると、まず、適当なドット絵を描いた後、その絵の中に迷路を生成してしまう。(レポートの著者は専門用語で表現していたが、図の中に、道のばし法で迷路を作成するのと同じこと。)

 

この状態では、一筆書きになっていない。

 

この時、壁だと思って、右で手法で、歩き続けると、いずれ、元の位置の戻る。

 

その時、歩いた経路に線を引くと、その形は、最初の絵を少し大きくした感じになっている。

 

かなり、経路が長くなって、実用的ではないが、絵が出る迷路を自動的に作成するのは可能だということだ。

 

だが、絵を優先させて、無駄に長い正解路を作るのは、迷路の楽しさが半減するだけに思える。

外枠の形を自動的に作る

自動生成迷路の印象が悪いのは、何と言っても、外枠の形状。

 

殆どが正方形。

 

たまに長方形がある程度。

 

ただでさえ、道が、直角に曲がるだけで面白くないのに、外枠まで四角だと退屈。

 

道のばし法や壁のばし法を採用した場合、矩形でなくても、正方形のマスが組み合わさっていれば、簡単に迷路を自動生成できるんじゃないだろうか。

 

だが、その外形を作り出すのが手書きってのは、格好悪い。

 

大きめのドット絵を作るプログラムを書いてしまえばいいのか。

 

それほど難しくないと思う。

 

白い背景に黒色で描かれた単純な図があるとする。

それをドット絵にするのは実は簡単なんじゃないだろうか。

 

まず適当にグリッドを作ってしまう。

 

そして、そのグリッドの中点の座標の色をチェックするだけ。

もし、黒ならば配列に1を代入。

それだけで、ドット絵の輪郭ができてしまう。

 

あとは、迷路アルゴリズムを採用すればいいだけか。

 

頭で考えているだけだと意外に簡単に思える。

 

だが、結局、外枠がギザギザだとあまり美しくない。

 

迷路を作成した後で、元の絵の輪郭線と結合させるのがベストか。

 

そうなると、最初の段階で、輪郭線だけの画像と、塗りつぶし画像を準備する必要があるのか。

 

それとも、輪郭線だけを抽出する方法があるのか。

 

もう少し調べる必要がありそう。

迷路アプリと類似アプリ

迷路にハマった後、グーグルプレイで、迷路系アプリをダウンロードしまくった。

 

どんな感じで迷路を楽しむのか知りたかったからだ。

 

結果として、迷路等名がついているアプリは全く楽しめる代物ではなかった。

 

まず、迷路ゲームの一番の問題点は、スマホの画面が小さいこと。

 

もし、画面に収まる大きさの迷路をつくったら、道がごちゃごちゃの迷路になってしまう。

 

だから、多くのアプリは画面の一部のみを表示し、経路の移動とともに画面を動かすようにしていた。

 

画面の一部しか見えないものだから、紙にプリントした迷路と違って、大人でも、すぐには解けなくなるというメリットがある。

 

しかし、大人の多くは、簡単な迷路を単なる操作性の悪さのために、ゴールできないだけという印象を持ってしまう。

 

結局のところ、大人向けではない。

 

だからといって、子供が喜ぶかというとそうでもないと思う。

 

まず、操作がしにくい。画面を大きくしたとしても、結局、曲がりくねった道をタップで移動させるのは、イライラがたまるだけだ。

 

結局、迷路という名がついているアプリの開発者は、一般書籍に載っていそうな迷路の作り方をそのまま使って、単にデザインを美しくした程度のものだけしかなかったという印象。

 

それでも、ダウンロードされまくっている作品があるのは意外だが。

 

たしかに、敵のキャラとかが出てくるようにすると、ゲームを始めたばかりの世代の子供たちは喜ぶのかもしれない。

 

なんだか、不満をたらたらと書いてしまったが、迷路アルゴリズムを応用して作れそうな面白いアプリもあった。

 

玉転がしゲームなんてその典型。

 

迷路と違い、迷う路は必要ない。

 

一本しかない路に穴を沢山あけ、それをよけながらゴールする。

 

スマホを傾けたり、玉を空中に浮かべるために揺らしたりするのが楽しい。

 

だが、基本は、迷い道が不要なのでアルゴリズムをいかせるわけではない。

 

アルゴリズムを活かせそうなのは、チクタクバンバン形式のゲーム。

 

玉が転がりだして、その経路を作り出す。

 

これは、迷路アルゴリズムの応用でイケそう。

迷路の正解路を作るアルゴリズムを応用すればいい。

 

だが、少し違うのは、十字路の扱い。

 

十字路は基本的に右折と左折ができない。直進するのみ。

 

直進した後、カーブのマスを組み合わせて、再び、別の経路から十字に玉を入り込むようにする。

 

でもこの程度のアルゴリズムなら簡単にできそうだ。

 

あとは、水道菅をつなぐアプリも迷路アルゴリズムの応用といえそう。

 

左右に水道管をつなぐことで、水を流し込むものだが、基本的には、チクタクバンバン形式と同じ感じ。

 

ただ、ビジュアル的にチクタクバンバン形式の方がオシャレなものが多く面白かった。

 

有名プロバイダのサイトでさえも迷路のルールを理解していない

迷路アルゴリズムにハマってから、いろいろな迷路サイトをチェックしている。

 

海外、日本の両方。

 

でも、日本の迷路は異質だと思う。

 

なぜか、正解の経路が複数存在するものを迷路として、公開しているサイトが多いのである。

 

海外のサイトではあまり見かけない。

 

正解の経路が2つ以上存在するというのは、4択の試験問題で、1つ選ばないといけないのに、正解が2つ以上存在してしまっているようなものだ。

 

しかし、迷路を作成しているイラストレーターは迷路の作り方なんて考えたことも無いのだろう。単にイラストを描いて、いくつか道を書くだけの迷路しか作れていない。

 

迷路というキーワードで検索して、上位にヒットする、有名プロバイダのサイトがあった。

 

かわいらしいイラストの迷路が公開されていたのだが、その迷路も、正解路が複数存在してしまっている。

 

たぶん、イラストのイメージを優先させるために、正解路を複数存在させるひつようがあったのだろうと思った。

 

でも、自分で、イラスト系の迷路を作成してみて分かったのは、やっぱり、正解路を複数設定する必要はないという点。

 

結局のところ、迷路の正解路が複数あっちゃいけないというルールを迷路作成者が知らなかっただけなのだとおもう。

道のばし法と壁のばし法の比較考察

迷路を自動生成しているサイトの多くは、道のばし法を通貨っていると思う。

 

なぜ、壁のばし法ではだめなのだろうか。

 

たとえば、クラスタリング手法は、道のばし法と同じような方法であるが、クラスタリング手法の迷路を提案しているサイトには、絵が浮き出る迷路に応用できると書かれていた。

 

迷路にハマったばかりの頃は、素直に、クラスタリング手法は絵が出る迷路も作れるんだ。。。スゲーな。と思っていた。

 

でも、迷路の自動生成プログラムを複数つくってみた今考えてみると、絵が出る迷路はクラスタリング手法でなくてもできる気がする。つまり、道のばし法でなくてもできる気がする。

 

確かに、頭の中で考えるときは道のばし法で考えたほうが理解しやすい。

 

正解の道を最初に作り、その道を分岐させるように、道を作り出していく。

 

だが、棒倒し法だって、壁のばし法だって、最初に道として設定して、壁を作り始めることは可能ではないのだろうか。

 

まだ、実験していないので何とも言えないが、壁のばし法の方が、実は迷路作成に向いている気がする。

 

道のばし法で迷路をいくつか作成してわかったのは、左上からスタートして右に直進、その後、右上で向きをかえ、一番下まで直進といった、単純な迷路がたまに生成されてしまうこと。

 

もし、壁のばし法ならが、かならず、外周の4辺から壁を延ばすようにせっていするだけで、このような単純な迷路を回避できるはずだ。

 

もちろん、道のばし法の場合も、例えば、最初にスタートからゴールの道を書くようにして、その時、うまく、単純な経路ができないようにすればいいのだが、コードで書くとなると意外に面倒くさそう。

 

それなら壁のばし法の方がいいのではないか。

 

実は、自動生成迷路をいくつか作ってみたが、壁のばし法だけは作ったことが無かった。

 

たぶん、ネット上でも、わざわざマイナーな手法である壁のばし法で迷路を作っている人はあまりいないんじゃないだろうか。

 

とりあえず、試してみたほうが良さそうである。

クラスタリング手法は一見すごそうだが・・・

迷路にハマったばかりの頃、迷路のアルゴリズムをネットでひたすら調べまくった。

 

まだ、プログラミングの初心者だったので、わかりやすいサイトを見つけるのに苦労した。

 

コードだけ提示されても、当時は理解できなかったからだ。

 

基本的に、迷路作成のアルゴリズムといえば、棒倒し法、道のばし法(穴あけ法)、壁のばし法の3つである。

 

それについては、詳しく書かれた本があったので、理解を深めることができた。

 

だが、ネット上では、クラスタリング手法なる迷路の作成方法が公開されていた。

 

正確には覚えていないが、どこかの知識人(たぶん大学の人)が書いた真面目なサイトだったと思う。

 

クラスタリングなんて、普段聞きなれない言葉が使われているだけで、なんだか、高度な迷路をつくれそうな気がした。

 

でも、少しプログラミングに慣れてきたときに、そのサイトを再びチェックしたら、なんのことはない、道のばし法と同じ内容だった。(私はそう感じた)

 

私の場合、道のばし法の説明方法のほうが、素直でわかりやすい気がした。

 

ただ、話はここで終わらない。

 

私が購入した本では、棒倒し法と道のばし法と壁のばし法が解説されていたのだが、その本の著者も結局は、道のばし法を推奨しているようだった。少なくとも、乗っていたコードは道のばし法だけだった。

 

そうなると、クラスタリング手法、壁のばし法が迷路作成のもっともすぐれた手法のように感じてしまう。

 

私自身、つい最近まで、道のばし法こそが迷路作成のもっともすぐれた手法だと考えていた。

 

確かに、棒倒し法より道のばし法の方が優れているのは確かだと思う。

 

棒倒し法の欠点については他のページで述べた大利である。

 

しかし、道のばし法は本当に、壁のばし法よりも優れているのだろうか。

 

話が長くなったので、続きは次回の記事に書くことにしよう。