RPNでゲームを作ろう(13)

前回(2月18日)からの続きです。

もう夜も遅い時刻ですが、前回、話が中途半端でしたので、頑張って続きを書いてしまおうと思います。

前回「for文でつまずく」という話を書きましたが、確かに、前回のプログラムを見てみると、今までより、ちょっと難しそうな感じがします。でも実はたいしたことはありません。今回、その中身を具体的に説明します。

このプログラムの中で最も重要な命令はISGです。これは「Increment; Skip if Greater than」の略で、つまり、「ループカウンタを増加させて、もし終値より大きくなったら『次の行を飛び越せ』」という意味です。ループカウンタは、この例では R です。実行の制御が『次の行を飛び越せ』だけなので、GTO命令(go to)を組み合わせて、ループ内の処理と、ループ終了後の処理を区別しています。このために、プログラムが一見複雑に見えているのだと思います。でも、これは非構造化言語の醍醐味ということで、楽しんでしまいましょう。

あとは、ループカウンタ R について理解すれば終わりです。プログラムを見てみると、最初にSTO命令により0.04が格納されています。これは何でしょう? Rは、普通の変数で、実数値が1個格納されていますが、実はこの1個の値で、初期値(現在の値)、終値、増減を設定および記憶しています。その形式は

CCCCCCC.FFFII

で、1文字か数字1桁を表しています。「.」は小数点の位置です。小数点より大きい部分(Cの部分)には、初期値を入れます。上記のプログラム例では0です。小数点以下の、FFFの部分は「必ず3桁」で、終値を入れます。プログラム例では4なので、R は0.004となっています。また、IIの部分には増分を2桁で指定しますが、増分が1の場合は、ここは不要です。ややこしいですが、具体例として、たとえば、10から初めて、50まで、2ずつ増やしていく、という場合は、10.05002という実数値を、ループカウンタに格納しておけば良いです。Cの部分は負の数でも良いです。たとえば、-5から初めて30まで、6ずつ増やしていく場合は、-5.03006となります。

増分を負の数にしたい場合はどうするのか、というと、このISG命令ではできません。代わりにDSE(Decrement; Skip if less than or Equal to)命令を使います。使い方は同じです。たとえば、20から初めて、4まで、2ずつ減らしていく場合は、20.00402をカウンタに格納すれば良いということです。小数点以下を省略すると、終値0まで1ずつ減らす、ということになりますので、単に、何かループを10回まわしたい、ということであれば、DSE命令を使って、カウンタには10、いや、11をセットしておくという方法が手軽です。

今回はここまでにします。次回は、上記のISGを使った構造を、今まで書き進めてきたプログラムに持ち込んで、目的の、4回を超えたらゲームオーバーという処理を実装してみたいと思います。