繰り返し

プログラムに命令を並べて実行することで、コンピューターはプログラムに書かれた命令を一つずつ順番に実行していきます。やりたいことの中には、いくつかの命令を繰り返し何度も実行したいことも出てくるかもしれません。

例えば、1+2+3+4+... というように次々と足し算を繰り返していくプログラムを考えてみましょう。足していく際に、1+2 を計算して、その答えを画面に表示します。次に 1+2 の答えに 3 を足して、その答えを画面に表示する、というように途中経過も画面に表示していくようにしたいとします。4 までであれば、以下のように書けます。

a=1+2
print a
a=a+3
print a
a=a+4
print a

この程度であれば、プログラムに自分で書くことができるかと思います。では、1+2+3+4+... を +10000(1万)まで計算しようとしたら、上記のように一つずつプログラムに書いていくことは、非現実的です。

もう一つの例として、ゲームのプログラムを考えてみましょう。ゲームのプログラムで行うべきことの代表的な例は、以下となります。

  1. 遊んでる人がキーを押したり画面をタップやクリックしたかどうかを調べます。
  2. 1 で行われた操作に従って、キャラクターの表示位置を変えたり、マップを移動したり、敵の体力を減らしたりします。
  3. 2 で行われた内容に従って、画面の表示を変えます。
  4. 1 に戻って、再び遊んでいる人の操作を調べます。

ゲームで遊んでいる間、コンピューターの中では、上記の 1 から 4 がひたすら繰り返されているのです。

Jasmine Tea では、上記の例のように、複数の命令によって行われる何らかの処理を繰り返し行うための仕組み(ループともいいます)が提供されています。どのように繰り返したいかによって、いくつかの方法があります。

無限ループ

プログラムの実行を強制的に止めるまで、いくつかの命令を無条件に繰り返すことを、「無限ループ」と呼びます。Jasmine Tea では、無限ループは do 命令と loop 命令を組み合わせることで実現することができます。

do
  命令1
  命令2
  ...
loop

do 命令と loop 命令の間にある行が繰り返されます。もしこの無限ループを終わらせたいときは、exit do 命令を使うことで、loop 命令の次の行に進むことができます。通常 if 命令を使ってある条件を満たしたときに、exit do 命令を使って無限ループから抜けるようにプログラムを書きます。

do
  命令1
  命令2
  if 式 then
    exit do
  end if
  ...
loop

無限ループは、最も単純な繰り返しの仕組みです。exit do 命令を使って繰り返しから抜けることや、end 命令を使ってプログラムを終了させるまで、Jasmine Tea はひたすら do 命令と loop 命令の間の行を繰り返し実行します。

ある条件を満たすまでループ

何度も何度も命令の実行を繰り返す無限ループの他に、ある決まった条件を満たすまで命令の実行を繰り返すことも、プログラミングの中では多く出てくる場面です。例えば、以下のようなことが考えられます。

  • キャラクターが画面の端に到達するまで、移動を繰り返す。
  • 答えが 0 になるまで、数値変数の値を変化させながら計算を繰り返す。
  • BGM の演奏が終わるまで、図形のアニメーションを繰り返す。

do 命令と loop 命令に条件式を使うことで、ある条件を満たすまで、あるいは、ある条件を満たさない間だけ、命令の実行を繰り返すことができるようになります。do 命令と loop 命令で条件式を使う方法は、4種類あります。

1つ目は、do 命令に while パラメーターを使う方法です。これは、繰り返しが始まる直前に条件式が成り立っている(条件式の評価結果が 0 以外)ときは、繰り返しを行います。日本語で表現すると「条件式が成り立っているときは繰り返す」となります。そして、loop 命令によって再度繰り返される直前に、再び条件式が成り立っているかどうかが確認されます。下のプログラム例では、数値変数 flag が記憶している数値が 1 のときは、命令が実行され続けます。

最初に do 命令が実行される際に数値変数 flag が記憶している値が 1 ではなかったときは、do 命令と loop 命令の間の行に書かれた命令は一度も実行されないことに注意しましょう。

do while flag=1
  命令1
  命令2
  ...
loop

2つ目は、do 命令に until パラメーターを使う方法です。これは、繰り返しが始まる直前に条件式が成り立っていない(条件式の評価結果が 0)ときは、繰り返しを行います。日本語で表現すると「条件式が成り立つまで繰り返す」となります。その他は、do 命令に while パラメーターを使ったときと同じです。下のプログラム例では、数値変数 flag が記憶している数値が 1 になるまで、命令が実行され続けます。

do until flag=1
  命令1
  命令2
  ...
loop

3つ目は、loop 命令に while パラメーターを使う方法です。これは、loop 命令が実行された際に条件式が成り立っている(条件式の評価結果が 0 以外)ときは、繰り返しを行います。

先ほどと違う点は、繰り返しの対象になる do 命令と loop 命令の間の行にある命令が 1 回は実行される、ということです。下のプログラム例では、繰り返しの対象となる命令1, 命令2 などが実行された後に、数値変数 flag が記憶している数値が 1 だったときは、命令が実行され続けます。

do
  命令1
  命令2
  ...
loop while flag=1

4つ目は、loop 命令に until パラメーターを使う方法です。これは、loop 命令が実行された際に条件式が成り立っていない(条件式の評価結果が 0)ときは、繰り返しが行われます。その他は、loop 命令に while パラメーターを使ったときと同じです。下のプログラム例では、繰り返しの対象となる命令1, 命令2 などが実行された後に、数値変数 flag が記憶している数値が 1 になるまで、命令が実行され続けます。

do
  命令1
  命令2
  ...
loop until flag=1

4つのうちのどの手法を使うかは、プログラムで行いたいことに依存して変わります。例えば、以下のような判断基準で選択すると良いでしょう。

  • do while, do until - 条件によっては1回も命令を実行しないことがあり得るとき。
  • loop while, loop until - 繰り返される命令が実行された結果に応じて、再度繰り返すかどうかを判断したいとき。

while を使うか until を使うかは、条件式を日本語で読んでみたときに自然に感じる方を選択すれば良いでしょう。

特定の回数だけループ

プログラムで行いたいことの中には、命令を繰り返したい回数が事前に決まっていることもあります。例えば、以下のようなことを行いたいときは、繰り返したい回数は決まっています。

  • 1〜10 まで数を足していく。
  • グラフィック画面の X 座標 100 〜 300 まで、スプライトを移動させる。
  • 音楽の特定の小節を 4 回繰り返して演奏する。

このように回数が決まっているときは、for 命令と next 命令を使って繰り返しを行います。

for i=1 to 10
  命令1
  命令2
  ...
next

for 命令と next 命令の間の行に書かれた命令が、繰り返し実行されます。for 命令には、ループ変数と呼ばれる数値変数を 1 つ使用します。for 命令が実行されたときに、ループ変数に最初の数値が記憶されます。上記のプログラム例では、ループ変数 i に 1 が記憶されます。そして命令1, 命令2 と実行されます。next 命令が実行されると、ループ変数 i の数値が 1 だけ増えて 2 になります。これを繰り返して、ループ変数 i の数値が 10 になるまで、繰り返します。

繰り返しの度にループ変数の数値を 1 ではなくもっと増やしたいときは、step パラメーターを使います。下記のプログラム例では、ループ変数 i の数値は、1, 3, 5, 7, 9 と変化します。次の 11 になってしまうと、10 よりも大きい数となってしまうため、繰り返しが終了します。

for i=1 to 10 step 2
  命令1
  命令2
  ...
next

step パラメーターに負の数を書くことで、ループ変数の数値を減らしていくことも可能です。下記のプログラム例では、ループ変数 i は、10, 7, 4, 1 と変化していき、次の -2 になってしまうと 1 よりも小さな数となってしまうため、繰り返しが終了します。

for i=10 to 1 step -3
  命令1
  命令2
  ...
next

for 命令では、ループ変数の最初の数値や、終了までの数値、そして step パラメーターによる増分値について、式を書くこともできます。

start=0
end=639
for i=start to end
  命令1
  命令2
  ...
next

do 命令と loop 命令による繰り返しの特徴と、for 命令と next 命令による繰り返しの特徴をうまく使い分けることで、プログラミングのしやすさが変わってきます。やりたいことに最適な繰り返し手法はどれなのか、考えながらプログラミングをしましょう。