CHaser解説(Blockly編)

資料

チュートリアル解答例集

⚠️ ネタバレ注意

このページには全ステージの解答例が掲載されています。自分で組んだプログラムと見比べたいときに開いてください。

第2部では、いくつかの代表的なステージだけを取り上げて「解答例」を詳しく解説してきました。この付録では、チュートリアルのステージ1〜9(1-1〜9-3、全39ステージ)について、実際にクリアしたときのBlocklyプログラムを1つずつ掲載します。

どのプログラムも「これが唯一の正解」というわけではなく、あくまで一例です。目標ブロック数より少ないブロック数でクリアしている場合もあれば、目標ぎりぎりまでブロックを使っている場合もあります。自分が組んだプログラムと見比べて、「同じ考え方で組めているか」「もっと少ないブロックで組めそうか」を確認する材料として活用してください。各ステージの見出しには、そのステージの目標ブロック数と、実際に使われたブロック数を「(現在/目標)」の形で添えています。

ステージ1 移動(1-1〜1-4)

本文第2部1章に対応します。基本の移動ブロックを使う練習です。

1-1 キャラクターを移動させよう1(2/3)

解答例を見る
1-1 解答例
1-1 解答例

「上方向に移動する」ブロックを2つ並べるだけの、もっとも単純な形です。目標の3個より少ない2個でクリアしており、必要最小限の手数で目的地に着けることがわかります。

1-2 キャラクターを移動させよう2(2/3)

解答例を見る
1-2 解答例
1-2 解答例

1-1と同じく2ブロックの構成ですが、進む方向の組み合わせが異なります。フィールドの形が変わっても、考え方は「アイテムまでの最短の道筋を、移動ブロックを並べて表す」という同じものです。

1-3 いろいろな方法に移動させよう(6/8)

解答例を見る
1-3 解答例
1-3 解答例

上下左右の移動ブロックを組み合わせて、より複雑な経路を進みます。1マスごとに向きを変える必要がある場面が増え、どの順番で方向ブロックを並べるかがそのまま経路の形になることが実感できます。

1-4 移動の順序を考えよう(7/8)

解答例を見る
1-4 解答例
1-4 解答例

本文1章1-4で解説した「移動の順序」の解答例です。同じ移動ブロックの組み合わせでも、並べる順序を間違えるとゴールにたどり着けません。実行結果を見ながら、順番を1つずつ確認して組み立てる練習になります。

ステージ2 繰り返し(2-1〜2-5)

本文第2部2章に対応します。「〇回繰り返す」ブロックで、同じ移動を何度も書く手間を省きます。

2-1 繰り返しを使おう(3/3)

解答例を見る
2-1 解答例
2-1 解答例

本文2章2-1の解答例です。同じ方向への移動を「〇回繰り返す」ブロックでまとめ、目標ブロック数ちょうどの3個でクリアしています。

2-2 繰り返しをつなげよう(9/9)

解答例を見る
2-2 解答例
2-2 解答例

「〇回繰り返す」ブロックを複数個、順番につなげる構成です。1つの繰り返しだけでは表現できない、方向転換をともなう経路を、繰り返しの連続で表しています。

2-3 繰り返すところを考えよう1(4/6)

解答例を見る
2-3 解答例
2-3 解答例

「実行」の中にどのブロックを入れ、どのブロックを繰り返しの外に出すか、繰り返しの範囲(スコープ)を考えるステージです。目標の6個より少ない4個でクリアしており、繰り返しの範囲を正しく見極めるほどブロック数を節約できることがわかります。

2-4 繰り返すところを考えよう2(9/9)

解答例を見る
2-4 解答例
2-4 解答例

2-3の発展形で、繰り返す範囲の見極めがさらに重要になります。繰り返しの中に入れるブロックと外に置くブロックを整理しながら組み立てます。

2-5 繰り返しを繰り返そう(8/8)

解答例を見る
2-5 解答例
2-5 解答例

本文2章2-5の解答例です。「〇回繰り返す」ブロックの中に、さらに「〇回繰り返す」ブロックを入れる、繰り返しの入れ子(ネスト)構造になっています。外側の繰り返しが2回まわるたびに、内側の繰り返しがまるごと2回実行されます。

ステージ3 フィールド情報と条件分岐(3-1〜3-6)

本文第2部3章(フィールド情報)・4章(条件分岐)に対応します。周辺情報を調べて「もし〜なら」で判断する練習です。

3-1 周りを見て行動しよう1(5/7)

解答例を見る
3-1 解答例
3-1 解答例

本文4章3-1の解答例です。「もし〜なら、そうでなければ」ブロックを使い、上のマスがブロックかどうかで進む方向を切り替えます。

3-2 周りを見て行動しよう2(7/7)

解答例を見る
3-2 解答例
3-2 解答例

本文4章3-2の解答例です。「もし〜なら、そうでなくもし〜」で3つの条件を優先順位付きで判定し、目標ブロック数ちょうどでクリアしています。

3-3 アイテムをたどってみよう(20/20)

解答例を見る
3-3 解答例
3-3 解答例

周辺情報をもとに、アイテムのある方向へ何ターンも追いかけ続けるプログラムです。これまでのステージより条件分岐の数が増え、目標ブロック数ぴったりの20個を使う、やや大がかりな構成になっています。

3-4 周りだけじゃわからない?(10/12)

解答例を見る
3-4 解答例
3-4 解答例

自分のすぐ周り(周辺情報)だけでは判断しきれない状況を扱うステージです。1マス先の情報だけに頼らず、複数の条件を組み合わせて安全な方向を選んでいます。

3-5 ジグザグの迷路を進もう(10/12)

解答例を見る
3-5 解答例
3-5 解答例

ジグザグ状に折れ曲がった迷路を、周辺情報と条件分岐を組み合わせて進みます。曲がり角ごとに周辺情報を取得し直し、そのつど正しい方向を選び直す構成です。

3-6 市松模様の壁を進もう(7/10、残りターン数50)

解答例を見る
3-6 解答例
3-6 解答例

市松模様(チェッカー状)に並んだブロックをよけながら進みます。他のステージと違って残りターン数が50に制限されており、無駄な動きをせずに効率よく判断する必要があります。

ステージ4 探査(look・search)の活用(4-1〜4-6)

本文第2部5章(look・search)・6章(探査した情報の活用)に対応します。

4-1 遠くを見てみよう(17/20)

解答例を見る
4-1 解答例
4-1 解答例

本文6章4-1の解答例です。上・下・左の順に遠方探査し、いちばん遠いマスにアイテムがあった方向へ「ずっと繰り返す」で進み続けます。どの方向にも見つからなければ右へ進みます。本文では説明を分かりやすくするため右・左の2択に絞って解説していますが、実際のステージでは3方向を順に調べる形になります。一直線に9マス分を調べるsearchブロックの結果をもとに、進む方向を1回だけ決める、という考え方は同じです。

4-2 情報をリストにまとめよう(29/200)

解答例を見る
4-2 解答例
4-2 解答例

本文6章4-2の解答例です。「リスト〔遠方情報リスト〕で〔アイテム〕の最初の出現箇所を検索」ブロックの結果を≠ 0と比べることで、「9マスのどこかにアイテムがあるか」を判定しています。上・下・左の3方向について同じ判定を繰り返し、見つかった方向へ進み続けます。本文では右・左の2択に絞って解説していますが、判定のしかたは同じです。目標ブロック数が200と非常に緩やかに設定されており、ブロック数の少なさより「まとめて調べる」考え方を身につけることが主眼のステージだとわかります。

4-3 自分の位置を確かめよう(29/30、残りターン数20)

解答例を見る
4-3 解答例
4-3 解答例

変数を使って自分のX座標・Y座標を管理し、フィールド上での自分の位置を把握しながら進みます。本文第2部9章(ステージ7)で学ぶ変数の使い方を、探査ステージの中で先取りして使う内容です。残りターン数も20に制限されています。

4-4 自縛を回避しよう(14/16、残りターン数20)

解答例を見る
4-4 解答例
4-4 解答例

本文6章4-4の解答例です。アイテムに向かう前にlookで先の状況を覗き見て、進んだ結果ブロックに挟まれてしまう「自縛」が起きないかを事前に確認しています。

4-5 斜め方向をlookで見つけよう(21/25)

解答例を見る
4-5 解答例
4-5 解答例

lookブロックが取得する周囲9マスには、上下左右だけでなく斜め方向(UpLeft・UpRightなど)の情報も含まれています。このステージでは、その斜め方向の情報を活用してアイテムを見つけます。

4-6 近くはlook、遠くはsearch(41/45)

解答例を見る
4-6 解答例
4-6 解答例

lookとsearchを役割分担させる、探査ステージの集大成です。近くの安全確認にはlook、遠くのアイテム探しにはsearchというように、目的に応じて2種類の探査ブロックを使い分けています。これまでのステージの中でもブロック数が多く、複雑な条件分岐が積み重なった構成になっています。

ステージ5 ターンの仕組み(5-1〜5-5)

本文第2部7章に対応します。「自分のターンを待つ」ブロックを使い、対戦相手と交互に動く前提でプログラムを組みます。

5-1 自分の番を待ってみよう1(3/6)

解答例を見る
5-1 解答例
5-1 解答例

本文7章5-1の解答例です。「自分のターンを待つ」ブロックを「ずっと繰り返す」の中、判断の直前に置く基本の形を、目標の半分のブロック数でクリアしています。

5-2 自分の番を待ってみよう2(13/15)

解答例を見る
5-2 解答例
5-2 解答例

get_readyと条件分岐を組み合わせた発展課題です。毎ターン最新の周辺情報を受け取りながら、複数の条件を判定しています。

5-3 たくさんアイテムをゲットしよう(10/35)

解答例を見る
5-3 解答例
5-3 解答例

1つだけでなく複数のアイテムを連続して回収するステージです。目標ブロック数35に対して10個と、ブロック数にはかなり余裕があり、確実に動くことを優先した構成になっています。

5-4 CPUとアイテムを取り合おう(20/25、残りターン数80)

解答例を見る
5-4 解答例
5-4 解答例

CPU(対戦相手)が同じフィールドで動く中、アイテムを取り合うステージです。自分のターンを待ちながら、相手の動きも意識した判断が求められます。アイテムは、8個がリング状に並んでいて、5個取ればクリアです。解答例は、決めた道順で、5個を最短で取りに行く形です。CPUも近くのアイテムを狙うので、先に取られると失敗することがあります(同じ道順のPythonのコードを、実機で15回試したところ、13回クリアでした)。

5-5 番を待ちつつ遠くを探そう(24/25)

解答例を見る
5-5 解答例
5-5 解答例

get_readyとsearchを組み合わせた総合課題です。毎ターン最新の情報を受け取りながら、遠方まで探査して行動を決める、ステージ4とステージ5の内容を統合したような構成になっています。

ステージ6 ブロック設置とアタック(6-1〜6-4)

本文第2部8章に対応します。相手のマスにブロックを設置してアタック勝ちを狙う練習です。

6-1 相手にブロックを置いてみよう1(6/8)

解答例を見る
6-1 解答例
6-1 解答例

本文8章6-1の解答例です。「もし〜なら、そうでなければ」の条件を「マスの種類がEnemyかどうか」に置き換え、右隣に相手がいればブロックを設置し、いなければ右へ移動します。

6-2 広いマップでブロックを置こう(12/20、残りターン数50)

解答例を見る
6-2 解答例
6-2 解答例

フィールドは中央の3行だけが通路になっていて、その左寄りにCool、右寄りにHotが立っています。そしてこのステージは、ステージ6ではじめて相手が動き回る課題です(6-1と6-3の相手は、その場から一歩も動きません)。

繰り返しの中身は、6-1をほんの少し広げただけです。上・下・右のどれかに相手がいればその方向にブロックを置き、どこにもいなければ右へ進む。それだけです。

注目してほしいのは、繰り返しの外、いちばん先頭に置かれた「左方向にブロックを置く」です。一見すると何の役にも立たない1個に見えますが、これが無いとこのステージは絶対にクリアできません。

先頭の1個が無いと勝てない理由

自分も相手も、毎ターン必ず1マスずつ動きます。ということは、自分が1回動いて相手が1回動くたびに、2人の距離は「2マス縮む・変わらない・2マス広がる」のどれかにしかなりません。つまり、距離が偶数なら偶数のまま、奇数なら奇数のままで、偶奇は永久に入れ替わらないのです。

このステージの初期配置は、間が8マス空いた偶数です。ところが相手を倒すには、距離1(奇数)で隣り合ってブロックを置くしかありません。移動を繰り返しているかぎり距離は偶数のままなので、もし右のマスがプレイヤーならという条件は一度も成立しません。相手はいつも斜めか、2マス先か、4マス先にいて、決して隣には来てくれないのです。

そこで先頭の1個が効きます。「ブロックを置く」は、自分はその場から動かない命令でした(第2部8章)。この1ターンだけ自分が足踏みして相手だけが動くので、そこで距離の偶奇がずれます。以降は距離が奇数になり、はじめて隣り合えるようになります。

置く方向を「左」にしているのは、自分の後ろ側なら通り道の邪魔にならないからです。上でも下でも構いません。

左を見なくてよい理由

条件は上・下・右の3つだけで、左を確認していません。手抜きに見えますが、これで足りています。相手が自分の左(後ろ)に回り込むには、3行しかない通路の中で、必ず一度は自分の真上か真下を通らなければなりません。そこで捕まえられるので、相手が左に現れることはないのです。

どのくらい確実か

この12個のプログラムを50000回シミュレーションしたところ、すべてクリアしました。決着までのターン数は最短5・中央値9・最長12で、50ターンの制限には余裕をもって収まります。相手の動きがランダムでも確実に勝てるのは、上で見たとおり「相手は自分の横をすり抜けられない」からです。

6-3 相手にブロックを置いてみよう2(11/15)

解答例を見る
6-3 解答例
6-3 解答例

ブロックが散らばったフィールドで相手に近づく課題です。「下に相手がいれば下にブロックを置く/そうでなくもし右がブロックなら、上がブロックかどうかで上下に避ける/そうでなければ右へ進む」という判断を、「ずっと繰り返す」の中で毎ターン行います。壁にぶつかったら上下にずれて回り込む、という素直な組み立てで、6-1と6-4のあいだを埋める位置づけのステージです。

6-4 動く相手にブロックを置いてみよう(30/99、残りターン数30)

解答例を見る
6-4 解答例
6-4 解答例

本文8章6-4の解答例です。中央の3×3のブロックの輪をはさんで相手と追いかけっこをします。開始直後に上方向にブロックを置くで自分の上をふさいでおき、そのあとは「その方角に相手がいれば置く/空いていれば進む/ブロックなら次の方角へ」という3択の判断を、下→右→上→左の順に「ずっと繰り返す」の入れ子として4段重ねています。先頭の1個が必要な理由は、6-2で説明した「距離の偶奇」のずらしです(6-4も初期の距離が4の偶数で、相手はランダムに動きます)。残りターン数が30と短く設定されており、目標ブロック数99に対して実際に使われているのは30個と、限られた手数の中で相手を捉える工夫が求められます。

ステージ7 変数と関数(7-1〜7-3)

本文第2部9章に対応します。プログラムを整理して読みやすくするための道具を学びます。

7-1 変数を使ってみよう(35/35)

解答例を見る
7-1 解答例
7-1 解答例

本文9章7-1の解答例です。「移動方向」という変数に一度だけ判定結果をセットし、以降はその変数の中身をもとに移動し続けます。目標ブロック数ちょうどの35個です。

7-2 関数を使ってみよう(77/99)

解答例を見る

本文9章7-2の解答例です。「アイテムゲット」「ランダム移動」という2つの関数を定義し、メインの処理からそれぞれを呼び出しています。もとは3つのブロックが横に並んだ1枚の画像でしたが、関数ごとに見比べやすいよう、ブロックのまとまりごとに画像を分けて縦に並べています。

メインの処理
7-2 メインの処理
7-2 メインの処理

「ずっと繰り返す」の中で「もし、アイテムゲット関数の戻り値が『未発見』なら、ランダム移動関数を呼び出す」という判断だけを行っています。実際にアイテムを探す処理も、ランダムに動く処理も、それぞれ専用の関数に任せることで、メインの処理はとても短くシンプルになっています。

関数「アイテムゲット」
7-2 関数アイテムゲット
7-2 関数アイテムゲット

上下左右のマスにアイテムがあるかどうかを順番に確認し、見つかった方向へ移動して「アイテムゲット?」に「ゲットだぜ」をセットします。どの方向にもなければ「未発見」のまま関数を抜けます。この「アイテムゲット?」の値を、メインの処理が確認しているわけです。

関数「ランダム移動」
7-2 関数ランダム移動
7-2 関数ランダム移動

ブロックがない方向をリストに集め、その中からランダムに1つを選んで移動します。「アイテムゲット」関数が「未発見」を返したとき、メインの処理からこの関数が呼び出されます。関数を分けたことで、「アイテムを探す」と「ランダムに動く」という2つの役割が、それぞれ独立した部品としてはっきり分かれていることが見て取れます。

7-3 関数を使ってみよう2(76/99)

解答例を見る

7-2の考え方をさらに発展させ、複数の関数を組み合わせて1つの大きな処理を組み立てています。こちらも関数ごとに画像を分けて掲載します。

メインの処理
7-3 メインの処理
7-3 メインの処理

「自分のターンを待つ」のあと、「進行方向」に関数「アイテム方向」の戻り値をセットし、それがnull(該当なしの意味)なら関数「ランダム方向」の戻り値をセットし直してから、「進行方向」へ移動します。2つの関数の結果を変数「進行方向」で受け渡ししているのがポイントです。

関数「アイテム方向」
7-3 関数アイテム方向
7-3 関数アイテム方向

上下左右のマスにアイテムがあるかどうかを確認し、見つかった方向を返します。7-2の「アイテムゲット」関数とよく似ていますが、その場で移動してしまうのではなく「どの方向か」という情報だけを返し、実際に動くかどうかの判断はメインの処理に任せている点が違います。

関数「ランダム方向」
7-3 関数ランダム方向
7-3 関数ランダム方向

ブロックがない方向をリストに集め、ランダムに1つ選んで返します。7-2の「ランダム移動」関数と似た処理ですが、こちらもその場で移動せず「どの方向か」を返すだけにとどめてあります。「アイテム方向」「ランダム方向」の両方を「方向を返すだけの部品」として統一しておくことで、メインの処理からはどちらも同じように扱えるようになっています。

ステージ8 総合演習(8-1〜8-3)

本文第2部10章に対応する、これまでの集大成となる総合演習ステージです。

8-1 障害物を回避しよう(51/500)

解答例を見る
8-1 解答例
8-1 解答例

本文10章8-1の解答例です。下へ進み、ブロックにぶつかったら左へ避けて再び下へ、避けた歩数を変数「移動量」で数えておいて、安全になったら中央へ戻る、という一連の流れが1つのプログラムにまとまっています。目標ブロック数500に対して51個と、これまでの道具を組み合わせれば比較的少ないブロック数で対応できることがわかります。

8-2 行き止まりを回避しよう(173/200、残りターン数100)

解答例を見る

行き止まりに突き当たったときの回避と復帰を、進行方向・後退方向・回避方向・復帰方向といった複数の変数で管理する、8-1よりさらに複雑な総合課題です。

8-2 解答例
8-2 解答例

8-3 見つけた情報を記録しよう(373/999、残りターン数999)

解答例を見る

チュートリアル全体の中でもっとも複雑な、最終ステージの解答例です。自分のX座標・Y座標を変数で管理しながら、遠方探査で見つけたアイテムの位置をリスト(メモ)に記録し、その記録をもとに行動する、本文第2部9章までの道具をほぼすべて動員した構成になっています。

8-3 解答例
8-3 解答例

ステージ9 総仕上げ(9-1〜9-3)

ステージ8までを終えた人のための、チュートリアルの最後のブロックです。ここまでのステージと違い、本文では扱っていません。また、本書には解答例の画像も収録していません。「もう解答例を見なくても、自分の力で組み立てられるようになった人」に向けたステージだからです。

3つのステージには、それぞれ次のような性格があります。

ステージ 名前 目標ブロック数 残りターン数 ツールボックス
9-1 全部のセンサーを使いこなそう 300 150 CHaser/プログラム/変数
9-2 CPUとの総合アイテム争奪戦 999 150 CHaser/プログラム/変数
9-3 自由チャレンジ 999 200 CHaser/演算/繰り返し/算数/テキスト/リスト/変数/関数(すべて)

9-1 全部のセンサーを使いこなそう

「センサー」とは、本書で学んできた周辺情報(get_ready)・近隣探査(look)・遠方探査(search)の3つのことです。ステージ4では look と search を、ステージ3・5では周辺情報を、それぞれ別々に練習してきました。9-1は、その3つを1つのプログラムの中で状況に応じて使い分ける課題です。フィールドにはブロックが配置されており、「近くの安全は周辺情報と look で、遠くの目標は search で」という役割分担が自然に必要になります。

9-2 CPUとの総合アイテム争奪戦

CPUが操作する相手と、同じフィールドでアイテムを取り合います。5-4「CPUとアイテムを取り合おう」の本格版で、フィールドにはアイテムが多数配置されています。取りに行く判断(第2部6章)、自縛を避ける判断(4-4)、相手にブロックを置く判断(第2部8章)を、すべて1つのプログラムに同居させることになります。ここまで学んだ内容の総合力が問われる、実質的な卒業試験です。

9-3 自由チャレンジ

ツールボックスに本番のプログラミング画面と同じ全カテゴリが並ぶ、制限のないステージです。目標ブロック数999、残りターン数200という、事実上の上限なし。ここまでで身につけた道具を、自分の好きなように組み合わせて試せます。

第3部に進んで本番の対戦用プログラムを書く前に、この9-3で自分のアイデアを試しておくと、ちょうどよい橋渡しになります。実際、9-3のツールボックスは第3部1章で説明するプログラミング画面とほぼ同じなので、「カテゴリからブロックを探す」操作にここで慣れておけます。


ステージ1から9まで、こうして見比べてみると、使っているブロックの種類そのものは移動・繰り返し・条件分岐・探査・変数・関数という、本文で学んだ数種類の道具しかないことに気づきます。ステージが進むにつれてプログラムが複雑に見えるのは、道具の種類が増えているからではなく、その道具をどう組み合わせるかの工夫が積み重なっているからです。行き詰まったときは、複雑なプログラムを一度にすべて理解しようとせず、「これはどの道具とどの道具の組み合わせでできているか」を1つずつ分解して読み解いてみてください。

YouTubeチャンネル

U-15プロコン舞鶴のYouTubeチャンネルを開設しました。大会の情報などを発信しています。 チャンネルを見る