類似処理の自動反復化2
1章前で繰り返し処理についてお話致しました。
この章では、繰り返しを行うマクロ命令についてご紹介致します。
拡張マクロ命令は今回以前に何回か記述したものなのでどういうものかお分かりのことと思いますが、
改めて書くと、拡張マクロはHSPが予め用意している命令ではなく、あたかも命令の一つであるかの様に振舞う
擬似的な命令で、使う側として通常命令の様に所定パラメータをマクロに渡すだけで特定の処理を行います。
気をつけておかなければならないのは拡張マクロ使用チェックを入れておくことだけです。
1つ目は、repeat命令と同様にループ開始時に終了の条件を指定するwhile命令です。
| while 条件 |
| | | |
| 条件 | 「真」の間繰り返す(「偽」なら抜ける) |
while命令のパラメータはrepeat命令同様の回数指定ではなく、どうなれば終了するかという条件です。
つまり、繰り返しを続行するかどうかのパラメータがif命令の条件になっているような感じで、
指定するパラメータが「真」の間、もしくはパラメータを省略すると無限ループとなります。
続けてもう1命令説明してからサンプルスクリプトを記述します。
| wend |
| | | |
| [パラメータなし] | 処理をwhileまで戻すだけの為、パラメータは必要ない。 |
形としてはrepeat命令と同じである為、想像できていたかと思いますが、
while命令もループ末端がどこなのかを明示する必要があり、wend命令がwhile命令版のloop命令になります。
無条件でwhile位置に処理を移動させるだけなのでパラメータはありません。
この命令は正規の命令ではない為、システム変数cntはカウントアップしないことを覚えておきましょう。
…ということで、cntの代わりに変数でカウンタを示していますが、2行目に見慣れない形で書かれています。
カウンタ値に1増やす演算子のことでインクリメントと呼ばれていますが、崩して書きなおすと
「counter = counter + 1」左記の様な形になります。
同じ変数が続けて書かれる為にわかりにくいですが、代入されるのは一番最後の結果になるわけですから、
「新しいcounter は 現在のcounter に 1を加算」と、日本語で書くとこのようになるわけです。
増やす値は常に1です。2以上、または-1以下ずつにしたい場合は複合代入演算子を使います。
単純な代入演算子は「=」を使用して右辺の値を左辺の変数に代入しますが、
変数名が長い場合等に同じ変数を2回書かずにいける複合代入演算子というものを用いれば楽です。
HSPのバージョン2では加算と減算の演算子しかありませんでしたが、バージョン3ではC同様となりました。
| += | a = a + b | 「a += 2」(a=1)で「3」 |
| -= | a = a - b | 「a -= 1」(a=2)で「1」 |
| *= | a = a * b | 「a *= 2」(a=1)で「2」 |
| /= | a = a / b | 「a /= 1」(a=2)で「2」 |
| \= | a = a \ b | 「a \= 2」(a=1)で「1」 |
| &= | a = a & b | 「a &= 1」(a=2)で「0」 |
| |= | a = a | b | 「a |= 2」(a=1)で「3」 |
| ^= | a = a ^ b | 「a ^= 1」(a=2)で「3」 |
| <<= | a = a << b | 「a <<= 2」(a=1)で「4」 |
| >>= | a = a >> b | 「a >>= 1」(a=2)で「1」 |
加算にインクリメント演算子があるように、減算にも1だけ減らすデクリメント演算子が存在します。
書き方は「counter--」で、1ずつ減らしていきたい場合にご利用ください。
counter = 3
while counter > 0
mes counter
counter--
wend
mes "Game Over !!!"
|
さて、命令の紹介を再開致しましょう。
繰り返しを行うマクロ命令である為にセットで紹介しますと、do命令とuntil命令です。
| do |
| | | |
| [パラメータなし] | 繰り返しの開始点を明示するだけの為、パラメータは必要ない。 |
今回の命令セットでは、ループ末端でそのまま抜けるかdo命令位置に戻すかの条件分岐を行うだけの為、
開始側ではパラメータを必要としません。
| until 条件 |
| | | |
| 条件 | 「偽」の間do命令位置へ戻る(「真」ならそのまま抜ける) |
パラメータに記述する条件はwhile命令と同じで「真」の間繰り返します。
省略した場合の動きが異なり、省略時は繰り返しを行いません。
while命令との大きな違いは考えていただくとわかるかと思いますが、ループ開始時に偽の状態だった場合に
while命令では一回も実行されず、ループ後の処理から再開されることに対して、
do命令は真偽の状態を問わず最低でも一回は必ず実行するようになっています。
さらに、while命令は「真」の状態を前提に「偽」になるまで繰り返すのに対して、
do命令は「偽」の状態から「真」になるまで繰り返すといったループ前状態がそれぞれ異なっています。
do
counter++
mes "[" + counter + "]回目"
until counter >= 5
|
repeat-loopで強制的にループを抜ける命令があったようにwhile-wend、do-untilにも存在します。
この命令もマクロによる命令となるわけですが、_break命令がソレです。
| _break |
| | | |
| [パラメータなし] | 処理をループ末端の次に移すだけの為、パラメータは必要ない。 |
この_breakは拡張マクロ命令のループを抜ける為のものでwhile、doループのいずれも使用できます。
使い方・動きは通常のbreak命令同様で、ループを抜ける状態でなくても強制的に抜ける為に存在しており、
マクロ側に終了条件を記述しないループを組むときには必須となる命令ですね。
この章最後の命令を紹介致します。
| _continue |
| | | |
| [パラメータなし] | 処理をループ始点に移すだけの為、パラメータは必要ない。 |
標準のcontinue命令はループ開始位置に戻すだけでなく繰り返し数の変更も行えましたが、
今回のマクロ命令は指定回数繰り返すことが条件ではなく、cntも使えませんから回数は指定できません。
ただ単純に開始点に戻すことだけがこの命令の役割です。
_continue命令以前に必ずこの_continue命令を通過させないような処理(分岐・割り込み)を配置しなければ
無限ループとなりますので気をつけてください。
4行目のpos命令に複雑そうなパラメータ指定を行っていますが、コレはプログラミングの常套手段です。
前章でループをネストさせるということを行いましたが、
ネストや条件分岐を行わずにX座標とY座標を決定してこのような表形式にする時に用いられます。
「\ 20」が20回同じことを繰り返すのを意味し、「/ 20」が20回毎に行うことを意味しています。
つまり、X座標は繰り返しのたびに32ずつ増やして行き、繰り返し数が20回になると再度0から開始します。
Yは20回繰り返す度に24ずつ増やして行きます。この結果、表形式となるわけです。
是非覚えておきたいものですが絶対に覚えなければならないものではありません。
知っておくといつか役立つときが来る、程度に考えておいてください。
実はループを行うマクロ命令があと1つ残っています。
それとマクロではない繰り返しを行う命令も残ってますが、
その命令は配列変数の話を先にしておく必要がありますのでほんの少しだけ延ばします。