繰り返しと「止める」ボタン
![tutorial-loop.png](/images/docs/tutorial/tutorial-loop.png)
想定時間: 10分
今回の内容
- 決まった回数だけ繰り返してみよう
- ずっと繰り返してみよう
コンピューターは繰り返すことが得意
コンピューターは、プログラムを上から順に書かれている通り実行していきます。それだけでなく、実はコンピューターは「同じことを何度も繰り返す」ことも得意です。
特に、人間では到底できない回数をコンピューターはこなすことができます。例えば、円周率を求める方法としてモンテカルロ法という計算方法があります モンテカルロ法を使った円周率の計算 が、それでは数多くの点をランダムに描いていくことが求められます。コンピューターを使うと、高速に数万個の点を描いて計算することができます。
🗒️覚えよう
コンピューターは、同じ処理を何度も繰り返し行うことが得意
プログラムは基本的に上から順に命令が実行されますが、コンピューターに「ある行からある行までを繰り返し行ってください」とお願いすることができます。このチュートリアルでは、コンピューターに同じことを何度もやってもらうためのプログラムの書き方を試してみましょう。
※ このチュートリアルでは、スプライトを使います。「 スプライトを使ってみよう 」でスプライトの簡単な使い方を習得することができますので、まだの方はぜひ試してください。
決まった回数だけ繰り返してみよう
コンピューターに繰り返し行って欲しいことについて、前もって行って欲しい回数が決まっているときは、 for 命令 を使います。
ここでは、「男の子を 5 歩だけ右に移動してもらう」というプログラムを考えてみましょう。さっそく新しいプロジェクトを作って、以下のプログラムをボタンを使ってエディターにコピー&ペーストしてください。
cls
sprite 0,3
x=100
show 0,(x,100)
pause 100
x=x+32
show 0,(x,100)
pause 100
x=x+32
show 0,(x,100)
pause 100
x=x+32
show 0,(x,100)
pause 100
x=x+32
show 0,(x,100)
pause 100
x=x+32
show 0,(x,100)
pause 100
※ sprite 命令 を使って、スプライト番号とアニメーション番号を指定することで、あるスプライトにアニメーションを割り当てています。
※ pause 命令 は、パラメーターで指定した時間だけプログラムの実行を停止します。ここでは、スプライトを表示して、100 ミリ秒(1/10 秒です)停止して、を繰り返しています。
※ show 命令 は、スプライトをパラメーターで指定した位置に表示します。
「実行」ボタンを押して、実行してみましょう。
男の子のキャラクターが、右方向に移動したことがわかります。
上のプログラムを見てみると、同じようなプログラムが何回も書かれています。
show 0,(x,100)
pause 100
x=x+32
これがまだ 5 回程度なので良いのですが、もっともっと回数が多くなってしまっては、プログラムがどんどん長くなってしまいますし、プログラムを入力していくだけでも大変です。
そこで for 命令の登場です。上のプログラムは、以下のように短くすることができます。何度も同じようなプログラムを書かなくても大丈夫です。
cls
sprite 0,3
x=100
for i=1 to 6
show 0,(x,100)
pause 100
x=x+32
next
エディターのプログラムを消した後に、このプログラムをボタンを使ってエディターにコピー&ペーストしてください。
「実行」ボタンを押して、プログラムを実行してください。先ほどと全く同じように、男の子が右方向に移動することがわかります。
4 行目の「for i=1 to 6」という行を日本語にすると、
- 変数 i の数値が 1 から 6 まで、for 命令から next 命令の間にある命令を繰り返し実行する。
になります。1〜6 なので、合計で 6 回繰り返されていることになります。
🗒️覚えよう
for 命令を使うと、同じ処理を決まった回数だけ繰り返すことができる
ここで、5〜7 行目には、行の先頭に空白が 2 つ入力されていることに気がつきましたでしょうか?これは「インデント(字下げ)」というテクニックです。このインデントによって、5〜7 行目が繰り返されるということがわかりやすくなります。
🗒️覚えよう
インデントを使うと、繰り返される行がわかりやすくなる
先ほどは、7 行目で変数 x の数値を 32 ずつ増やしていきました。ここで、以下のようにプログラムを変えてみましょう。
- 4 行目を
for i=1 to 200
としてください(6 → 200)。 - 6 行目を
pause 2
としてください(100 → 2)。 - 7 行目を
x=x+1
としてください(32 → 1)。
以下のようになったはずです。
cls
sprite 0,3
x=100
for i=1 to 200
show 0,(x,100)
pause 2
x=x+1
next
「実行」ボタンを押して、プログラムを実行してください。男の子が先ほどよりもスムーズに右方向に移動するようになりました。
for i=1 to 200
としましたので、男の子を 200 回繰り返し移動させたことになります。その分、1 回あたりの移動量を少なくして、プログラムの停止時間も短くしたので、移動がスムーズになった、ということです。
for 命令のパラメーターの数値を変えてみたり、pause 命令のパラメーターや変数 x を増加させる数値をいろいろ変えてみて、男の子のキャラクターがどのように動くようになるか、試してみてください。
ずっと繰り返してみよう
先ほどは「決まった回数だけ繰り返す」というプログラムを作ってみましたが、実は繰り返す回数が事前にはわからない、ということも多いです。例えば、
- ゲームで遊んでいる人が敵にやられない限り、ゲームは続く。
- カーソルキーを押さない限り、主人公は同じ方向に動き続ける。
- 空気抵抗を考えない限り、地球は太陽を回り続ける。
といった状況です。
「もうやめて!」と言うまで、コンピューターに同じことを延々と行ってもらうプログラムを作ることができます。これを「無限ループ」と呼びます。無限ループは、 do 命令 を使って実現することができます。
では、新しくプロジェクトを作って、次のプログラムをエディターにボタンを使ってコピー&ペーストしてください。
cls
do
x=random(0,639)
y=random(0,399)
r=random(1,100)
c=random(0,37)
circle (x,y),r,c
loop
※ random 関数 は、引数で指定された数値の範囲内で、ランダムに一つだけ数値を決めてくれる関数です。
※ circle 命令 は、グラフィック画面に円を描く命令です。中心点の座標と半径、線の色をパラメーターとして指定します。
circle 命令で x 座標と y 座標を指定し、どこに円を描くか決めていますが、これは Jasmine Tea のグラフィック画面内のどこかに中心がある円ということを命令していることになります。円の大きさは、半径として 1 から 100 までのいずれかの大きさ、そして色は Jasmine Tea で使える色のどれかを指定しています。具体的には、以下となります。
- 変数 x - グラフィック画面の横方向の範囲(0〜639)のいずれか
- 変数 y - グラフィック画面の縦方向の範囲(0〜339)のいずれか
- 変数 r - 1〜100 のいずれか
- 変数 c - 使用できる色の番号の範囲(0〜37)のいずれか
※ グラフィック画面については、プログラマーズガイドの「 グラフィック画面 」に詳しい説明があります。
「実行」ボタンを押して、プログラムを実行してみましょう。
目で見ても追いつかないほど高速に、次々と円が描かれていきます。そして、それは全く止まる気配がありません。
プログラムの 2 行目に do 命令が書かれています。そして、最後の 8 行目に loop 命令が書かれています。この do 命令から loop 命令の間が、ずっと繰り返されることになります。
🗒️覚えよう
do 命令を使うと、同じ処理をずっと繰り返すことができる
上のプログラムでは、do 命令と loop 命令で囲まれた行にて、インデントのテクニックが使われています。ここでも、どこが繰り返されているのか、インデントによってわかりやすくなっています。
さて、今もプログラムは動き続けています。コンピューターは「ずっと繰り返して!」と指示を受けていますので、プログラムを止めません。
ずっと動いていても困るので、プログラムの実行を止めましょう。プログラムを止めるには、実行画面の下にある「止める」ボタンを押します。
「止める」ボタンを押すと、プログラムが停止され、実行画面には「○○行で止まりました」と表示がされます。プログラムが何行目で停止されたかを教えてくれます。
🗒️覚えよう
「止める」ボタンを押すことで、プログラムはいつでも止めることができる
「あれ?プログラムが終わらない!」ということは、ゲームやアニメーション、シミュレーションなどプログラミングを行っていくと、実は起きやすいことです。プログラムが終了する条件をちょっと間違えたりすると、期待に反してプログラムが終わらずにずっと動き続けたりします。
そのようなときは、慌てずに「止める」ボタンを押して、プログラムを停止させましょう。
今回のおさらい
- for 命令を使って、決められた回数だけ同じ処理を繰り返し行うプログラムを作ることができる。
- do 命令を使って、同じ処理をずっと繰り返し行うプログラムを作ることができる。
- プログラムは「止める」ボタンでいつでも停止させることができる。