6章 総合演習と、Blockly⇔Python対応表
入門編の第2部10章(ステージ8)に対応します。
総合演習:障害物を回避しよう(ステージ8-1)
ステージ8-1のマップとクリア条件
| クリア条件 | 内容 |
|---|---|
| アイテム | 1個ゲットする |
| ターン数 | 100ターン以内 |
黄色の枠が自分(Cool)のスタート位置です。すべての条件を同時に満たすとクリアです。アイテム・ブロックの位置は毎回変わります(マップの半透明の表示は、出現位置の候補です)。
入門編と同じく、このステージには、あらかじめ用意された答えのコードはありません。ここまでに学んだPythonの書き方を組み合わせて、自分の力でコードを完成させる、「卒業試験」です。
課題は、次のようなものでした(入門編の第2部10章より)。
下へ進み、ブロックにぶつかったら、下にブロックがなくなるまで左へ移動して再び下へ移動。左へ移動した歩数を変数「移動量」にカウントしておいて、右にブロックがなければ「移動量」分だけ中央に戻る。
課題を、6つの要素に分けて、それぞれ第2部のどの章の書き方で書けるかを、確かめてみましょう。
| 要素 | 対応する章 | 使う書き方の例 |
|---|---|---|
| 下へ進む | 1章 | walk(Down) |
| 下がブロックかどうかを確認する | 2章 | if map_info[Down] == Block: |
| ブロックがなくなるまで、左へ移動し続ける | 1章・2章 | while map_info[Down] == Block: のような、条件付きの繰り返し |
| 左へ動いた回数を数える | 5章 | move_count += 1 のような、変数の更新 |
| 右にブロックがないか確認してから、数えた回数だけ中央に戻る | 2章・5章 | for(またはwhile)とifの組み合わせ |
| 毎ターン、相手の動きも見ながら繰り返す | 4章 | while True:の中でget_ready() |
組み立てのヒント
- まず、6つの要素を、それぞれ単独のPythonコードとして書き出してみる。
- 「下へ進んで、ブロックにぶつかったら止まる」部分だけを、
whileとifで組み、実際に動かして確かめる。 - 確認できたら、「左へ避ける」部分を追加し、避けた歩数を数える変数を用意する。
- 最後に、「右にブロックがなければ戻る」部分を追加し、全体を
while True:とget_ready()で包む。
ステージ8-1も、チュートリアルのPython画面で解けます。大きな課題は、小さな部品に分けて、1つずつ確実に動くことを確認しながら、組み上げていくのがコツです。Pythonでは、Blocklyのように「どこまで組み終わったか」が形で見えないぶん、こまめに実行して、結果を確かめながら進めることが大切です。Pythonの画面(第3部1章)の「マップ」タブでは、ブロックやアイテムを置いて、練習用のマップを自分で作れます。ステージ8-1のような、障害物のあるマップを作って、試してみましょう。
print()でコードの途中の値を出力すると、その値が実行画面の出力欄に表示されます。うまく動かないときは、print(map_info)などで、プログラムが今何を見ているかを確かめてみましょう。
演習問題
- 「変数の値を1増やす」書き方を使って、「アイテムを取った回数を数える」変数を作り、10回集めたら、特別な行動をする、というコードを考えてみましょう。
- 実際にこのステージのコードを書き、うまくいかなかった部分があれば、後述のBlockly⇔Python対応表を見ながら、第2部のどの章の内容を復習すればよいか確認してみましょう。
第2部のまとめ
第2部では、入門編でBlocklyを使って学んだ考え方を、Pythonの文法でどう書くかを学びました。変数への代入(=)と比較(==)の違い、インデントによる構造の表現、if・for・while・defという基本の文型、そしてin・and・or・notといった判定を組み合わせる演算子まで、CHaserのプログラムを組むために必要な道具は、一通りそろいました。
BlocklyとPythonは、見た目こそ大きく違いますが、「1マスずつ動く」「条件によって判断を変える」「同じ処理をまとめて繰り返す」「情報に名前を付けて覚えておく」「処理をひとまとまりの部品にする」という、根っこにある考え方は完全に同じです。次の第3部では、この道具を使って、実際に対戦に挑みます。
Blockly⇔Python対応表
入門編で登場したブロックと、Pythonの書き方を、機能ごとにまとめました。入門編のブロックをPythonで書き直すときの、索引として使ってください。
移動・設置
| Blockly(ブロック) | Python(書き方) | 対応する章 |
|---|---|---|
| 「〇〇方向に移動する」 | walk(方向) |
1章 |
| 「〇〇方向にブロックを設置する」 | put(方向) |
4章 |
情報の取得
| Blockly(ブロック) | Python(書き方) | 対応する章 |
|---|---|---|
| 「周辺情報を取得する」 | map_info(get_ready()の戻り値) |
2章 |
| 「自分のターンを待つ」 | get_ready() |
4章 |
| 「近隣探査」(look) | look(方向) → look_info |
3章 |
| 「遠方探査」(search) | search(方向) → search_info |
3章 |
繰り返し
| Blockly(ブロック) | Python(書き方) | 対応する章 |
|---|---|---|
| 「〇回繰り返す」 | for _ in range(回数): |
1章 |
| 「ずっと繰り返す」 | while True: |
1章 |
条件分岐・判定
| Blockly(ブロック) | Python(書き方) | 対応する章 |
|---|---|---|
| 「もし〜なら、そうでなければ」 | if: / else: |
2章 |
| 「もし〜なら、そうでなくもし〜」 | if: / elif: / else: |
2章 |
「=」の比較ブロック(ドロップダウンで≠・>などに変更) |
== / != / > |
2章 |
| 「リスト〔 〕で以下の〔 〕の最初の出現箇所を検索」ブロック | first_index(リスト, 値)(変換されたコードに出てくる) |
3章・5章 |
(↑を> 0と比べる書き方の、Pythonでの短い言い換え) |
値 in リスト |
3章 |
| 論理演算ブロック(「〜かつ〜」/「〜または〜」) | and / or |
3章 |
| 「〜ではない」ブロック | not |
3章 |
変数・関数
| Blockly(ブロック) | Python(書き方) | 対応する章 |
|---|---|---|
| 変数ブロック(値をセット) | 変数名 = 値 |
0章・5章 |
| 変数の値を更新する組み方 | 変数名 = 変数名 + 1(+=) |
5章 |
| 関数ブロック(定義) | def 関数名(): |
5章 |
| 関数ブロック(呼び出し) | 関数名() |
5章 |
| 「空のリストを作成」ブロック | [] |
5章 |
| 「リスト〔 〕挿入位置:最後 値:〔 〕」ブロック | .append(値) |
5章 |
| 「リスト〔 〕取得 ランダム」ブロック | random.choice(リスト) |
5章 |
first_index()は、リストの中で特定の値が最初に見つかった位置を返す、Blocklyが変換のときに補う補助関数です。位置は1から数え、見つからなければ0を返します(5章)。search_info[番号]が0から数えるのとは数え方が違うので、注意してください。
第2部 確認クイズ
0章 Pythonの基礎と、CHaserの書き方
- 命令の書き方は、チュートリアルのPython画面と、対戦用のPython画面とで、どう違いますか。
- 対戦用の骨組みのプログラムのうち、自分で書き換えるのは、どの部分ですか。
direction = Rightとdirection == Rightは、それぞれどういう意味ですか。ifやforの行の最後に、必ず付ける記号は何ですか。
1章 移動と繰り返し
- プレイヤーを左に1マス動かすコードを書いてみましょう。
range(4)は、どんな数字の並びを作りますか。
2章 情報の読み取りと条件分岐
map_info[Left]は、何を表しますか。if・elif・elseは、それぞれどんなときに実行されますか。
3章 探査と、行動の決め方
lookの結果とsearchの結果では、値の取り出し方がどう違いますか。look(Up)を実行したとき、look_info[Center]は、自分から見てどのマスの情報ですか。search_info[9]と書くと、どうなりますか。理由もあわせて答えてみましょう。
4章 ターンの仕組みと、攻撃
map_info = get_ready()は、どんな2つのことをしていますか。- 1回の番で、
walk・put・look・searchのうち、行動できるのは何回ですか。 - 初めの距離が偶数で、相手が動き回るとき、移動だけを繰り返すプログラムで、相手に勝てないのはなぜですか。また、どうすれば勝てますか。
5章 変数と関数
- Pythonで関数を定義するときに使う、キーワードは何ですか。
free = []とfree.append(Up)は、それぞれ何をしていますか。- 関数の中で、関数の外にある変数に新しい値を代入したいとき、関数の先頭に何を書きますか。
6章 総合演習
count = count + 1は、どんな順番で処理されますか。- この書き方を、短く書くと、どうなりますか。
(解答は付録1「確認クイズ・演習問題の解答」を参照してください。)
次の第3部では、Pythonの画面の使い方と、対戦ルームの使い方を説明します。