← ゲームをひらく

トップ先生の方へ > 高校(情報Ⅰ)

高校「情報Ⅰ」での授業案(45 分 × 3 回)

壁に隠れた敵へ最短で近づくには? 重い処理は、どれだけ重いのか? 変えたら強くなったと、どうやって言えるのか? bot を Python で書きながら、探索・計算量・データの活用を、自分の作戦のなかで確かめます。

この授業でできるようになること: 幅優先探索を、手作業と Python の両方で説明できる。 処理の重さを「命令数」で比べ、軽くする工夫を選べる。 仮説を立て、条件をそろえて測り、結果から言えることと言えないことを分けて述べられる。

ねらいと、位置づけ

「情報Ⅰ」の内容この教材での扱い
(3) コンピュータとプログラミング
アルゴリズム・プログラミング
幅優先探索による最短経路。変数・分岐・反復・関数 1
(3) 同
モデル化とシミュレーション
試合の物理計算そのものが題材。同じ入力なら同じ結果になる(再現性) 1〜3
(3) 同
計算量(効率)
1 回の思考に使える命令数の上限と、「命令数メーター」 2
(4) 情報通信ネットワークとデータの活用 散布図・ヒストグラム・仮説検証・標本の大きさ(戦数) 3
共通テスト「情報」 自分の Python を、共通テスト用プログラム表記(DNCL)で読む 1・2

第 3 回は選択です。2 回でも、探索と計算量の単元として完結します。

準備

  1. はじめの質問で、「🐍 Python を書ける」を選びます。Python の画面から始まります。
  2. 先生は事前に、ステップアップ・チャレンジの BFS による最短迷路走破を 1 回やっておきます(15 分ほど)。
  3. 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 への流れを、学校段階をまたいで続けられます(中学校の授業案)。

🛡️ ゲームをひらく