BASICで作られた100M走やレースゲームなどなどで問題になってくるのがキー反応の悪さ(これは高速化を駆使すれば何とかなる)以上にタイムが不正確だということです。どう言うことかというと「百聞は一見に如かず」ということで、サンプルプログラムを用意しました。
10 CLS :CLEAR :WAIT 0:A=1:PRINT "READY ";:FOR I=0TO 999:NEXT :PRINT "GO !" 20 T=T+0.1:X=X+S*0.1:LOCATE 0,1:PRINT USING "###m ##.#m/h";X;S 30 IF VAL INKEY$ =A LET A=4-A:S=S+(13-S)*0.08ELSE S=S+(S>0.4)*0.4 40 IF X<100THEN 20 50 WAIT :PRINT "TIME=";T:GOTO 10 |
要はグラフィック表示のない100m走のゲームです。ほとんどのシャープのポケコン(E500/E200シリーズ)で動くと思います(たぶん)。
RUNをして[1][3]を交互に押してください。左の数字が進んだ距離で、右の数字が速度です。このゲームを実際にやってもらえれば分かりますが、慣れてきたら常に10秒前後のタイムを出すことができるようになります。しかも、タイムが0.1秒刻みのため同じタイムが続出します。
このタイムをもっと細かく表示しようというのが、今回のテクニック(?)です。
次のプログラムを追加してください。
45 T=T+(100-X)/S
そうすると、ゴールする瞬間の正確なタイムが表示されます。誰でも思い付きそうなものすね。原理はゴールラインを過ぎた後に、「過ぎた距離」「ゴールの速度」を元にゴールライン上のタイムを逆算しているだけです。
ごく簡単なことですが、これがあるのと無いのとではゲーム性に差が出てくることがあります。特に私の「ゼロヨンバトル」では1000分の1秒まで表示していますが、これを使用しないときは0.15秒刻みになるので、この効果はとても大きいです。はっきり言って、0.15秒刻みでは同じタイムが続出するために微妙なギアチェンジの意味がなく、ゲームが単調なものになってしまいます。
また、これを使うと小数点以下の桁数が増えすぎて見た目が悪いので50行のPRINT文を「PRINT USING ”TIME=###.##”;T」
などに変更してください。