こんにちは、ゆたかみわーくです。

少し前に【小学校プログラミング教室】の記事でもご紹介したGoogleのBlockly(ブロックリー)には、Blockly Games(以下ブロックリー・ゲーム)という、ブロックリーでプログラミングを学習するためのお題となるゲームを集めたサイトがあります。

【何するの?】2020年からの小学校プログラミング教育

ブロックリー・ゲームには次のゲームが用意されています。

  • パズル
  • 迷路
  • タートル
  • 動画
  • 音楽
  • ポンド・チューター
  • ポンド

これらのゲームを通してブロックリー・ゲームでは、次のことを学ぶことができます。

  • ブロックリーの基本
  • ループ処理
  • 条件分岐
  • 数式の利用
  • 関数の利用
  • JavaScript

そんなブロックリー・ゲームの中で最初の壁として立ちはだかる難問が「迷路」の「レベル10」になります。

プロでも最初は少し手が止まってしまう問題なのではと思ってしまう難易度の迷路ですが、今回はこの問題を解いていきたいと思います。

とはいっても、実はこの答えってググると同じ答えが結構出てきます。

ズバリ、その答えは次のものになります。

ところが、この答えだとご覧の通り、なかなかの遠回りしてゴールに辿りついているので、今回は最短ルートでゴールに行くことができる別の答えを作ってみます。

【難問?】グーグルのブロックリー・ゲームの迷路 レベル10を解く。最短ルート編。

こういった処理を作る時のポイントは、やはり共通点を見つけることにあると思います。

まずは共通点を探して、それを解決できる手段を考えましょう。

共通点を探してまとめる

ズバリ、この迷路のポイントは「曲がり角」ですよね。

まずはこの迷路曲がり角がどうなっているかを見ていきましょう。

最短ルートをたどる場合、通過しなければならない曲がり角は5つになります。

それぞれの曲がり角を言葉で書くと次の通りになります。

  1. 前と左に行くことができて左に曲がる角
  2. すべての方向に行くことができて右に曲がる角
  3. 前と左に行くことができて左に曲がる角
  4. 左右に行くことができて左に曲がる角
  5. 右にしか曲がれない角

さて、この5つの曲がり角、難しいですが、次のように3つにまとめられると思いませんか?

  1. 前に進めるけど左に曲がるべき曲がり角(赤枠
  2. 前に進めるけど右に曲がるべき曲がり角(青枠
  3. 前に進めなくて左右のどちらかに進むべき曲がり角(緑枠

さらにまとめると次のようになります。

  1. 前に進めるけど左右のどちらかに進むべき曲がり角(赤枠
  2. 前に進めなくて左右のどちらかに進むべき曲がり角(緑枠

このように、共通点を探してシンプルにしていくことで、条件分岐の要素を探していきます。

すると上記の2つでは、まずは「前に進めるかそうでないか」という点が条件分岐の最も上位のポイントに上がってくることが見えてくると思います。

共通点をプログラムに落とし込む

では先の項でまとめた共通点をプログラムに落とし込んでみましょう。

まずはもちろん「ゴールまでの繰り返し」の中で「前に進むことができるか、それ以外か」です。

続いて、前に勧める場合のみに着目すると、2つ目の曲がり角は「すべての方向に進むことができる」状態であり、その中で右を選ぶことを優先しなければならず、3つ目の曲がり角では右は行き止まりで左に進みます

この2つの曲がり角を攻略することを考えると「まず右を確認して進めるならば進み、ダメだったら左に進む」というパターンを作ることができます。

では次はそもそも前に進めなかった場合を見てみましょう。

  • 左右に行くことができて左に曲がる角
  • 右にしか曲がれない角

これは上の曲がり角がポイントですね。

右に曲がることができるけど、曲がってはいけません。

しかし、迷路のオブジェクトでは「してはいけない」というような選択肢は用意されていないため、ここは先に「左に曲がることができたら左に進む」ことを決定して、それで「左に曲がることができなかったら右に行くように」します

ここまでをプログラムに落とし込むと、ブロックリーは次のように組まれることになります。

もちろん、前進しなければいけないので、できる/できないの判断の後に、最終的に向いている方向に1歩進むようにします。

動かしてみましょう

さて、では作ってみたプログラムを実行した結果を見てみましょう。

遠回りをすることなく、一直線にゴールに向かえるようになりましたね。

条件分岐が増えた分、JavaScriptの行数は増えましたが、道を間違えることがなくなったのでスッキリしました。

他にも探せば答えはあるかと思いますので、面白いと思ったら、ぜひ違う方法にもチャレンジしてみてください!

この記事は以上となります。

最後まで読んでいただきありがとうございました。