2019.05.31Scratch で始める小学生からのプログラミング
小学生がスクラッチでシューティングゲームを作る8のステップ:敵の動きを作る
サイトを切り替えた際に一つ記事が抜けていたので再掲載します。
みなさま。いかがお過ごしですか。Scratchで始める小学生からのプログラミングとして書いていますが、前回からシューティングゲームを題材に記事を書いています。前回の内容でシューティングゲーム「ネコディウス」の一部ができたかと思います。ネコが空を飛んでいる様子や、ネコからたまを発射する部分も作ることができたかと思います。ゲームとして成立させるためにはやはり敵キャラが必要です。今回は敵キャラをいれてそれらしくしてみましょう。
敵キャラを作っていきましょう。敵キャラはどのようなものでも構わないのですが、今回の例としては、ヘリコプターにします。ヘリコプターをネコとは反対側から表示させて、ネコのいる方の端まで移動させます。動きの流れとして、つぎのような流れを考えました。
スタートしたら次のことを繰り返す
1.ヘリコプターを右端に置く
2.ヘリコプターが左端に行くまでくりかえす
2.1. ヘリコプターのx座標を10だけ左に動かす
2.2. ヘリコプターのy座標を上もしくは下に不規則に移動させる
これの流れを、ブロックをつかって表現していけば、ヘリコプターのプログラムになります。1つずつ考えていきましょう。
最初の「ヘリコプターを右端に置く」ですが、位置を変更させるためには、x 座標、y座標をそれぞれ設定する必要がありました。右端を表すにはどうすればよいでしょうか?ここまで読んでいただいている方はすでに回答が頭に浮かんでいるかもしれませんが、x座標の値を240にすればいいのです。(これがわからない方、過去の記事をチェックです。)y座標はどうすればいいでしょうか。これは色々な考え方がありますが、ゲームというのはパターンが予測できるとあまり面白くないので、私は乱数で設定しています。
次に2の「ヘリコプターが左端に行くまで繰り返す」はどう書けばよいでしょうか。これは次のように考えます。左端というのは、右端の逆なのでx座標が 「-240」 となります。そこで、x座標の値が -240よりも小さいときに左端にたどり着いたと考えます。繰り返すブロックの中に、「○○まで繰り返す」というブロックがあります。このブロックをつかって、左端の判定条件を入れるとできます。ヘリコプターの x座標を変数に保存しておいて、くりかえし判定をするたびにそのx座標の値を確認できるようにしてみましょう。そうすると、「ヘリコプターのx座標 < -240」という式を入れてあげればよいのです。
2.1の「x座標を10だけ左に動かす」はどうでしょう。ここまで理解いただいている方にはもう簡単だと思いますが、10だけ左は、x座標を -10 です。
2.2 「ヘリコプターのy座標を上もしくは下に不規則に移動させる」はどうでしょう。これもすでに前回の記事などを読んでいる方はすぐにわかると思いますが、不規則な動きを作るのは乱数です。上もしくは下というのは、y座標が+の場合が上、—の場合が下ですので、+ から —の幅を持たせてあげればよいのです。あまり変化を大きくし過ぎるとおかしいので、この例では -50 から50 までの間で動かすことにしました。以上をまとめますと、つぎのようなブロックになると思います。ここでは、「ヘリコプターのx座標」、「ヘリコプターのy座標」、「乱数」という3つの変数を使用して記述しています。
ではこれで動かしてみましょう。動かしてみると最初はそれらしく動いていると思うのですが、おかしいことに気がつくはずです。つぎのような画面になりませんでしたでしょうか?
そうです。ヘリコプターが画面から消えてしまうのです。書いたプログラムの何が問題だったのでしょうか?本当はこれを問題として考えてもらいたいのですが、今回は理由を示します。すぐに気づかれる方もいるとは思いますが、y座標の値を乱数で変更させた場合に、何度か変更していくうちに値が最大の180もしくは、最小の-180の範囲をはみ出してしまうのです。そうすると画面に表示がされなくなってしまいます。この問題を直す必要があります。どうしたらよいでしょうか?
つぎのように考えました。
1. もし、乱数を足したヘリコプターのy座標が -180 から 180 までの中にある場合は、次のことをする
1.1. ヘリコプターのy座標の値を、y座標と乱数を足した値にする。
そうではない場合は、次のことをする
1.2. ヘリコプターのy座標の値を、y座標から乱数を引いた値にする。
今回の記事で重要なのは、条件文や条件判定の考え方を理解する点だと思いますが、まさにこの部分はそれに当たります。1で記載している、「もし、、、ならばA、そうでなければ、Bをする」というのはプログラミングを行う際に理解しておかなければならない重要な要素の一つです。条件判定がかけると色々なプログラムを書くことができるようになります。ここでの条件は先ほど書いているように、y座標の値が -180から180までの間にある必要があるので、これを式で表現します。
演算のところのブロックを見てください。比較をする「○<○」というブロックがありますが、これは値が2つしかかけません。ではどうやってこれを記述したらよいでしょうか。2つの式が両方成り立つときです。
-180 < ヘリコプターのy座標
ヘリコプターのy座標 < 180
これを条件文として一つの式にするにはどうしたら良いでしょうか?これは少々難しい話になるのですが、簡単に書きますと、
-180 < ヘリコプターのy座標 (条件A)
ヘリコプターのy座標 < 180 (条件B)
条件Aと条件Bが同時に成り立つことを式に書くことになります。小学生からといいつつ、この部分は小学校では習わないので若干恐縮ですが、いわゆる数学の証明問題を思い出していただければわかります。(図形Aと図形Bは合同であるとか、、、中学生ですね。)小学生でも分かる話を例にすると、四角形が正方形であるためには次の条件をみたすことが必要です。
すべての角度が等しい(90度である) (条件A)
すべての辺の長さが等しい (条件B)
の2つが成り立たないと正方形にならないと教わります。(条件Aだけだと長方形、条件Bだけだとひし形ですよね。)この条件をそれぞれ条件A、条件Bと呼んだときに、式では、「条件A “かつ” 条件B」と表現します。四角形が正方形である条件は、
「すべての角度が等しい」 かつ 「すべての辺の長さが等しい」
です。これを先ほどのヘリコプターに当てはめますとこのようになります。
「-180 < ヘリコプターのy座標」 かつ 「ヘリコプターのy座標 < 180」
となります。これをブロックで表現してあげればよいのです。演算のカテゴリのブロックを見ていただければわかりますが、「○ かつ ○」というブロックがありますので、これを使います。つぎのような内容で記述してみました。乱数を足す部分で、-180 から 180 の範囲に入らなかった時の座標計算のときに、乱数に2かけていますが(*の記号はかけ算の意味)これは真ん中の方に戻りやすくするためにそうしています。
すでに絶対値の概念を理解している方は当然、
ヘリコプターのy座標の絶対値 < 180
なんて式を思いつくはずですが、もちろんこれでも同じ動きになります。これはご自分で試してみてください。
今回は敵の動きを作りました。プログラミングを行う場合の考え方がわかるように、作り方の過程を書いているつもりです。流れをおおまかにまず決めて、細かい問題に分けて考えていくのです。また、条件文の説明をしています。この部分は、大学の講義だと論理学としてもっとガッツリとやるのですが、少々難しすぎる気がするので、まずはこのレベルで留めておきます。違う機会にもう少し詳細に書きたいと思います。
ただ、気づかれていると思いますが、実はこの内容だけでは、ヘリコプターが飛んで来るだけで、撃ち落とせないです。。。またこれを書き始めると長くなるので次回にて説明させていただきます。
作り方が理解できてくると、自分で好きなモノを作ることができるようになってきます。これを理解するには、やはり経験が大事。自分で何度もやってみることです。私どもの教室では、このような経験をくりかえし積んでいくことで、クリエイティブな人材を育てていきます。ぜひ、ご参加ください。お待ちしております。
東京都文京区小石川で小学生、中学生、高校生を対象としたプログラミング&ロボット教室を開校しています。スクラッチはジュニアコースで受講できます。創造性や協調作業などこれからの時代に必要となる素養を育てるコースです。ご興味ありましたらぜひお問い合わせください。
また、夏休みの企画として、サマースクールを実施します。ここで取り上げているスクラッチやロボットプログラミングを体験できる内容となっています。詳細はこちらでご確認ください。ご参加お待ちしております。
問い合わせをする
みなさま。いかがお過ごしですか。Scratchで始める小学生からのプログラミングとして書いていますが、前回からシューティングゲームを題材に記事を書いています。前回の内容でシューティングゲーム「ネコディウス」の一部ができたかと思います。ネコが空を飛んでいる様子や、ネコからたまを発射する部分も作ることができたかと思います。ゲームとして成立させるためにはやはり敵キャラが必要です。今回は敵キャラをいれてそれらしくしてみましょう。
ステップ5:敵キャラの動きを作る
敵キャラを作っていきましょう。敵キャラはどのようなものでも構わないのですが、今回の例としては、ヘリコプターにします。ヘリコプターをネコとは反対側から表示させて、ネコのいる方の端まで移動させます。動きの流れとして、つぎのような流れを考えました。
スタートしたら次のことを繰り返す
1.ヘリコプターを右端に置く
2.ヘリコプターが左端に行くまでくりかえす
2.1. ヘリコプターのx座標を10だけ左に動かす
2.2. ヘリコプターのy座標を上もしくは下に不規則に移動させる
これの流れを、ブロックをつかって表現していけば、ヘリコプターのプログラムになります。1つずつ考えていきましょう。
1.ヘリコプターを右端に置く
最初の「ヘリコプターを右端に置く」ですが、位置を変更させるためには、x 座標、y座標をそれぞれ設定する必要がありました。右端を表すにはどうすればよいでしょうか?ここまで読んでいただいている方はすでに回答が頭に浮かんでいるかもしれませんが、x座標の値を240にすればいいのです。(これがわからない方、過去の記事をチェックです。)y座標はどうすればいいでしょうか。これは色々な考え方がありますが、ゲームというのはパターンが予測できるとあまり面白くないので、私は乱数で設定しています。
2.ヘリコプターが左端に行くまでくりかえす
次に2の「ヘリコプターが左端に行くまで繰り返す」はどう書けばよいでしょうか。これは次のように考えます。左端というのは、右端の逆なのでx座標が 「-240」 となります。そこで、x座標の値が -240よりも小さいときに左端にたどり着いたと考えます。繰り返すブロックの中に、「○○まで繰り返す」というブロックがあります。このブロックをつかって、左端の判定条件を入れるとできます。ヘリコプターの x座標を変数に保存しておいて、くりかえし判定をするたびにそのx座標の値を確認できるようにしてみましょう。そうすると、「ヘリコプターのx座標 < -240」という式を入れてあげればよいのです。
2.1 x座標を10だけ左に動かす
2.1の「x座標を10だけ左に動かす」はどうでしょう。ここまで理解いただいている方にはもう簡単だと思いますが、10だけ左は、x座標を -10 です。
2.2 ヘリコプターのy座標を上もしくは下に不規則に移動させる
2.2 「ヘリコプターのy座標を上もしくは下に不規則に移動させる」はどうでしょう。これもすでに前回の記事などを読んでいる方はすぐにわかると思いますが、不規則な動きを作るのは乱数です。上もしくは下というのは、y座標が+の場合が上、—の場合が下ですので、+ から —の幅を持たせてあげればよいのです。あまり変化を大きくし過ぎるとおかしいので、この例では -50 から50 までの間で動かすことにしました。以上をまとめますと、つぎのようなブロックになると思います。ここでは、「ヘリコプターのx座標」、「ヘリコプターのy座標」、「乱数」という3つの変数を使用して記述しています。
ステップ6;条件文を書く
ではこれで動かしてみましょう。動かしてみると最初はそれらしく動いていると思うのですが、おかしいことに気がつくはずです。つぎのような画面になりませんでしたでしょうか?
そうです。ヘリコプターが画面から消えてしまうのです。書いたプログラムの何が問題だったのでしょうか?本当はこれを問題として考えてもらいたいのですが、今回は理由を示します。すぐに気づかれる方もいるとは思いますが、y座標の値を乱数で変更させた場合に、何度か変更していくうちに値が最大の180もしくは、最小の-180の範囲をはみ出してしまうのです。そうすると画面に表示がされなくなってしまいます。この問題を直す必要があります。どうしたらよいでしょうか?
条件判定を作る
つぎのように考えました。
1. もし、乱数を足したヘリコプターのy座標が -180 から 180 までの中にある場合は、次のことをする
1.1. ヘリコプターのy座標の値を、y座標と乱数を足した値にする。
そうではない場合は、次のことをする
1.2. ヘリコプターのy座標の値を、y座標から乱数を引いた値にする。
今回の記事で重要なのは、条件文や条件判定の考え方を理解する点だと思いますが、まさにこの部分はそれに当たります。1で記載している、「もし、、、ならばA、そうでなければ、Bをする」というのはプログラミングを行う際に理解しておかなければならない重要な要素の一つです。条件判定がかけると色々なプログラムを書くことができるようになります。ここでの条件は先ほど書いているように、y座標の値が -180から180までの間にある必要があるので、これを式で表現します。
複数の条件が成り立つとき
演算のところのブロックを見てください。比較をする「○<○」というブロックがありますが、これは値が2つしかかけません。ではどうやってこれを記述したらよいでしょうか。2つの式が両方成り立つときです。
-180 < ヘリコプターのy座標
ヘリコプターのy座標 < 180
これを条件文として一つの式にするにはどうしたら良いでしょうか?これは少々難しい話になるのですが、簡単に書きますと、
-180 < ヘリコプターのy座標 (条件A)
ヘリコプターのy座標 < 180 (条件B)
条件Aと条件Bが同時に成り立つことを式に書くことになります。小学生からといいつつ、この部分は小学校では習わないので若干恐縮ですが、いわゆる数学の証明問題を思い出していただければわかります。(図形Aと図形Bは合同であるとか、、、中学生ですね。)小学生でも分かる話を例にすると、四角形が正方形であるためには次の条件をみたすことが必要です。
すべての角度が等しい(90度である) (条件A)
すべての辺の長さが等しい (条件B)
の2つが成り立たないと正方形にならないと教わります。(条件Aだけだと長方形、条件Bだけだとひし形ですよね。)この条件をそれぞれ条件A、条件Bと呼んだときに、式では、「条件A “かつ” 条件B」と表現します。四角形が正方形である条件は、
「すべての角度が等しい」 かつ 「すべての辺の長さが等しい」
です。これを先ほどのヘリコプターに当てはめますとこのようになります。
「-180 < ヘリコプターのy座標」 かつ 「ヘリコプターのy座標 < 180」
となります。これをブロックで表現してあげればよいのです。演算のカテゴリのブロックを見ていただければわかりますが、「○ かつ ○」というブロックがありますので、これを使います。つぎのような内容で記述してみました。乱数を足す部分で、-180 から 180 の範囲に入らなかった時の座標計算のときに、乱数に2かけていますが(*の記号はかけ算の意味)これは真ん中の方に戻りやすくするためにそうしています。
すでに絶対値の概念を理解している方は当然、
ヘリコプターのy座標の絶対値 < 180
なんて式を思いつくはずですが、もちろんこれでも同じ動きになります。これはご自分で試してみてください。
まとめ
今回は敵の動きを作りました。プログラミングを行う場合の考え方がわかるように、作り方の過程を書いているつもりです。流れをおおまかにまず決めて、細かい問題に分けて考えていくのです。また、条件文の説明をしています。この部分は、大学の講義だと論理学としてもっとガッツリとやるのですが、少々難しすぎる気がするので、まずはこのレベルで留めておきます。違う機会にもう少し詳細に書きたいと思います。
ただ、気づかれていると思いますが、実はこの内容だけでは、ヘリコプターが飛んで来るだけで、撃ち落とせないです。。。またこれを書き始めると長くなるので次回にて説明させていただきます。
作り方が理解できてくると、自分で好きなモノを作ることができるようになってきます。これを理解するには、やはり経験が大事。自分で何度もやってみることです。私どもの教室では、このような経験をくりかえし積んでいくことで、クリエイティブな人材を育てていきます。ぜひ、ご参加ください。お待ちしております。
東京都文京区小石川で小学生、中学生、高校生を対象としたプログラミング&ロボット教室を開校しています。スクラッチはジュニアコースで受講できます。創造性や協調作業などこれからの時代に必要となる素養を育てるコースです。ご興味ありましたらぜひお問い合わせください。
また、夏休みの企画として、サマースクールを実施します。ここで取り上げているスクラッチやロボットプログラミングを体験できる内容となっています。詳細はこちらでご確認ください。ご参加お待ちしております。
お問い合わせはこちら!
問い合わせをする