この記事は、当サイトの「スイカゲーム(初級編)」をクリアできた小学生を対象としています。初級編をまだ解いていない方は、まずは初級編の内容をご確認ください。上級編は、初級編のプログラムの問題点を改善する内容となっています。
目次
1.【はじめに】スイカゲーム(初級編)の問題点と解決策
【問題点】同じようなプログラムがいくつも存在する
下のプログラムは進化するフルーツのコードです。初級編では、進化するフルーツの数だけスプライトを用意しました。コードの形がとてもよく似ていますよね?ブロックひとつひとつを確認してみてください。形だけでなく中身までほとんど同じです。
同じようなプログラムがいくつも存在する場合、そのプログラムの保守性や拡張性は低い
「保守性」とは、プログラムの修正のしやすさのことです。例えば、スプライト「1_イチゴ」のコードの中にバグがあったとします。「1_イチゴ」のコードの修正だけで済めばいいですが、「2_リンゴ」や「3_バナナ」、「4_スイカ」のコードの修正も必要になるケースがほとんどだと思います。バグがあったときに、色んなところで同じような修正をしないといけないのは「保守性が低い」ということになります。
「拡張性」とは、機能の追加のしやすさのことです。スイカゲームの場合、進化するフルーツの数を増やしたり減らしたりしたいと考える人は多いと思います。例えば、「2_リンゴ」と「3_バナナ」の間に「オレンジ」の進化を入れたいとします。他のフルーツのコードをコピペしたり、スプライトを複製して「オレンジ」を作りますか?もっと簡単にフルーツを追加できる「拡張性が高い」作り方があります。
それでは、初級編の問題点であるプログラムの「保守性」と「拡張性」を改善する方法について解説していきます。
【解決策】同じ特徴をもったスプライトは、ひとつのスプライトにまとめる
初級編では、フルーツの数だけスプライトを用意しました(下図の左)。「イチゴ」「リンゴ」「バナナ」「スイカ」のスプライトをそれぞれ作成しています。このような作りにすると、同じプログラムが色んなところに書かれることになり保守性や拡張性は低くなります。
初級編の考え方
上級編の考え方
これを解決するために、上級編では「フルーツ」をひとつのスプライトにまとめます(上図の右)。スイカゲームの「フルーツ」は、①「同じ種類のフルーツ同士が触れると進化」する特徴と、②「地面に落下」するという特徴があります。違うのは、フルーツの見た目ぐらいです。①と②の特徴をもったスプライトをひとつ作成し、フルーツの違いは「コスチューム」や「クローン」を使って表現するのです。これは、本格的なプログラミング言語で使われる「オブジェクト指向」という考え方に該当します。
2.【全体像を理解する】スイカゲーム(上級編)
主なスプライト
①スプライト「地面」のコスチューム
地面のスプライトを用意します。地面のスプライトは、フルーツと地面の当たり判定を調べるために使います。
「●色に触れた」ブロック(●には、地面の色が入ります)を使って判定することもできますが、色を使った判定は100%正しいわけではないので私はあまり使わないようにしています。
②スプライト「落とすフルーツ」のコスチューム
「落とすフルーツ」は、プレイヤーが落とす場合と、進化して落ちる場合の2パターンあります。プレイヤーが落とす場合は、イチゴ、リンゴ、バナナのどれかです。進化して落ちる場合は、リンゴ、バナナ、スイカのどれかです。どちらのパターンも「落ちる」という同じ特徴をもつので、ひとつのスプライトとしてまとめます。
③スプライト「地面の上のフルーツ」のコスチューム
地面の上にあるフルーツは、下記の4種類です。②スプライト「落とすフルーツ」と同じ内容ですね。
④スプライト「星」のコスチューム
フルーツが進化する際の見た目を、華やかにするために利用します。
スプライト間のメッセージ関連図
スプライトのイベントや、イベント間のメッセージの関係を示した図です。「メッセージ」を出す側と、「メッセージ」を受け取る側をよく確認しておきましょう。
3.【プログラミング】してみよう
完成した作品はこちらにあります。難しいところは真似してみてください。
変数を作成する
No | 変数名 | 変数の種類 | 使い方 | どんな値が入る? |
---|---|---|---|---|
1 | 【クローン用】フルーツID | 変数 このスプライトのみ | 「地面の上のフルーツ」のクローンを識別するために利用します | 数字 (1,2,3,4,・・・) |
2 | 【定数】進化1番目のフルーツ名 | 変数 全てのスプライト用 | ステージのコードの中でフルーツ名をセットしています | 定数 (イチゴ) |
3 | 【定数】進化2番目のフルーツ名 | 変数 全てのスプライト用 | ステージのコードの中でフルーツ名をセットしています | 定数 (リンゴ) |
4 | 【定数】進化3番目のフルーツ名 | 変数 全てのスプライト用 | ステージのコードの中でフルーツ名をセットしています | 定数 (バナナ) |
5 | 【定数】進化4番目のフルーツ名 | 変数 全てのスプライト用 | ステージのコードの中でフルーツ名をセットしています | 定数 (スイカ) |
6 | 【定数】落とすフルーツのY座標 | 変数 全てのスプライト用 | 上からフルーツを落とすときのY座標 | 150 |
7 | 新しく落ちたフルーツID | 変数 全てのスプライト用 | スプライト「地面の上のフルーツ」の中の【「進化したのでフルーツを削除」を受け取ったとき】内のコードで利用します | 「【クローン用】フルーツID」の値 |
8 | 進化後のX座標 | 変数 全てのスプライト用 | 進化するフルーツの中間のX座標をセットします | 数字 (x座標) |
9 | 進化後のY座標 | 変数 全てのスプライト用 | 進化するフルーツの中間のY座標をセットします | 数字 (y座標) |
10 | 進化後のフルーツのコスチューム番号 | 変数 全てのスプライト用 | フルーツが落下したときに進化したか、していないかを判断するために利用。進化の場合は数字が入る | 空:進化なし 2:リンゴ 3:バナナ 4:スイカ |
11 | 落ちてきたフルーツに当たったフルーツID | 変数 全てのスプライト用 | スプライト「地面の上のフルーツ」の中の【「進化したのでフルーツを削除」を受け取ったとき】内のコードで利用します | 「【クローン用】フルーツID」の値 |
すべてのプログラム
① スプライト「地面」のプログラム
このスプライトにプログラムはありません。
② スプライト「落とすフルーツ」のプログラム
③ スプライト「地面の上のフルーツ」のプログラム
④ スプライト「星」のプログラム
⑤ スプライト「タイトル」のプログラム
⑥ スプライト「右矢印」のプログラム
⑦ スプライト「左矢印」のプログラム
⑧ ステージ「背景」のプログラム
4.【確認】フルーツを追加してみよう!
それでは、進化するフルーツに「オレンジ」を追加してみましょう。進化の順番は、下記の通りにしました。
コスチュームの追加
スプライト「落とすフルーツ」と「地面の上のフルーツ」に、「オレンジ」のコスチュームを追加しましょう。
変数を追加する
フルーツの数が増えるので、以下の変数を追加します。
No | 変数名 | 変数の種類 | 使い方 | どんな値が入る? |
---|---|---|---|---|
12 | 【定数】進化5番目のフルーツ名 | 変数 全てのスプライト用 | ステージのコードの中でフルーツ名をセットしています | 定数 (スイカ) |
「落とすフルーツ」のプログラムの修正
落とすフルーツは、「1:イチゴ」、「2:リンゴ」、「3:オレンジ」、「4:バナナ」です。
「地面の上のフルーツ」のプログラムの修正
4番目のフルーツの進化の設定を追加します。
「ステージ」のプログラムの修正
進化するフルーツの名前を追加、修正します。
まとめ
初級編の問題点を解決する方法を解説しました。フルーツの追加や削除が簡単にできるようになったと思います。保守性や拡張性の高いプログラムを書くことは難しく、時間もかかります。しかし、後からプログラムを修正したいときにとても役に立ちます。スクラッチに慣れてきた人は、ぜひオブジェクト指向の考え方をマスターしてみてください。
下のレースゲーム「ロードファイター」もオブジェクト指向を使ってプログラミングしています。次は、こちらも挑戦してみてください。