CHaser解説(Blockly編)

資料

演習・確認クイズの解答

⚠️ ネタバレ注意

このページには第1部・第2部・第3部の演習問題・確認クイズの解答が含まれています。

各部末の「確認クイズ」と、各章末の「演習問題」の解答をまとめました。

ここに載せているのはあくまで解答の一例です。とくにプログラムを組む問題は、同じ動きをする組み方がいくつもあります。自分の答えと違っていても、動きが同じであれば間違いではありません。「なぜその答えになるのか」の部分を読んで、考え方が合っていたかを確かめてください。

「自分で考えて書き出す」タイプの問題には、解答の代わりに確認のポイントを示しています。


第1部 確認クイズの解答

1章 CHaserとは

  1. 直接操作できません。試合が始まったら、事前に書いたプログラムだけがキャラクターを動かします。
  2. 相手より多くアイテムを集めることです(ただし、アタック勝ち・閉じ込め勝ちという特別勝利条件もあります)。

2章 フィールドの構成要素

  1. プレイヤー(Cool)、プレイヤー(Hot)、アイテム、ブロックの4種類です。
  2. アイテムのマスは通れて、通ると取得できます。ブロックのマスは通れません(移動しようとすると衝突して敗北します)。

3章 プレイヤーの行動

  1. 2種類です(移動と、ブロック設置)。
  2. 行えません。どちらも上下左右の4方向だけです。斜めに進みたいときは「上に1マス、右に1マス」のように2手に分けます。

4章 アイテム取得とブロック出現

  1. そのマスにブロックが出現します。
  2. 自分の周りがブロックだらけになり、身動きが取れなくなって「自縛」で敗北する危険があります。

5章 勝利条件

  1. 2種類で、「アタック勝ち」と「閉じ込め勝ち」です(それぞれ相手側から見ると「衝突」「自縛」という敗北になります)。
  2. アタック勝ちは、相手がいるマスにブロックを設置したときに起こります。衝突は、自分がブロックのあるマスに移動しようとしたときに起こります。

6章 チュートリアルの始め方

  1. 表示された条件をすべて満たす必要があります(本文の例では3つすべて)。1つでも満たせなければクリアになりません。
  2. 動かしたいときは「実行」ボタン、止めたいときは「停止」ボタンです(組み直したいときは「削除」ボタンでやり直せます)。

第2部 演習問題の解答

1章 移動

  1. 「左方向に移動する」2個 →「下方向に移動する」1個 →「左方向に移動する」2個を、上からこの順に並べます(合計5個)。同じ向きでも、1マスにつき1個ずつ必要な点に注意してください。
  2. 確認のポイント:①アイテムまで縦に何マス・横に何マス離れているかを数えたか ②その移動を、実際に進む順番どおりに上から並べたか ③途中にブロックがある場合、そのマスを通らない経路になっているか。

2章 繰り返し

  1. 外側に「3回繰り返す」ブロックを置き、その中に「3回繰り返す(中身は右方向に移動する)」と「下方向に移動する」を、この順で並べます。ブロック数は5個です。
  2. 「右×3」を「3回繰り返す+右方向に移動する」に、「上×2」を「2回繰り返す+上方向に移動する」にまとめられます。最後の「右×1」は1回だけなので、繰り返しにするとかえってブロックが増えます。移動ブロック6個 → 5個(繰り返し2個+移動3個)に減ります。全部を1つの繰り返しにまとめる必要はない、というのがこの問題のポイントです。

4章 条件分岐

  1. 「もし(右のマスがItem)なら → 右方向に移動する/そうでなくもし(下のマスがBlock)なら → 上方向に移動する/そうでなければ → 下方向に移動する」の形に組みます。
  2. 例:「左にアイテムがあり、かつ上もブロック」という状況です。本来は左のアイテムを取りに行きたいのに、「上がブロックか」を先に判定してしまうと条件が成り立ち、右へ逃げてアイテムを取り逃します。

5章 探査:近隣探査と遠方探査

  1. 3番目です。番号は、何マス先かと同じ数なので、「3マス先=3番目」となります。
  2. 近隣探査が適切です。近隣探査は「その方向の2マス先を中心とした周囲9マス」が分かるので、その方向に進んだ先で囲まれてしまわないかを事前に確認できます。遠方探査ではその方向の一直線しか分からず、進んだ後の左右の状況が分かりません。

6章 探査した情報で行動を決める

  1. 期待どおりには動きません。4-1のプログラムは8番目(8マス先)だけを見ているので、5マス先(5番目)にアイテムがあっても「アイテムなし」と判断し、次の方向を調べに行ってしまいます。この弱点を解決するのが、4-2で学ぶ「含まれているか」の判定です。
  2. 例:「左にアイテムがあり、その上下がブロック」という状況です。左へ進むとブロックに挟まれます。対処は上下と同じで、進む前に近隣探査でその方向の周囲を確認し、両脇がふさがっていれば別の方向を選びます。

7章 ターンの仕組みとget_ready

  1. 繰り返しの中に入れた場合は、毎ターン自分の番を待ち、そのつど最新の周辺情報を受け取ってから判断できます。繰り返しの外に1回だけ置いた場合は、最初の1回しか自分の番を待たず、2回目以降は最初に取得した古い情報のまま判断し続けてしまいます。相手が動いても気づけません。
  2. 3手です。CoolとHotは1手ずつ交互に動くので、動く回数は同じになります(先攻・後攻の関係で、途中の瞬間には1手分の差がつきます)。

8章 ブロック設置とアタック攻撃

  1. 「もし(上がEnemy)なら → 上にブロックを設置する/そうでなくもし(下がEnemy)なら → 下に設置する/そうでなくもし(左がEnemy)なら → 左に設置する/そうでなくもし(右がEnemy)なら → 右に設置する/そうでなければ → 右方向に移動する」の形になります。判定した方角と、設置する方角を必ず一致させるのがポイントです。

    相手は1人しかいないので、4方向のうち2つ以上に同時に相手がいることはありません。つまり条件をどの順番に並べても結果は変わりません。条件の順序が結果を左右した3-2(第2部4章)と読み比べてみると、「順序が意味を持つ場合」と「持たない場合」の違いがはっきりします。

    なお、この形をそのままチュートリアルのステージ6-2に持ち込んでも、実はクリアできません。6-2は相手が動き回るステージで、そこには「距離の偶奇」という別の落とし穴があります。詳しくは付録2の6-2を読んでみてください。

  2. 2つを分けるのは、自分がどちらの行動をとったかです。「ブロックを置く(設置)」なら相手を倒すアタック、「自分がブロックのマスへ動く(移動)」なら衝突して敗北です。同じ「ブロック」という言葉が出てきても、命令が設置なのか移動なのかを確認すれば混同しません。

9章 変数と関数を活用する

  1. 判定を右 → 上 → 左の順に行い、「もし右にアイテムがあれば変数『移動方向』に右をセット/そうでなくもし上にあれば上をセット/そうでなければ左をセット」とします。判定はプログラムの最初に1回だけ行い、「ずっと繰り返す」の中では「移動方向」の中身へ移動するだけにします。変数を使うと、選択肢が2つから3つに増えても、繰り返しの中身は変わらないのが利点です。
  2. 例:「アタック」という名前の関数にします。中身は「上下左右のいずれかに相手がいれば、その方向にブロックを設置する」処理です。さらに「設置できたか/できなかったか」を戻り値として返すようにしておくと、メインの処理が「アタックできなければ移動する」という形に書けて読みやすくなります。

10章 総合演習:障害物を回避しよう

  1. 「移動量」は、下に進めなくなって左へ避けた歩数をカウントするための変数です。あとで元の縦の列(中央)に戻るときに、右へ何マス戻ればよいかが分からないと復帰できないため、避けた歩数を覚えておく必要があります。
  2. 「ずっと繰り返す」(または条件付きの繰り返し)の中で、「もし下のマスがブロックなら、左方向に移動する」という条件分岐を繰り返します。毎回の判定の前に周辺情報を取得し直すのがポイントで、下がブロックでなくなった時点で左への移動が止まります。
  3. 確認のポイント:詰まった場所を書き出すこと自体が目的です。「どのブロックを置いたところで動きがおかしくなったか」「そのとき画面のキャラクターはどう動いたか」の2点をセットで記録しておくと、後から見返したときに原因を探しやすくなります。

第2部 確認クイズの解答

0章 Blockly基本操作

  1. 外すだけなら、離れた場所へドラッグします(それより下につながっているブロックも一緒に外れます)。消すときは、画面右下(または左下)のゴミ箱アイコンへドラッグします。
  2. ブロックが内側にはめ込まれて一段下がっている(インデントされている)かどうかで区別します。

1章 移動

  1. 1マスです。
  2. 5個です(右3個+上2個)。

2章 繰り返し

  1. 右に6マス進みます(外側2回 × 内側3回)。
  2. 「ずっと繰り返す」ブロックです。

3章 フィールド情報を読み取る

  1. DownLeftです。
  2. 4種類で、Floor(何もない空きマス)、Block(ブロック)、Item(アイテム)、Enemy(相手プレイヤー)です。

4章 条件分岐

  1. 何もしません(その場で待つ動きになります)。
  2. 1つだけです。上から順に調べて、最初に当てはまった条件だけが実行され、それ以降は調べられません。

5章 探査:近隣探査と遠方探査

  1. 近隣探査は、指定した方向の2マス先を中心とした正方形の9マスを調べます。遠方探査は、指定した方向への一直線の9マスを調べます。
  2. 9番目です(1番目が隣、9番目がいちばん遠いマス)。

6章 探査した情報で行動を決める

  1. 「リスト〔 〕で以下の〔 〕の最初の出現箇所を検索」ブロックの結果を> 0(または≠ 0)と比べます。このブロックは見つかった位置を1から数えた番号で返し、見つからなければ0を返すためです。
  2. その方向へ進んだ場合に、両脇がブロックで挟まれてしまわないかを、近隣探査(look)で事前に確認します。

7章 ターンの仕組みとget_ready

  1. 自分の番が来た瞬間の、最新の周辺情報を受け取るという役割があります。
  2. Cool → Hot → Cool → Hot … と、1手ずつ交互に動きます。

8章 ブロック設置とアタック攻撃

  1. 上下左右の4方向(自分に隣接するマス)に設置できます。
  2. 相手も毎ターン動くため、前のターンにいた場所に今もいるとは限らないからです。古い情報のまま設置しても、相手はもうそこにいません。

9章 変数と関数を活用する

  1. 変数は、値に名前を付けて覚えておき、後から何度でも使い回すために使います。関数は、処理のまとまりに名前を付けて、必要なときに1つの呼び出しでまとめて実行するために使います。
  2. 実行されません。定義しただけでは何も起こらず、メインの処理から呼び出してはじめて中身が動きます。

10章 総合演習:障害物を回避しよう

  1. ①やりたいことを日本語の手順で書き出す ②手順を「移動」「条件分岐」「繰り返し」「変数」に分類する ③1つずつブロックに置き換える ④一部分ずつ実行して動きを確かめながら付け足していく、という順で進めます。
  2. 下に進めなくなって左へ避けた歩数を覚えておくための変数です。あとで同じ数だけ右へ戻り、元の列に復帰するために使います。

第3部 演習問題の解答

3章 やりたいことをプログラムにする

  1. 確認のポイント:3つの関数は、「1ターンの行動」の中で呼び出す関数を差し替えるだけで切り替えられます。「どの選択肢が強いか」よりも、相手や場面によって結果が変わるかに注目してください。負けた試合では、そのとき敵がどこにいて、自分がどう動いたかを思い出して、原因を1つ書き出してみましょう。

  2. 一例です。まず変数「連続で待った回数」を作り、ずっと繰り返すブロックの前で0にセットしておきます。次に、「斜めの敵に備えて待つ」の中の、4つの「もし〔自分の〔斜め〕マスがプレイヤーなら〕」それぞれの中身の先頭に、次のブロックを置きます。

    • もし〔連続で待った回数 ≧ 3〕なら実行:「連続で待った回数」を0にセットし、「返す〔false〕」(待つのをやめて、次の判断に回す)
    • そうでなければ、「連続で待った回数」を1増やしてから、いつもの「近隣探査する」と「返す〔true〕」

    さらに、関数の最後の「返す〔false〕」の直前で、「連続で待った回数」を0にセットします(斜めに敵がいなければ、数え直すため)。「連続で待った回数」を、関数の外で作っておくのがポイントです。上限の数字を変えて、動きがどう変わるかも試してみましょう。

  3. 「≦ 4」を大きくすると、敵を見てから近隣探査し続ける期間が長くなります。「≧ 3」を小さくすると、近隣探査の間隔が短くなります。どちらも近隣探査を使う回数が増えます。近隣探査は1ターンを使い、その間は移動もアイテム取得もできないので、使いすぎるとアイテムを集める速さが落ちます。

  4. 確認のポイント:4つのステップの、どこで手が止まったかを書き留めておきましょう。たとえば例の「直前に進んだ方向とは、反対には進まない」なら、①1文で書く ②「反対」を数えられるものに直す(進行方向を変数に入れておき、上の反対は下、というように決める) ③手順に分ける(進む方向の候補から、反対のものを除く)、と進められます。


第3部 確認クイズの解答

1章 プログラミング画面の使い方

  1. 「合言葉で〇〇マップの〇〇対戦にプレイヤー名〇〇で接続する」という接続ブロックです。プログラム本体は、このブロックの中に入れる必要があります。
  2. 画面下の「Program output」欄に、エラーメッセージが出ていないかを確認します。

2章 対戦ルームの使い方

  1. VS対戦(人と人との対戦)と、CPU対戦(コンピューターが操作する相手との対戦)の2種類です。
  2. cool側とhot側の両方のプレイヤーがプログラムファイルを読み込み、準備が整うと表示されます。

3章 やりたいことをプログラムにする

  1. ①やりたいことを1文で書く、②あいまいな言葉を数えられるものに直す、③日本語のまま小さな手順に分ける、④手順を1つずつブロックに置き換える、の4つです。
  2. 何を数えたり比べたりすれば言えるのかを考え、数字の比較に直します。たとえば「最近敵を見た」は、「敵を最後に見てから何ターンたったか」を数えて、「ターン数 − 最後に敵を見たターン ≦ 4」のような式にします。
  3. 「返す」ブロックは、その関数をそこで終わらせるブロックだからです。「もし〔関数の呼び出し〕 返す」でtrueが返ってくると、それより下に並べた判断は実行されません。そのため、上に並べた判断ほど先に実行され、優先されます。
  4. 指定した方向の2マス先のマスの情報です。近隣探査は、指定した方向の2マス先を中心とする周囲9マスを調べ、「中央」はその真ん中のマスを表します。
  5. 変数に入れておきます。変数は、ターンが変わっても値が残るので、前のターンの情報を次のターンで使えます(例:「進行方向」「最後に敵を見たターン」)。

YouTubeチャンネル

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