4歳の息子(左)が迷路にはまっている。
きっかけはコロナだった。園で陽性者が出たということで、長期休園が確定。そこで、ひまつぶしにと、迷路を買ってあげたのだ。息子はとても喜んだ。それはよかったのだが、ひとつ誤算が。なんと息子は、一夜にして全面クリアしてしまったのである。
まさかここまではまるとは…明日からどうすんねん。
いや…待てよ。迷路くらい、作れそうだな、プログラムで。
というわけで、今回の企画は「父、迷路をつくる」です。
捕捉情報
3歳の次男(右)にも迷路を買ったものの、1ページも完成させず、飽きてました。粘土の方が好きみたいですね。兄弟でここまで違うとは!
「なんとなくプログラミングで作れそうじゃね?」くらいのノリで始めてますので、具体的にどういうプログラムを組んだらつくれるのか、現時点ではノーアイディアです。そこで、まずはググります。
実際の業務でも似たようなことはよくあります。なんとなくできそうだな→ググる→できそうorできなさそう
結果的に、できなさそう、で終わることも十分にあるわけです。まあ、たいていのことは、すでに世界の誰かが先にやってるので、調べればヒットします。
今回は、このサイト↓
https://news.mynavi.jp/techplus/article/nadeshiko-61/
にそれっぽいことが書いてあったので、「できそう」判定で、参考にします。
かんたんにまとめると…
1)ボンバーマンっぽく周りをブロックで囲む
2)ボンバーマンっぽく適度にブロックを置く
3)ボンバーマンっぽくランダムにブロックを置く
なるほど!どうやらボンバーマンのノリでいけそうです(めちゃてきとう)!
はい!まずはいわゆる、フツウガステキ状態をつくります!
フツウガステキ状態を知らない人のために説明すると、ボンバーマンのバトルフィールド名です!ここまで言ってもピンとこない人はググってください(不親切)。一番オーソドックスで、なんだかんだ、一番盛り上がるステージですよね!
一応、コードも載せておきます。まあ、興味ない人が大半でしょうから、コードの説明は割愛します。なんとなくやりたいことを汲んでください。
各ブロックの上下左右に対し、ランダムに1ブロックずつ置いていくと、迷路っぽい感じになるようです。
はい!実際、迷路っぽくなりました!
どんどん迷路っぽくしていきましょう!
スタートとゴールをつくります!
ぐっと迷路っぽくなりましたね!いったんここまでで完成とします!
捕捉情報
完成までに要した時間は、40分です。これがはやいか遅いか…なんとも言えませんが、迷路を本屋やおもちゃ屋に買いに行くくらいなら、作ってしまった方がはやい!ということだと思います。
完成した迷路を、息子たちに解かせてみます。
なかなか楽しそうに解いてくれて、父としては満足!
と言いたいところですが、ここで何かがおかしいことにきづきました。この迷路、どこからどう辿ってもゴールに辿り着けます(笑)
本来、あるべきはず「行き止まり」がないんです。これでは迷路としては欠陥です(次男はそれでも楽しそうでしたが…)。
これがプログラミングの醍醐味と言いますか。課題があり、その課題を解決するためには、どうしたら良いか、考えるわけです。
今回の僕のひらめきは、ランダムなブロックを1個ではなく、2個に増やすという単純なものでした。
ブロックを増やしたら行き止まりができるだろうから、良い感じになるだろう、と。ロジックはいったん考慮しない、試しにやってみる系のノリです。
さて、結果はというと、行き止まりすぎてダメでした。
なるほど。ではブロック数を少し減らしてみましょう。
※ちなみに今回から枠数を41×41に増やしています。
その結果…若干良くなりましたが、まだまだ行き止まりすぎです。
もうちょい減らしてみましょう。
お!これは!!と一瞬、思いましたが、惜しい!スタートとゴールがつながっていません。
あなたの次の一手は、どうしますか?
もっとブロックを減らす?
このくらいなら、何度かリロードすれば良い迷路ができそうだと思ったので、リロードしまくることにしました。
昔、駄菓子屋に売ってた10円ガムで、迷路にゴールできたら当たりってのがあったんですね。あれを思い出しました。
ゴールできれば当たり。当たる確率は、10〜20%くらいなのかなぁ?当たりの迷路を貼っておきます!
ちなみに、かなりどうでも良い話ですが、くだんの10円ガムの当選確率を調べた人がいましたので、こちら読んでみてください。僕の記憶だと迷路にゴールできたら当たりのイメージだったんだけど、実は関係ないということがわかりまして、個人的にはめっちゃ良記事でした!
捕捉情報
ボンバーマンといい、10円ガムといい、今回はやたら昭和臭が漂う記事でした。いやーでも、めちゃくちゃしっくりくる例えなんですよね…どうしても言いたくて!世代じゃない人、ごめんなさい!!
今回、僕はパワープレー的に解決策を見出しましたが、当然、ほかにも解決策はあります。
仮に要件が「100%ゴールまで辿り着くこと」だった場合、そして仮にこれが仕事だとしたら、どうにかして、この課題を解決せねばなりません。あなたならどうやって課題を解決しますか?
1分程度考えてみました。
【案1】
スタートからゴールまで辿り着けるかをプログラミングでテストしてみて、辿り着けない場合、再度、新しい迷路を作る。辿り着けるものができるまでそれを繰り返す
【案2】
スタートからゴールまで辿り着けない場合、ブロックをひとつずつ壊してみて、辿り着けるかテストする。壊すブロックの数はなるべく少ない方が良いだろうから、総当たりで全部のパターンを試す
【案3】
そもそも迷路の作り方を変えてみる。たとえばスタートからゴールまでの道筋を先に決めてしまって、ブロックをあとから追加する(その道筋には絶対にブロックを置くことができない)
パッと思いついたところでこんなもんでしょうか。
自分で言うのもアレですが、わりと良い発想だと思います。こんな感じで解決策をパッと思いつける人は、エンジニアの素質があると言えるでしょう!
ちなみに写真は次男がつくった迷路だそうです。スタートとゴールがどこだかわからん!まあとにかく、発想を柔軟にしていこうぜ!ってことですね!!