人生

やっていきましょう

872日目

数字当てパズルを完成させた。これまで扱ったことのない新たな変数操作を必要としたが、実現できる仕組みがウディタにあったことでどうにか問題なく動かすことができた。そこで今回は数字当てパズルの動作を振り返って解説をしようと思う。

数字当てパズルの基本的な動作は先日書いた通りである。2桁の数字を入力し、その数字が答えとなる数字と一致すればスイッチが入り、一致しなければ答えとなる数値より多いか少ないかを出力する、というものである。

ここで前回指摘しなかった点について触れる。この答えとなる数値は予め決められたものではなく、乱数によって初期化の際に毎回変動するものにしようと考えた。というのも、予め決められた数値を入力するだけではゲームとして面白くないからである。何度も試行錯誤していけばいずれその数値にはたどり着けるし、何より既定の数値ではヒントを見るまでもなくwikiなどを見てその数値を入力すれば一発で終わってしまう。そうならないために入力回数に制限を設け、制限を上回った場合に答えを変動させるよう設定した。

以上のことを踏まえた上で、具体的な実現方針を次のように定めた。

まず数字当てパズルの答えとなる数値を管理する変数Pを用意する。また変数Pの値の十の位、一の位の値をそれぞれ取得するために、P=10X+Yとなるような変数X,Yを用意する。X,Yに各々0~9の乱数を代入し、10X+YによってPを求める(この処理は後述する入力回数を管理する変数Z=0のときのみ発動するよう設定する。そうしなければ入力を間違えた際にその都度答えとなる数値が変動することになる)。

つぎにプレイヤーに2桁の数字を入力させる。この数字の値を変数Qに代入する。また変数Qの十の位を管理する変数Rもまた用意する。なぜこのようなことをするかというのは後で述べる。ここではQの値からRの値を導くためにQを10で割り、実数計算の項目にチェックを入れることで小数点を切り捨てた値を獲得した。

ここで【プレイヤーが入力したQの値の十の位】であるRと【答えとなる数値Pの十の位】であるXを比較する。両者を比較してつぎのように場合分けを行う。

・R>x の場合

 R-x ≧ 3 ならば大きすぎ
 R-x ≧ 2 ならば大きい
 R-x ≧ 1 ならば少し大きい
  
・x>R の場合

 x-R ≧ 3 ならば小さすぎ
 x-R ≧ 2 ならば小さい
 x-R ≧ 1 ならば少し小さい

 

・x=Rの場合
 Q=Pならば
  正解
 Q>Pならば
  ごくわずかに大きい
 Q<Pならば
  ごくわずかに小さい

 

最後に入力回数を管理する変数Zを用意して、すべての処理が終わった後にZを1加算する。そしてその後Zが既定の数、例えば7回目に達したときに入力を間違えた場合、すべての変数に0を代入して初期化する。

試しに数値を入れて確認してみる。たとえばX,Yで乱数を回した際にX=5, Y=6となりPの値は56となったとする。つぎにプレイヤーは33を入力したとする。このときQ=33、R=3となる。ここでXとRの比較を行う。X=5、R=3より、X>Rであるため、X-R=2より、入力した数値は答えとなる数値より【小さい】という結果が得られた。

つぎにプレイヤーは80を入力したとする。このときQ=80、R=8となる。ここでXとRの比較を行う。X=5、R=8より、R>Xであるため、R-X=3より、入力した数値は答えとなる数値より【大きすぎ】という結果が得られた。

それからプレイヤーは55を入力したとする。このときQ=55、R=5となる。ここでXとRの比較を行う。X=5、R=5より、X=Rであることがわかったため更なる判別を行う。QとPを比較するとQ=55、P=56であるため、P>Qとなり、入力した数値は答えとなる数値より【ごくわずかに小さい】という結果が得られた。

このようなかたちで数字パズルは機能する。しかしここで次の問題が生じた。任意の数字を入力する際、数字は数字として扱われているわけではなく【文字列】として扱われている。たとえば56という数を入力したとき、それはそのまま変数に代入可能な数値ではなく、56という数字の【文字列】なのである。そのため56という【文字列】をどのように数値の56として代入することができるか、ということを考えなければならなかった。

この解決のために【文字列】を使用しないで数字を確定させる方法(例えば選択肢や自作パネルの利用)も検討したが、どうにか【文字列】を数値に置き換える術を発見した。以下はその引用である。

右辺の値に文字列変数(例:3000000/文字列変数0番など)を指定すると、その文字列を数値に変換して処理できる機能があります。ただし、正常に読み込めるのは文字列先頭から始まる半角数字に限ります。(例:文字列「234」なら正常に234になるが、「82g1A」は82に、「A42」は0になってしまう)

数値が半角数字であれば、変数呼び出し値を利用することで文字列を数字として処理してくれる機能がウディタにはあった。これのおかげで入力した文字列を直接変数に代入することができ、問題なく数値として扱うことができた。

以上が数字当てゲームの解説となる。今回考えたギミックの仕組みはこのパズルに限らず別のギミックにも応用できるのではないかと考えている。現在このギミックに関連する新たなアイデアを思いついたので、実現に向けた設計を急ぎたいと思う。