RPNでゲームを作ろう(その8)

前回(2月6日)の続きです。

前回で、乱数と回答を、安全に保存できるようになりました。

今回は、それらの、出題された乱数と、プレイヤーの回答を比較して、それが正解か、誤りかを判定し、それに応じて異なる処理を実行するプログラムを作ってみましょう。

HP 35sのプログラム言語には、まとめて「x?y」と表記される、比較のための命令群が用意されています。このxとyは、変数名ではなく、xは一番最近積んだスタックの値(xレジスタ)、yはそのひとつ前のスタックの値(yレジスタ)を意味しています。また、「x?y」表記中の?には、比較演算子の≠、≦、<、>、≧、=のどれか一つが対応します。この命令を、まず計算モードで使ってみます。「2と3は等しいか」を例としてやってみましょう。

入力 → スタック(順に、x y z tレジスタという名前で呼ばれる。)

2 ENTER → 2(x=2)
3 → 3 2(x=3, y=2)
x?yと入力して、メニューから「6 =」を選んでENTER → 3 2
「NO」と表示される → 3 2

これで、2と3は等しくない、ということを、35sに判断させることができることがわかりました。2と2ではどうでしょうか。同様に操作すると、「YES」と表示されるはずです。

この命令を、プログラム中で使うと、比較の結果に応じて、処理を分岐させることができます。比較したい値を、スタックのxレジスタと、yレジスタに積んでおいて、x?y命令を実行します。その後、その比較の結果が「NOならば、次の行をとばす」という規則に従って、処理が分岐します。ここでとばされるのは1行だけなので、まとまった処理をしたい場合は、この1行に、現代的な言語ではなかなかお目にかかれない go to 命令(GTO)を置くことになります。(さあ、いよいよ非構造化言語らしくなってきました。)また、乱数とプレイヤーからの入力は、それぞれ、変数QとAに入っています。これをスタックに積むためには、RCL命令を使います。以上より、

RCL Q ← 変数Qに格納されていた値をスタックに積む
RCL A ← 変数Rに格納されていた値をスタックに積む
x≠y? ← xとy(つまり上記のQとR)は異なるか?
GTO C ← 上記で「NO」なら、この行が実行されて、ラベルCへ、そうでなければこの行は飛ばされて、次の行へ
(YESの時の処理)
RTN
LBL C
(NOの時の処理)
RTN

のようなプログラムで、状況に応じて異なる処理を実行することができるようになります。

余談ですが、上に出てきた、「NOならば、次の行をとばす」を覚えるとき、英語の「Skip Next If False」の頭文字を続けて、SNIF、スニフ、と縮めてしまえば簡単です。スニフって、あのムーミンに出てくる不思議なキャラクターを連想しますね。

今回はここまでにします。