スクラッチプログラミング

5-4 フグをあやつれ!

今回は、キーボードでスプライトを操作する、少しゲーム調のプログラムを作成します。練習のテーマはもちろん変数です。

ステップ1

  1. スクラッチの画面で新しいプロジェクトを作成し、プロジェクト名として「フグとサメ」を入力します。
  2. ネコのスプライトを削除し、フグ(Pufferfish)とサメ(Shark2)をプロジェクトに読み込みます。
  3. フグとサメのスプライトをステージの下図の位置に置きます。

ステップ2

まずはフグのスクリプトを作成しましょう。

  1. Pufferfishスプライトを選択し、Pufferfishのコードエリアを開きます。
  2. [緑の旗が押されたら]イベントブロックをドラッグ&ドロップします。
  3. フグの位置を(-172, -82)にします。そのためには[動き]->[x座標を(-172)、y座標を(-82)にする]を使います。

ステップ3

フグの移動スピードに使う変数speedを作成します。

  1. [変数]->[変数を作る]ボタンをクリックします。
  2. [新しい変数]ボックスの[]新しい変数名]にspeedと入力して、[OK]をクリックします。
  3. [(speed)を(0)にする]をドラッグ&ドロップします。

  4. これで変数speedには数値の0が入ります。これを、変数speedを0で初期化した、と言います。

ステップ4

では、フグを動かしていきましょう。フグを動かすには、Pufferfishスプライトに[動き]->[(10)歩動かす]ブロックを使用します。この歩数は移動量で、大きいほど速く動き、小さいほどゆっくり動いているように見えます。

10歩動かすと10歩分移動するだけで、連続して動いているようには見えません。連続して動いているように見せるには、[ずっと]ブロックの中に入れて、[ずっと][(10)歩動かす]ようにします。

[緑の旗]ボタンをクリックしてプログラムを実行します。ふぐはスタート位置(-172,-82)から右に連続して移動し、ステージ右端に消えます。赤丸の[停止]ボタンをクリックして、プログラムを停止します。

今度は歩数の10を5に変更します。半角です。[緑の旗]ボタンをクリックしてプログラムを実行すると、フグは前と同じようにスタート位置に移動した後、右に移動を開始しますが、スピードが前より遅くなっていることが分かります。[停止]ボタンをクリックします。

ステップ5

フグは今、10か5という決め打ちをした、実際の数値で動いていますが、変数を使っても動かすことができます。

  1. [変数]-[(speed)]をドラッグして、[( )歩動かす]の( )の上でドロップします。
  2. プログラムを実行します。フグはスタート位置に移動しますが、その後動きません。なぜでしょう?
    今speedの値は0で、動かすブロックが[(0)歩動かす]になっているからです。
    [(5)歩動かす]ようにするには、speedに5を入れる必要があります。

  3. プログラムを実行します。今度は右に移動します。
  4. フグのスプライトは、[ずっと]ブロック内の[(speed)歩動かす]ブロックを実行するとき、変数speedを見つけると、毎回その中を調べます。すると毎回、中には数値の5が入っているので、変数をその値に置き換えて[(5)歩動かす]を実行します。

  5. speedを10にしてプログラムを実行します。今度はもっと速く移動します。

ステップ6

キーボードの右矢印キーをプログラムに組み込みます。ここから少しゲームっぽくなっていきます。

  1. [(speed)を(10)にする]の10を0に戻します。数値は必ず半角で入力します。
  2. [イベント]-[(スペース)キーが押されたとき]をドラッグ&ドロップして、新しいスクリプトを開始します。
  3. (スペース)の右の下向き三角をクリックして、[右向き矢印]を選択します。

ここは重要なポイントです。上に[緑の旗が押されたとき]があるスクリプト(ブロックのひとかたまり)は、ステージ左上の[緑の旗]ボタンがクリックされたら実行されます。これに対し、上に[(右向き矢印)キーが押されたとき]があるスクリプトは、キーボードの右矢印キーが押されたときに実行されます。つまり2つのスクリプトはそれぞれ開始のきっかけが異なり、押されなければずっと実行されません。

[緑の旗が押されたとき]と[(右向き矢印)キーが押されたとき]コードブロックの形を見ると分かりますが、両方とも他のブロックの下には吸着しない形状になっていて、スクリプトの一番上にしか来ません。

ステップ7

右矢印キーで右に動くようにしましょう。

  1. [変数]-[(speed)を(0)にする]をドラッグして、[(右向き矢印)キーが押されたとき]に吸着させます。
  2. [(speed)を(0)にする]の0を5に変更します。
  3. [緑の旗]をクリックします。ステージ左上の[speed]は(0)になっていて、フグは動きません。
  4. 気ボードの右矢印キーを押します。するとフグは右に移動します。[speed]は(5)になります。

なぜフグは、[緑の旗]のクリックで動かず、右矢印キーの押し下げで動くのか、理由を考えてみましょう。
[緑の旗]のクリックでは、speedが0なので、[ずっと]ブロックの中で何回[(speed)歩動かす]を実行しても、[(0)歩動かす]なので、動きません。
しかし、右矢印キーの押し下げでspeedは5になります。すると、[ずっと]ブロックの中の(speed)が5になるので、[(5)歩動かす]が実行されることになって、右に移動します。

では、[緑の旗]をクリックせず、右矢印キーを押すとフグは移動しません。これはなぜでしょう? 考えてみてください。

speedの値は[変数]-[(speed)を1ずつ変える]でも変更することができます。このブロックを使うと、変数の値が1ずつ大きくなるので、今の場合で言うと、0,1,2,…と変化し、フグはスピードアップすることになります。具体的に言うと、speedは最初0でフグは動きませんが、1回右矢印キーを押すとspeedは1になるので右にゆっくりのスピードで動きます。もう一度右矢印キーを押すとspeedは2になるので、倍のスピードになります。

ステップ8

止まる機能をフグに加えます。下矢印キーが押されたらspeedを0にする、というイベントブロックを新たに加えます。

  1. [イベント]-[(スペース)キーが押されたとき]をドラッグ&ドロップして、新しいスクリプトを開始します。
  2. (スペース)の右の下向き三角をクリックして、[下向き矢印]を選択します。
  3. [変数]->[(speed)を(0)にする]をドラッグ&ドロップします。
  4. プログラムを実行してテストします。右矢印キーを押すとフグは右に移動し、下矢印キーを押すと止まります。

フグのスプライトの[ずっと]ブロック内の[(speed)歩動かす]コードブロックによって、フグはずっとspeedの影響を受けることになります。たとえば右向き矢印キーを1回押すとspeedは1になるので、[(1)歩動かす]ブロックによってフグはゆっくり右に移動します。右向き矢印キーをもう1回押すとspeedは1大きくなり2になるので、[(2)歩動かす]ブロックによって加速して右に移動します。そして下向き矢印キーを押すとspeedは0になるので、[(0)歩動かす]ブロックによって、動きが止まります。

変数の値をあるイベントブロックで変えると、その効果か別のイベントブロックで現れるのが、変数の面白いところです。これは、各イベントブロックのコードが変数を含む命令を実行するとき、同じ変数の箱の中身(値)を見に行っているからです。

ステップ9

サメにスクリプトを設定して、フグの方を向くようにしましょう。

  1. [Shark2]スプライトをクリックし、Shark2のコードエディタに移ります。
  2. [緑の旗が押されたとき]イベントブロックをドラッグ&ドロップします。
  3. [動き]->[回転方法を[左右のみ]にする]をドラッグして(2)に吸着させます。
  4. [動き]->[(90)度に向ける]をドラッグして(3)に吸着させ、90を-90に変更します。

[回転方法を[左右のみ]にする]は、[スプライトリスト]でShark2を選択し、[スプライト]の[向き]のクリックで表示される回転方法の真ん中の[左右のみ]をクリックして選択するのと同じです。また[(-90)度に向ける]は、回転のボタンの上にある円の真左に向けることです。

ステップ10

サメがふぐをずっと見ていたら、ふぐは通り抜けられそうにないので、サメが時々姿を消すようにしましょう。

  1. [制御]->[ずっと]をドラッグして、[(-90)度に向ける]の下にドロップします。
  2. [ずっと]のへこみの中に、[見た目]-[表示する]と[制御]-[(1)秒待つ]をドラッグします。
  3. その下に、[見た目]-[隠す]と[制御]-[(1)秒待つ]をドラッグします。

  4. このコードブロックを実行するとどうなるか想像できますか? [ずっと]内に入れた4つのブロックの働きを考えながら、想像してみてください。

  5. 最後に、[変数]にある(speed)ブロックのチェックマークをクリックして外します。これにより、ステージ左上にある変数speedの表示が消えます。

変数の値は、プログラムがスタートするときに値を入れるようにします(初期化と言います)。変数の初期値は数値の0である必要はありません。プログラムによって変わります。

今回のプログラムのコードはこのリンクからダウンロードできます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です