ワンポイントテクニック No.025 G800シリーズ対応

FOR〜NEXTで条件判断


 BASICでゲームを作る場合、特定の条件を満たす限りメインルーチンを繰り返すというような処理を行うことが多々あります。その特定の条件というのはIF文を使って判断すればよいのですが、高速化のためにIF文は極力使いたくないという場合も多いでしょう。
 PC-E650では構造化命令追加のために一定条件を満たすまでの間繰り返す場合はIF文の代わりにWHILE〜WENDやREPEAT〜UNTILなどを使用することもできます。確かにIF文よりは速く便利な命令ですか、構造化命令はE650専用であるためにせっかく作ったゲームもE500、E550などのユーザーが楽しめなくなってしまうという難点を抱えています。
 そして、ループさせる命令としてはFOR〜NEXTよりも遅いというのも難点です。FOR〜NEXTを1000回繰り返した場合、1回当たり1.5m秒ですが、WHILE〜WENDやREPEAT〜UNTILは3.1m秒もかかってしまいます。これはIF文(3.2m秒)と大差ありません。

 問題はFOR〜NEXTでどうやって条件判断を行うかということですが、それはカウンタ機能を使うだけです。FOR〜NEXTではSTEPできざみ値を指定しない限りは1回につき1ずつ増加していくのですが、きざみ値をゼロに指定することで無限ループが可能になります。例えばZの値が初期値20で99以上になったらループを抜けるという設定をする場合は下記のようにするだけです。

FOR Z=20 TO 99 STEP 0
中略
NEXT

これによって、Zの値が99を越えた場合のみループを抜けることができます。ただ、これは初期値<終了値の場合しか使うことができません。
例えば、初期値20で0になった場合にループから抜けたいという場合は下記のように論理式を併用することで可能になります。

FOR I=0 TO 1 STEP 0
I=-(Z<=0)
中略
NEXT

ただし、速度面ではかえって遅くなっているため1LINEや2LINEゲームのように使える行数が限られているゲームでしか有効活用できないでしょう。

 また、カウンタ機能を有効活用を行えば高速化が可能になります。例えばタイムアップがあるゲームで残りタイムがゼロになったら終了するという場合は初期値と終了値を設定するだけでIF T=0THEN〜というIF文を使用しなくてもいいだけではなく、タイム減算処理も省略できるため処理速度向上につながります。

FOR T=200 TO 0 STEP-1
中略
NEXT

 私が作った100m走のゲームでは大半のものが座標移動用にFOR〜NEXTを用いています。
 このように条件判断用だけではなくFOR〜NEXTが持っているカウンタ機能も有効活用すれば処理速度向上が可能になる場合が多いため単純に繰り返す処理をする場合は積極的に導入を考えておくとよいでしょう。カウンタとしてA=A+1という処理を別途行うならばそれだけで3.1m秒もかかってしまいますからね。


RETURN

inserted by FC2 system