情報授業実践記録 |
|
ブロック崩しゲームを創る |
|
宮崎県立宮崎西高等学校 |
|
1.なぜブロック崩しなのか
|
|
私はこれまで,プログラムを書くということを意識的に避けながら授業をしてきていた。それは,教科「情報」の指針が,当初,フローチャートを使ってアルゴリズムを教え,プログラムには触れていなかったことにある。しかし,それは例えれば,ロボットの設計図だけ書いて,実際に動くロボットをつくらない授業をしていたことと同じだった。
生徒たちは,コンピュータが開発され,1枚のチップにその心臓部分(CPU)が収められるようになったばかりの頃を知らない。計算機センターに収まっていた巨大なコンピュータが自分のものになるという驚き,それは,多くの理系人間にとって衝撃的な出来事だった。当時,そのチップで作られたマシンはマイコンと呼ばれ,特に1977年アップル社の出したApple II は,みんなの憧れの的だった。ソフトは,BASICというプログラミング言語だけで,付録に簡単なゲームがついていた。コンピュータは計算機であると思っていた理系人間にとって,「ゲームができる」ことにその時気づいた人は多い。そこに新しい地平が見えていたのだ。その付録のゲームこそ「Little Brick Out」つまりブロック崩しゲームである。 |
|
2.ブロック崩しの準備
|
|
(1) 表の座標を数字にする。 ここでは,まずプログラムコードが書きやすいようにExcelのほうの準備をしておく。 (2) セキュリティチェックを外す設定 開発というメニューから「マクロのセキュリティ」を開き,すべてのマクロが有効になるようにチェックを入れておく。また,開発者向けのマクロ設定にもチェックを入れておく。 (3) 作業画面を出す 開発というメニューからVisual Basic Editorを開き,画面にエディターのウインドウが出てくるようにしておく。このエディターにプログラムコードを書いていく。出てこない時は,挿入→標準モジュール を選ぶ。プロジェクトの該当するシートをダブルクリックしてもよい。実際の作業では,このVisual Basic のウインドウとExcelのウインドウを同時に表示するように,生徒たちには指導している。 |
|
3.ブロック崩しの現場づくり
|
|
ブロック崩しのExcel側をまずは作ってみる。最初は下図のように,まるごと同じように作ってみる。特に,数値の座標が違うと,プログラムコードがこの例とずれてしまい厄介なことになる。右の「スタート」や「ブロック」のボタンはまだ作る必要はない。 グラフは,散布図にして,ボールの位置(x,y)に丸いボール,ラケットの位置に横長の長方形,ブロック位置に18個のブロックが正方形の点として示されるようになっている。 また,縦と横の座標軸は,最小値0,最大値10で固定しておく。これは大事な部分で,実際にボールが動き出した時,座標を固定していないと困ったことになる。 |
|
4.プログラムの全体構成
|
|
添付したプログラムは,Ballというメインプログラム(Subプロシージャ)が変数宣言文の次に書かれている。(Sub Ball() からEnd Subまでに相当する部分)。 このBallというプログラムは,ボールをまっすぐ進ませようとする。 そして,途中,次に進むべきほんのちょっと先の( 秒後の)位置には次の3つの問題がないか判断させる。 (1)壁はないか,もしあったら反射して向きを変える。 つまり, 秒間の1ステップの移動ごとにすべてを判断させるという,まあ,ボールにとっては厄介なことをさせていることになる。ブロックにいたっては18個もあり,その1個ずつの反射と消去を判断する必要がある。 |
|
5.ボールを動かす
|
|
それでは,グラフの中のボールを動かすことにしよう。いよいよプログラムコードを書く。 グラフをつくったところがSheet1なら,右図のSheet1のところをダブルクリックしてみる。右にプログラムを書くための白い紙が出てくる。 そこに図のようなプログラムを半角文字で書いてみる。 ファンクションキーF8でプログラムをチェックすることができる。間違いなく書けていたら,DO 〜 LOOP の中を何回もループする様子が分かるはずだ。DoEvents はほかの命令が来たらそっちのほうをやれということで,これによってLOOPからの脱出が行われる。 |
|
6.ボールを壁で反射させる
|
|
ボールを壁で反射させるにはどうしたらいいのだろうか。まず,あたらしいプログラムを書くために,変数の宣言文をSub Ball()プログラムの上に出しておく(コピー&ペースト)。なおSubプログラムのことをSubプロシージャと呼んでいる。 このボールの反射の仕方をパソコンに教えてやるために,メインのBallプログラムの次に「ボールの壁反射」のプログラムを書く。そして,メインのBallプログラムのDo-Loopの中に,次のコードを書いておく。 Call ボールの壁反射()
「ボールの壁反射」の中では,次のようにして壁の反射を判断させ,向きを変えさせる。図と一緒に見るとわかりやすいだろう。 ボールは 秒後のことしか知らない。そのときの座標の(x, y)が,壁に入っているかどうかをIF文で判断させる。もし,壁があったら左右の壁だったら,速さの x 成分を逆向き(つまり-1をかけてやればよい)にする。上下の壁に迫っていたら,速さのy成分vyを逆向きにする。 コードで書くと vx=-vx と vy=-vy となる。もちろんこれも等式ではなくvx の符号(向き)を変えたものを,新しくvxとしなさい。という意味である。 |
|
7.ブロックを崩す
|
|
さあ,それではいよいよブロックを崩してみよう。このブロックにボールが当たると,ボールは反射し,しかもブロックはその場所から無くならないといけない。どうすればこんなプログラムが書けるのだろう。 ブロックとボールの衝突には一次元配列の手法を使う。ブロック0からブロック17までの位置座標を,その一般形であるブロックn の位置座標b_px(n)とb_py(n)としてやるのだ。ブロックnについてプログラムを書いてやれば,あとはその中で,nを0から17までひとつずつ増やして回してやればいい。こうすれば,すべてのブロックについていちいちプログラムを書く手間が省けるというわけだ。 b_px(n)とはn番目のブロックのポジションのx座標という意味で,もっと簡単に書いても何らかまわない。 ただ,この一次元配列はブロック100個までOKで単精度の数ですよと,初めの変数宣言をしておく。 あとは反射の仕方である。これは,壁反射と基本的には同じだが,条件は複雑になる。 ブロックの4つの辺の周辺に近づいているかどうかの判断になり,また,反射の向きもどちらにするかを決める必要がある。プログラムを見て研究していただきたい。 |
|
8.ブロックがなくなる
|
|
それでは,ボールが当たったらブロックがなくなるようにするにはどうしたらいいのか。これは,授業では生徒たちに1時間考えさせ,いろんなアイデアを出してもらう。その中でおそらく出てくるだろうアイデアが,ボールがブロックに当たったと判断したら,ブロックの位置を,グラフの外にしてしまう方法である。このプログラムでは,縦軸の座標12のところにブロックを上げてしまうようにしている。もちろん,生徒たちには,この部分は授業で考えさせるため見せない。 プログラムが,人のアイデアの塊であること,そしてそれこそが,「著作権」という権利につながることを学ぶ大事な場所にもなっている。 |
|
9.ラケットを動かす
|
|
いよいよこのブロック崩しの中に,ラケットを持って入るにはどうしたらいいのか。突然,パソコンの中に入るのも失礼だ。ここでは,その挨拶の言葉がある。 Private Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vkey As Long) As Long 何の意味かは不明だが,「ごめんなさい。ちょっとキーボードを使わせてくださいねっ」というような意味だ。たぶん・・・。こいつを変数の宣言文のあるプログラムの最初に追加しておく。 If GetAsyncKeyState(37) < 0 Then キーボードの→矢印の番号は37(←矢印は38)となっていて,このコードを訳すと,←矢印キーを押した(<0)なら,ラケットのx座標の値を0.3だけ減らしなさい。ということになる。これで,ラケットを動かすことができる。 |
|
10.スタートボタンの挿入
|
|
最後に,実際にゲームをするには,スタートボタンやリセットボタンがあったほうがずっと便利だ。まずスタートボタンをどうやって作るのか。 「開発」のタブをクリックしてコントロールの中の「挿入」からActiveXコントロールを選び,その中のボタンをクリックして,そのままエクセルのグラフの横に広げてはりつける。 Excelの2003までのバージョンの場合,「表示」の「ツールバー」の中に「コントロールツールボックス」というところがある。これをクリックすると同様のものが出てくる。 そのボタンを右クリックすると「コードの表示」が出てくるので,それを選んで,そのボタンが意味するコードを書く。 ボタンの名前は,ボタンを右クリックで「プロパティ」を選びその中の「Capton」にわかりやすい名前を書いておく。 ためしにゲームのスタートとストップのボタン,もう一つは,ブロックのボタン(これを押すとブロックが元の位置に再現される)の2つのコマンドボタンをつくってみた。また,ボールの速さを3段階に変えるスクロールバーをつくった。まずはその通りコードを打ち込んでほしい。参考になるだろう。 |
|
11.最後に
|
|
プログラムを説明することは難しい。これを読んでいる先生にもいろんな方がいて,多少コードを書いたことがある方なら,寝転がって読んでもらえるだろう。マニアックなところはほとんどない。しかし,さっと見ただけで閉じてしまう方もいるだろう。「情報もこんなマニアックな方向にいきたがる人もいるんだよねえ。」と呟きながら・・・。 だいたい,僕自身,物理の研究で,大学でちょっとコードを書いたことがあるぐらいである。 この程度のプログラムで,生徒たちは色んな工夫をして,オリジナルの作品を作ってくれる。昨年の生徒の作品の中には,重力場の中で,バスケットボールをするゲームをつくったものもいる。生徒のほうがずっと頭がいい。それを知るのも,この授業の面白さのひとつかもしれない。
|