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

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

前回は、プレイヤーからの入力を受け付けるように、プログラムを書き進めました。しかし、前回の最後で、このやり方には問題があると書きました。今回はこの問題を説明して、プログラムを改善したいと思います。

前回、プレイヤーは「R/Sキーによる(回答の)入力」の仕組みのため、回答の最中に、普通にENTERキーが使え、従ってスタックを使って通常の計算ができる、と書きました。これは便利ですが、この時、プレイヤーはスタックを「自由に」使えるので、例えば、せっかく発生させて、スタックに保存しておいた乱数を、消してしまうことができます。例えば、前回作ったプログラムの、B006 INPUT A の部分で、「A?」に対して、

プレイヤーの操作:4 × R/S → 8

のように操作すれば、乱数と、上記の「4」が、掛け算されてしまい、乱数は消えてしまいます。

つまり、プレイヤーが入力する部分では、スタックがどのように変化するかを、プログラムを製作する側では予想できない、というわけです。ではどうすれば良いのでしょうか。それは、入力の前後で、スタックをクリア(CLSTK)して、プレイヤーが、プログラムの内部で使っている数値を変更できないようにしてしまえば良いのです。数値の保存にはスタックではなく、変数を活用します。

では、この方針に従って、プログラムを改善しましょう。発生させた乱数は、変数Qに格納し、その後一旦スタックをクリアすることにします。スタックにおいてある数値を変数に格納するためには、STO命令を使います。また、プレイヤーからの入力は、INPUT命令により、変数Aに入りますので、入力の後、特に何もせず、スタックをクリアしてしまっても問題ありません。つまり、

B006 STO Q
B007 CLSTK
B008 INPUT A
B009 CLSTK
B010 RTN

とすれば、乱数は変数Q、プレイヤーの入力は変数Aに格納され、その後、スタックはクリアされた状態になります。

これで、出題される乱数と、プレイヤーからの回答が安全に保存されました。次回は、この二つ数値の比較を行ってみます。また、比較の結果による分岐も必要になります。次回、比較や分岐が登場すると、だんだんプログラムっぽくなってくると思います。