弾の発射のプログラミング的考え方

弾の発射のプログラミング的考え方

明けましておめでとうございます。今年もどうぞよろしくお願い致します。

昨年は、プログラミング教育、プログラミング授業、プログラミング講師になるための学びなどについて書かせていただきましたが、今年は、実際の開発技術について書くことにします。

プログラミング開発にはさまざまなプログラミング言語が使われています。しかし、どの言語を使っても、プログラミングの考え方はほとんど同じです。これは数学問題を解くのと似たような感じになります。例えば、ある数学の問題を見て、この問題は、因数分解すれば、答えを出すことができます。このとき、難しいのが因数分解自体ではなく、因数分解を使うことを思いつくかどうかです。これはたくさんの練習問題を解いて、上記の問題と似たような問題であれば、因数分解すれば解けると判断できます。

実は、プログラミングも同じです。変数、条件分岐、繰り返しなどの文法を学んで、使えるようになりましたが、実際の問題が目の前に出されましたら、なかなかプログラムを書けない生徒が多いです。これは、練習不足が原因ですが、何が練習不足かというと、その種の問題に対しての解き方の理解が不足しているからです。そのため、この種の問題の解き方を理解して、さらに似たような問題をたくさん解く訓練が必要です。しかし、解き方を理解するには、日々の考える練習が必要です。リアルの世界でどのような仕組みで物事が動いているか、その本質を知ることが非常に重要です。当たり前のことでもその裏に隠されている仕組みを見抜いて、説明できるように訓練するのが重要です。

Scratchを教えているとき、シューティングゲームという課題がよく出されます。スペースキーを押すと、弾が発射されます。では、この「発射」の部分はどのように作ればいいでしょうか?言い返せば、発射の仕組みは何でしょうか?

私の塾の生徒に聞いてみると、ほとんどの生徒は、「スペースキーが押されたら、弾はずっと上に進みます。」と答えてくれます。プログラムは以下のようになります。

確かに、合っているように見えます。シンプルでわかりやすいプログラムです。ずっとの使い方も、y座標の理解もちゃんとできて使っています。しかし、この「発射」の仕組み(考え)には漏れがあります。みなさん、わかりますか?

答えは発射のスタート位置の設定です。つまり、弾のどの位置からずっと上に進むか、プログラミングされていません。そうなると、発射という動きは不完全になります。プログラムからいうとバグが残っています。さらに、「ずっと」という命令を使っていますが、本当に「ずっと」上に進んでもらっていいでしょうか?

現実の世界では、銃から弾が発射されると、弾はしばらくずっと進みます。しかし障害物に当たったり、空気抵抗があるので弾の軌道がどんどん落ちたり、最終的にはどこかで止まります。では、ゲームの場合、どう考えればいいでしょうか?

ゲームの場合、無駄な処理を書かないことが重要です。つまり、弾が画面の上の端に辿り着きましたら、これ以上「上に進む」必要がありません。永遠に続く「ずっと」の命令を使うのではなく、限定的な繰り返し命令を使うのが正しいです。

今回の発射部分のプログラムはこうなります。

まず、x座標とy座標を設定することで弾が発射されるスタート位置を設定します。それから、「〜まで繰り返す」命令を使って、上の端までのみ移動を繰り返しを実行させます。「表示する」と「隠す」命令は、弾がより視覚的に自然に動くように見えるために、加えた命令です。

上記の命令を見ればわかります。弾の発射は思うほど簡単ではありません。「スペースキーが押されたらずっと上に進む」という人間っぽい考え方は、プログラミングの視点からみると穴だらけの考え方になります。比較してみれば、人間の適当な考え方とプログラミングの厳密な考え方が見えます。私達がプログラミングを教えているとき、このプログラミングの厳密な考え方を生徒に教えないといけないです。普段あまり考えていないことを、プログラミングを通して、気づくことがかなり多いです。

今回、発射という部分からプログラミング的考え方を説明しました。今後もこのような実例を紹介します。プログラミングを学ぶ時、教える時、ご参考になれば幸いです。

img_avater_nakayama

中山 涼一

こどもICT教育支援センター センター長

2014年に関西初のこども向けプログラミング教室「未来学校プログラミング教室」を創設。800名以上の指導実績を誇るプログラミング教育のスペシャリスト。

プロフィール