今回は、変数を使って時間切れを知らせるタイマーを作ります。具体的に言うと、10秒からカウントダウンして0になったら時間切れを知らせるタイマーです。
ステップ1
まずは変数の作成方法からです。変数はほとんどすべてのプログラムで使用するので、作り方をしっかり覚えましょう。
変数の作成
- スクラッチの画面で[ファイル]->[新規]を選択して新しいプロジェクトを作成し、プロジェクト名を「なぞなぞ」にします。
- [コード]タブ下に縦に並ぶコードの種類から[変数]をクリックします。
- 一番上の[変数を作る]ボタンをクリックします。
- [新しい変数]ボックスが現れるので、[新しい変数名]に半角小文字でtimerと入力して[OK]をクリックします。
- するとボックスが消え、前の変数のコードブロックに戻ります。[変数を作る]ボタンの下に新しく[timer]が作成され、左のチェックボックスにチェックが入っているのが分かります。
- [スプライトリスト]にあるネコのスプライトを削除して、Abbeyを追加します。



(timer)の長円の丸い囲みは変数だということを表しています。またチェックボックスをチェックするとその変数名と値がステージ表示され、チェックをはずすとステージでの表示が消えます。これはプログラムを作成しているとき、変数の値を調べたいときに非常に役立つ機能です。
(timer)の下に(変数)という名前の変数がありますが、これはサンプル用で、通常は使いません。
変数には、その変数の使い道が分かる名前を付けます。たとえばtimerやage、nameなどです。変数という名前では何の変数なのか分かりません。
名前には日本語文字も使えますが、これはスクラッチの場合だけです。他の言語に進む今後のことを考えると、半角の小文字英単語、数字、アンダーバー(_)を使うようにします。
[新しい変数]ボックスの[すべてのスプライト用]を選択して作成した変数は、同じプロジェクトにあるどのスプライトからでも使用できる種類の変数です。[このスプライトのみ]を選択して作成した変数はそのスプライトの中でだけ使用できる種類の変数です。たとえばゲームの得点に使用する変数scoreをどのスプライトからも見えるようにしたい場合はscoreを[すべてのスプライト用]にします。またアビーの年齢をメモしておきたい変数abby_nameは、アビーの年齢を知りたいときにはアビーに聞けばいいので、[このスプライトのみ]から見える変数にします。
今の場合、timerは[すべてのスプライト用]に作成しているので、どのスプライトからでも見ることができます。
ステップ2
アビーにはしゃべらせたいので、Abbyスプライトのコードエリアに記述します。
- [スプライトリスト]でAbbyをクリックし、Abbyのコードエリアを開きます。
- [イベント]->[緑の旗が押されたとき]をドラッグ&ドロップします。
- [変数]->[(timer)を(0)にする]をドラッグし、(2)の下に吸着させます。
- コードブロックの( )は中の文字や数値が変更できることを表しています。今は0が入っているので、半角で10に変更します。
- [緑の旗]ボタンをクリックして、ここまでをテストします。画面左上にある[timer]のオレンジ色の部分には10が表示されます。これは今、変数timerには10という数値が入っているということを示しています。
この操作により、[緑の旗]がクリックされてプログラムがスタートしたとき、変数timerには数値の10が割り当てられます。これはtimerの最初の値なので、初期値(しょきち)と言います。
ステップ3
わたしたちがやりたいのは、10秒から0秒までカウントダウンするタイマーを作ることです。前のステップで変数timerを作り、それに数値の10を入れることはできました。
では、次はどうすればよいでしょう? 次は変数timerの値を1秒ごとに1ずつ減らすことです。

プログラミングで何かやろうとするときには、いきなり全部をやろうとせず、1つずつ考えてみることが重要です。
まずは変数timerの値を10から1減らして9にする方法を考えてみましょう。
- 1秒たつのを待つ => [(1)秒待つ]コードブロックを使う
- 変数timerの値を1小さくする => [(timer)を(1)ずつ変える]コードブロックを使う。1小さくしたいので(1)は(-1)に変更します。
- timerの値は10から9になる
プログラムを実行すると、初め10だったtimerの値が1秒後には9になることが分かります。
ステップ4
10から9に変更できたので、後は同じことを繰り返せばよいことになります。
繰り返すコードブロックは次のようになります。

そして、これはループのブロック、[制御]->[(10)回繰り返す]を使うと、次のようにはるかに短くできます。

ステップ5
時間切れになったら、アビーに「時間切れよ!」と言わせるようにします。
これには[(こんにちは!)と(2)秒言う]コードブロックが使用できます。では、どこに吸着させるのが適切でしょうか?
理屈で(論理的に)言うと、10秒が経過した後です。つまり[(10)回繰り返す]の実行が終わった後です。

[(こんにちは!)と(2)秒言う]は、「こんにちは!」を2秒表示した後、消えます。[(こんにちは!)と言う]は「こんにちは!」と言った後も消えずに残ります。
ステップ5
最後、アビーに絶対に解けないなぞなぞを出させましょう。正解はないので、必ずタイムアウトすることになります。
これには[調べる]->[(あなたの名前は何ですか?)と聞いて待つ]コードブロックを使います。今あるスクリプトで行うカウントダウンとは関係しないので、別に[緑の旗が押されたとき]イベントブロックを追加して、その下に吸着させます。
下図では問題文として「100から1を引くと何色になる?」を入力していますが、何でも構いません。また答え合わせのコードも付けていないので、正解になることはありません。

ただし、アビーが「時間切れよ!」と言って2秒たった後、上図の右のスクリプトは終了しますが(黄色の枠線が消えます)、左のスクリプトはずっとユーザーの入力を待ちつづけます(黄色の枠線がついたまま消えません)。プログラムを終了するには、左上の赤丸の[停止]ボタンをクリックする必要があります。
2秒後に自動的にプログラムを終了させたい場合には、[制御]-[(すべてを止める)]コードブロックを、[(時間切れよ!)と(2)秒言う]の下に吸着させます。

[(すべてを止める)]コードブロックは、全部のスプライトのすべてのスクリプトを強制的に停止させます。ゲームオーバーの状態にしたいときなどに使用できます。
今回のプログラムのコードはこのリンクからダウンロードできます。
