同じ処理を繰り返す
似たような内容を繰り返す処理を毎回書いていたのでは長く、見にくく、面倒臭くなってしまいます。
mes "1回目の表示"
mes "2回目の表示"
mes "3回目の表示"
mes "4回目の表示"
stop
上のような短い単純な処理だとまだ耐えられる範囲でしょうが
font "MS 明朝", 10, 0
color 20, 30, 50
pos 10, 30 : mes "1回目の表示"
font "MS 明朝", 20, 0
color 40, 60, 40
pos 10, 60 : mes "2回目の表示"
font "MS 明朝", 30, 0
color 60, 90, 30
pos 10, 90 : mes "3回目の表示"
font "MS 明朝", 40, 0
color 80, 120, 20
pos 10, 120 : mes "4回目の表示"
stop
コレくらいになると少し書くのが面倒ですよね。
この処理を何とか短くできないものだろうか?と考えるべきです。
そこでまず見てもらいたいものは、一つのまとまりが複数回、同じ事をしているということ。
先ほどの例だと「フォントを決め、色を決め、表示する座標を決め、○回目の表示と画面に出力する」
これが一つのまとまりとして4回繰り返しているわけです。
次に見てもらうポイントは、パラメータの値の規則性を見つけるということです。
例えば値が「3,6,9,12,15,18…」と変化していくと回数をaとすると値は3a(3×a倍)になっています。
ちなみにコレの規則はわかるかな?
「9,49,121,225,361,529…」
1分以内でパッと思いついた人は…かなり頭のキレる方ですね。
答えは…この章の最後で♪
例に戻りまして、font命令のp1は10から始まり10ずつ増加
color命令の赤輝度は20から始まり20ずつ増加、緑輝度は30から始まり30ずつ増加、
青輝度は50から始まり10ずつ減少
pos命令のx座標は変化なし、y座標は30から始まり30ずつ増加
mes命令の回数部分は1から始まり1ずつ増加、です。
これをどうやって繰り返すのかと言うと、「repeat」「loop」命令を使います。
repeat命令のp2は置いといて、p1には書いている通り繰り返したい(ループ)回数を指定します。
ここでは4回繰り返したいわけですから、「repeat 4」と指定します。
loop命令はrepeat命令と対になる命令で単体だけではエラーになります。
またloop命令のないrepeat命令だけでもエラーになります。2つで1つの命令と覚えておきましょう。
このloop命令までを繰り返します。
a = 1
repeat 4 ; repeat〜loopの間を4回繰り返す
font "MS 明朝", a * 10, 0 ; フォントのサイズを変更する
color a * 20, a * 30, 60 - ( a * 10) ; 文字色変更
pos 10, a * 30 ; カレントポジションの変更する
mes "" + a + "回目の表示" ; 「○回目の表示」と出力する
a = a + 1 ; 今までaに入っていた値に1足したものをaに代入する
loop
stop
では順に説明していきます。
1行目。カウンタ用の変数としてaを用意し、初期値を1としておきます。
2行目。何回繰り返すかを指定します。
3行目。フォントのサイズを繰り返すたびに10ずつ増やしていきます。
4行目。1回目は「color 20,30,50」と書いたのと同じこと。2回目なら「color 40,60,40」という具合。
5行目。出力先の座標を(10,30)、(10,60)・・・と変更していきます。
6行目。""は空文字を意味する。
7行目。初めaは1でした。つまり「a=1+1」でaに2が入ります。2回目は「a=2+1」なのでaに3が入ります。
8行目。そして2行目にジャンプします。4回目はそのまま無視されます。
繰り返しはifを使うことでもできます。
a = 1
*mainloop
font "MS 明朝", a * 10, 0
color a * 20, a * 30, 60 - ( a * 10)
pos 10, a * 30
mes "" + a + "回目の表示"
a = a + 1
if a <= 4 : goto *mainloop
stop
上記2つの例でカウンタ用に変数aというのを使いました。
しかしrepeat・loop命令ではユーザーが変数を用意しなくてもシステム変数cntという変数を利用できます。
このシステム変数というのはプログラマーが値を代入せずとも自動的に更新されるもので、
cnt以外にもいろいろあるわけですが、後の章で解説することにします。
どのシステム変数も通常の変数と同じようには代入することはできません。
cntの話しに戻ります。
cntは初め0が入っています。繰り返しのloopを実行するたびにcntは自動で1増えていきます。
repeat 4
mes cnt ; cntの値の変化が見られます
loop
stop
このcntを使って先ほどの例を書き換えてみましょう。
…と同時にrepeat命令のp2を使うことにします。
p2はcntの初期値を変更することができます。
例えば「repeat 4,1」とするとcntを1にして4回繰り返します。
repeat 4,1
font"MS 明朝", cnt * 10, 0
color cnt * 20, cnt * 30, 60 - ( cnt * 10)
pos 10, cnt * 30
mes "" + cnt + "回目の表示"
loop
stop
繰り返し回数を変更する命令continueを解説します。
書式は「continue 繰り返し数」でrepeat,loop命令の繰り返す回数変更します。
システム変数cntの数もcontinue命令によって指定された数からとなります。
repeat 10
if cnt = 3 : continue 6 ; repeatまで戻り現在の回数を6にする
mes cnt
loop
stop
実行すると「0126789」となると思います。
continue命令の繰り返し数を省略すると「012456…」とcntが3の時にrepeatから再開します。
回数を現在の回数より小さくするとソコまで戻ることとなりますが
単純に戻すだけではどうなるか容易に想像できますね?
「指定回数まで行っては戻り、行っては戻り…行っては戻り…」と無限に繰り返すこととなります。
他のソフトはおろか、パソコン自体が固まってしまいますので実行しないようお願い致します。
最後にrepeat・loop命令の繰り返し回数に満たなくても終了させるbreak命令を説明します。
書式は「break」のみとなっており、パラメータがありません。
repeat 5
mes "" + cnt + "回目"
if cnt = 3 : break ; cntが3になれば強制的に抜ける
loop
stop
このようにしても5回実行されずに「3回目」と表示した後、繰り返し部分を抜け出します。
以上で今回の説明を終わります。
尚、「この章最後で」と書いていたパラメータ値の規則性の答え。
求め方は色々あるかもしれませんがそのうちの1つとして、回数をnとして「(n×4-1)の2乗」。
repeat 6, 1
mes (cnt * 4 - 1) * (cnt * 4 - 1)
loop
stop