CHaser解説(Python編)

第2部 Python編

6章 総合演習と、Blockly⇔Python対応表

6章 総合演習と、Blockly⇔Python対応表

入門編の第2部10章(ステージ8)に対応します。

総合演習:障害物を回避しよう(ステージ8-1)

ステージ8-1のマップとクリア条件

ステージ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()

組み立てのヒント

  1. まず、6つの要素を、それぞれ単独のPythonコードとして書き出してみる。
  2. 「下へ進んで、ブロックにぶつかったら止まる」部分だけを、whileとifで組み、実際に動かして確かめる。
  3. 確認できたら、「左へ避ける」部分を追加し、避けた歩数を数える変数を用意する。
  4. 最後に、「右にブロックがなければ戻る」部分を追加し、全体をwhile True:とget_ready()で包む。

ステージ8-1も、チュートリアルのPython画面で解けます。大きな課題は、小さな部品に分けて、1つずつ確実に動くことを確認しながら、組み上げていくのがコツです。Pythonでは、Blocklyのように「どこまで組み終わったか」が形で見えないぶん、こまめに実行して、結果を確かめながら進めることが大切です。Pythonの画面(第3部1章)の「マップ」タブでは、ブロックやアイテムを置いて、練習用のマップを自分で作れます。ステージ8-1のような、障害物のあるマップを作って、試してみましょう。

print()でコードの途中の値を出力すると、その値が実行画面の出力欄に表示されます。うまく動かないときは、print(map_info)などで、プログラムが今何を見ているかを確かめてみましょう。

演習問題

  1. 「変数の値を1増やす」書き方を使って、「アイテムを取った回数を数える」変数を作り、10回集めたら、特別な行動をする、というコードを考えてみましょう。
  2. 実際にこのステージのコードを書き、うまくいかなかった部分があれば、後述の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の書き方

  1. 命令の書き方は、チュートリアルのPython画面と、対戦用のPython画面とで、どう違いますか。
  2. 対戦用の骨組みのプログラムのうち、自分で書き換えるのは、どの部分ですか。
  3. direction = Rightとdirection == Rightは、それぞれどういう意味ですか。
  4. ifやforの行の最後に、必ず付ける記号は何ですか。

1章 移動と繰り返し

  1. プレイヤーを左に1マス動かすコードを書いてみましょう。
  2. range(4)は、どんな数字の並びを作りますか。

2章 情報の読み取りと条件分岐

  1. map_info[Left]は、何を表しますか。
  2. if・elif・elseは、それぞれどんなときに実行されますか。

3章 探査と、行動の決め方

  1. lookの結果とsearchの結果では、値の取り出し方がどう違いますか。
  2. look(Up)を実行したとき、look_info[Center]は、自分から見てどのマスの情報ですか。
  3. search_info[9]と書くと、どうなりますか。理由もあわせて答えてみましょう。

4章 ターンの仕組みと、攻撃

  1. map_info = get_ready()は、どんな2つのことをしていますか。
  2. 1回の番で、walk・put・look・searchのうち、行動できるのは何回ですか。
  3. 初めの距離が偶数で、相手が動き回るとき、移動だけを繰り返すプログラムで、相手に勝てないのはなぜですか。また、どうすれば勝てますか。

5章 変数と関数

  1. Pythonで関数を定義するときに使う、キーワードは何ですか。
  2. free = []とfree.append(Up)は、それぞれ何をしていますか。
  3. 関数の中で、関数の外にある変数に新しい値を代入したいとき、関数の先頭に何を書きますか。

6章 総合演習

  1. count = count + 1は、どんな順番で処理されますか。
  2. この書き方を、短く書くと、どうなりますか。

(解答は付録1「確認クイズ・演習問題の解答」を参照してください。)

次の第3部では、Pythonの画面の使い方と、対戦ルームの使い方を説明します。

YouTubeチャンネル

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