高校「情報Ⅰ」での授業案(45 分 × 3 回)
壁に隠れた敵へ最短で近づくには? 重い処理は、どれだけ重いのか? 変えたら強くなったと、どうやって言えるのか? bot を Python で書きながら、探索・計算量・データの活用を、自分の作戦のなかで確かめます。
この授業でできるようになること:
幅優先探索を、手作業と Python の両方で説明できる。
処理の重さを「命令数」で比べ、軽くする工夫を選べる。
仮説を立て、条件をそろえて測り、結果から言えることと言えないことを分けて述べられる。
ねらいと、位置づけ
| 「情報Ⅰ」の内容 | この教材での扱い | 回 |
|---|---|---|
| (3) コンピュータとプログラミング アルゴリズム・プログラミング |
幅優先探索による最短経路。変数・分岐・反復・関数 | 1 |
| (3) 同 モデル化とシミュレーション |
試合の物理計算そのものが題材。同じ入力なら同じ結果になる(再現性) | 1〜3 |
| (3) 同 計算量(効率) |
1 回の思考に使える命令数の上限と、「命令数メーター」 | 2 |
| (4) 情報通信ネットワークとデータの活用 | 散布図・ヒストグラム・仮説検証・標本の大きさ(戦数) | 3 |
| 共通テスト「情報」 | 自分の Python を、共通テスト用プログラム表記(DNCL)で読む | 1・2 |
第 3 回は選択です。2 回でも、探索と計算量の単元として完結します。
準備
- はじめの質問で、「🐍 Python を書ける」を選びます。Python の画面から始まります。
- 先生は事前に、ステップアップ・チャレンジの BFS による最短迷路走破を 1 回やっておきます(15 分ほど)。
- Python の字下げ・コロン・名前のつづりのまちがいは、赤いメッセージ(行番号つき)で出ます。読みかたは 「赤いメッセージが出たとき」にあります。
第 1 回「探索アルゴリズム:壁を回りこむ」の 45 分
| 時間 | 場面 | 内容 |
|---|---|---|
| 0–5 分 | 問い | 「壁でさえぎられた敵に、どうやって最短で近づく?」。まっすぐ向かうだけでは壁にぶつかることを、ゲームの画面で見せます。 |
| 5–15 分 | 手作業 | 紙のマス目で、スタートから「1 歩で行けるマス」「2 歩で行けるマス」…と数字を書きひろげます。 ゴールに数字が入った時点で止めます。これが幅優先探索です。水面の波紋の広がりと同じです。 |
| 15–35 分 | 書く |
BFS による最短迷路走破を開きます。
find_path_bfs が返すマスの並びのうち、path[1](次のマス)の中心へ向かって進む部分を、TODO のところに書きます。
「マスの番号」と「マスの中心の座標」の違い(+ 0.5)が、いちばんのつまずきです。
|
| 35–43 分 | DNCL で読む |
ワークスペースの「📄 DNCL」で、自分の Python を共通テスト用プログラム表記で読みます。
if は「もし〜ならば」、代入や配列の書き方がどう対応するかを、隣と確かめます(対訳は
ドキュメント)。この表示は読む専用です。
|
| 43–45 分 | ふりかえり | 「幅優先探索で、なぜ最短になると言えるのか」を 1 文で書きます(ゴールに最初に届いた道が、いちばん歩数が少ないから)。 |
第 2 回「計算量:重い処理は、どれだけ重いか」の 45 分
| 時間 | 場面 | 内容 |
|---|---|---|
| 0–5 分 | 予想 | 「毎回探し直すのと、一度探した道を使い回すのと、どちらが軽い? 何倍くらい?」を、ノートに予想させます。 |
| 5–18 分 | 命令数を見る | ガレージで前回の bot を走らせ、対戦画面の「🧮 命令数メーター」(1 回の思考に使った命令数)と、バトル分析の「平均命令数」「命令数の消費」を見ます。 1 回の思考には上限があり、超えた回は前回と同じ動きになり、試合のあいだに 4 回超えると戦車が止まります。 時間ではなく命令の数で数えるのは、端末の速さに関係なく、同じ結果にするためです。 |
| 18–38 分 | 軽くする | 経路キャッシュと再計算判断 (平均命令数 400 以下で、同じ迷路をクリアする)に挑みます。 経路を変数に残して使い回し、「いつ探し直すか」の条件を自分で決めます。 |
| 38–43 分 | 表にまとめる | 「書き方/平均命令数/クリアできたか」を表にします。 目安として、ドキュメントの実測では、1 回の思考の平均は、毎回探し直す書き方で 1,157 命令、10 回に 1 回だけ探す書き方で 213 命令です( 経路探索と計算量)。自分の bot の数字と比べます。 |
| 43–45 分 | ふりかえり | 「軽くするために、何を捨てて(何を古いまま使って)、何を守ったか」を 1 文で書きます。 |
第 3 回(選択)「データの活用:変えたら強くなったと言えるか」の 45 分
| 時間 | 場面 | 内容 |
|---|---|---|
| 0–5 分 | 仮説 | ぼうけんの CPU(例:マスター)を相手に、「〜を変えれば勝率が上がるはず」を 1 文で書きます。 |
| 5–15 分 | 基準を測る | ガレージの「🔁 れんせん」で、同じあいて・50 戦。勝率と 95% 信頼区間を記録します。 |
| 15–28 分 | グラフで読む | バトル分析の 6 種類のグラフから 2 つを選び、根拠にします(例:射撃距離の散布図で、当たる距離を見る)。 画面の問いに答え、仮説の欄に書きます。 |
| 28–40 分 | 1 か所だけ変える | 1 か所だけ書き換え、同じ条件で 50 戦。信頼区間が大きく重なるなら、「上がった」とは言い切れません。戦数を増やして測り直します。 |
| 40–45 分 | まとめ | 結論と、その限界(相手が 1 種類だけ、など)を 3 行で書きます。 |
つまずきと、声かけ
| 生徒の様子 | よくある理由 | 声かけの例 |
|---|---|---|
| 「壁をこすって進まない」 | path の値は「マスの番号」。中心ではなく角へ向かっている |
「マス (4, 3) の真ん中の座標は、いくつと いくつかな?」 |
| 「path が空っぽ」 | たどり着けない、または len(path) を確かめていない |
「道が見つからなかったとき、path には何が入る? そのとき、戦車はどうする?」 |
| 「戦車が途中で止まった」 | 命令数の上限を、何度も超えている | 「命令数メーターで、いちばん重い回はどこ? その回だけ、何をしている?」 |
| 「DNCL に切りかわらない」 | Python に文法のまちがいがある | 「先に、赤いメッセージの行番号を見よう。直すと表示できるよ」 |
| 「勝率が毎回ちがう」 | 戦数が少ないと、たまたまの幅が大きい | 「戦数を 10 戦から 50 戦に増やすと、信頼区間の幅はどうなる?」 |
評価の観点(例)
| 観点 | 見るところ |
|---|---|
| 知識・技能 | 幅優先探索の手順を、紙の上と Python の両方で示せる。命令数で処理の重さを比べられる。自分の Python を DNCL で読める |
| 思考・判断・表現 | 軽くする工夫の理由を説明できる。信頼区間を根拠に、「言えること」と「まだ言えないこと」を分けて書ける |
| 主体的に学習に取り組む態度 | 予想と結果が違ったとき、仮説を書き直して測り直している |
発展
- 偏差射撃:動く相手の先を読んで撃つ。ヘルパー関数
predict_leadで撃ち、慣れたら中身を自分で書く - 間合い管理と状態機械:状態を持つ bot を書く
- 総合: マスター bot 討伐:これまでの総合
中学校の授業案と組み合わせると、ブロックから Python への流れを、学校段階をまたいで続けられます(中学校の授業案)。