テンキーによる8方向移動のように法則性があるIF文の場合はそれを数式で表すことでIF文による判定を大幅に減らすことが可能なのですが、実際はそういうテクニックが使える機会はそれほど多くはありません。
ゲームでキー判定を行う場合、同時キー入力を使って2人対戦を行う場合は使うキーが3つとしてもキー入力判定だけを見ても最大で1人当たり7通り、2人対戦時には14通り必要になってきます。メインルーチン内にキー判定のみで14個もIF文が羅列していては処理が遅くなるというのは想像しただけでも理解できると思います。
そこで便利なのがON〜GOTOです。ただON〜GOTOではアスキーコード32([SPACE])〜245([PF5])までのキーを使用する場合、214個もジャンプ先を羅列する必要があり効率が非常に悪いものとなってしまいます。
ON A GOTOで実際にジャンプ先を増やして指定したところその処理時間はジャンプ先10個で3.8m秒、30個で7.5m秒もかかりました。ジャンプ先が1個増える毎に処理時間が約0.02m秒増える計算になるので200個も指定したらとんでもなく時間がかかってしまいます。(ジャンプ先がブランクでも1個当たり約0.01m秒増える)
そういう時に役に立つのがGOTO文のテーブル処理です。シャープのポケコン用BASICは一般的なBASICとは異なり、GOTOのジャンプ先に変数が使えます。GOTO 変数という形で使用することでIF文で判定することなく特定の行にジャンプさせキー入力後の処理をすることができます。そのためには事前に必要な分だけ配列変数を確保してそれにジャンプ先の行番号を書き込んでおく必要があります。
10 DIM Z(252) 20 FOR I=0 TO 252:Z(252)=120:NEXT 30 FOR I=1 TO 15:READ A,B:Z(A)=B:NEXT 中略 100 'メインルーチン 110 GOTO Z(ASC INKEY$) 中略 200 'キーニュウリョクショリ 中略 1000 DATA 13,210,32,250,49,300,50,310,51,320,52,330,54,340,55,350,56,360,57,370,241,400,242,410,243,420,244,430,245,440 |
110 ON (ASC INKEY$)-12 GOTO 210,,,,,,,,,,,,,,,,,,,250,,,,,,,,,,,,,,,,,300,310,320,330,,340,350,360,370 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,400,410,420,430,440 |
コラム GOTOの高速化 一般的にいってBASICなどのインタープリタ言語では先頭に近い行にジャンプする方が処理が速い。これは先頭行から実行しているので当然なのだけどPC-E500シリーズではGOTOのジャンプ先は一度実行されたらメモリ上の実アドレスに書き変えられるためにGOTO命令が非常に高速なものとなっており、先頭に近い方が高速という一般論は通じなくなっている。 しかし、これは固定の行番号や*ラベルを使っている場合の話であってGOTOに変数や”ラベル”を使っている場合は一般的なインタープリタ型BASICと同じように先頭に近い方が速くなっている。 したがって、GOTO命令を高速化する場合はどのような形で使用するかが重要になり、普段はGOTOに変数や”ラベル”を使う人は少ないと思われるためにPC-E500シリーズにおいてはGOTO命令は特に速度を意識して使う必要はないと思われる。 |