fx-5800P【ゲーム】:もぐら叩き(1)
fx-5800Pでもぐら叩き
e-Gadget
fx-5800Pでモグラ叩きゲームを作ってみる。
きっかけは、カウントタイマーを色々作ってみたことだ。
Lbl 1
Dsz C
Goto 1
ふむ、これが最も軽く動きそうだ。
Dsz C の使い方は、Cを1減らして、0になったら次のコマンドをスキップして、次の次のコマンドへジャンプする、条件分岐の一種のコマンドだ。但し、単純にCをデクリメント(減らす)だけにも使える。
このソースコードは、Dsz の本来の使い方だ。予め1以上の数値を変数 C に格納しておくと、Goto 1 ~ Lbl 1の間をぐるぐる回りながら、Cを1つづつ減らしてゆく。いずれ C は0になる。0になったら、次のコマンドである Goto 1 をスキップして、さらに次のコマンドまでジャンプする。つまり、Goto 1 ~ Lbl 1のループを抜け出すわけだ。
Cの値を大きくすれば、ループは長い間回り続ける。つまり、カウントタイマーの時間制御はCの値で行う。
パソコンに比べて処理速度が遅い fx-5800Pでアクションゲームを作ろうとは思って折らず、実際作ったことも無かった。
ところが、ふと、モグラ叩きゲームを作ろうと思った。プログラム電卓だとどんな感じになるのか、ちょっと興味があった。
fx-5800P は表示にアルファベットしが使えず、日本語を使えない。
ゲームのタイトルは、MOGURA TATAKI と ローマ字でも良いが、ちょっと格好をつけて英語にした。「モグラ叩き」は英語で、Whack-a-Mole と言うようなので、プログラム名: Whack-a-Mole (ワッカモウ、と聞こえるのだ) と決定した。
いよいよプログラム作成開始だ。実際の私が考えたこと、作業したことを、順を追って、実況中継風にして、少しづつできあがるところを、紹介したいと思う。
0.プログラム作成の概略
先ず、必要になりそうな基本構成を考えてみた。
1) モグラ叩きの画面
2) モグラが顔を出す時の処理
・モグラが顔を出すランダムなタイミング作り
・モグラが顔を出すランダムな場所の決め方
3) とにかくモグラを叩いた時の処理
・命中したかどうかの判定方法
4) モグラに命中した時の処理
・顔を出してから命中するまでの時間測定
・一定時間内に命中した時の点数計算方法と表示
・タイムアウト時に次のモグラの顔を出す処理
5) ゲーム全体のチューニング
こんな感じで、少しずつ作ってみることにした。
1. 先ず、画面を作ってみた
[ ][ ][ ]
[ ][ ][ ]
[ ][ ][ ]
この3X3の穴のどれかから、モグラが顔を覗かせるわけだ。
まぁ、こんな感じで良いだろう。
モグラは、O で表現すれば良さそう...
For 1→B To 3
Locate 1,B,"[ ][ ][ ]"
Next
このように書けばOK。
2.もぐらが頭を出すタイミングを作る
冒頭のカウントタイマーを使って、ランダムな時間差でタイミングを作る。
カウントタイマーは、以下を使う
Lbl 1
Dsz T
Goto 1
ここでは、変数に T を使う。タイマーの「T」だ。
ランダムな時間差を作るには、T にランダムな整数を格納すれば良い。そこで、fx-5800Pに備わっている「整数乱数発生関数」を使うことにする。
RanInt#(1,4)→T
さて、この関数の表記は、1~4までの整数をランダムに発生させるというものだ。発生する乱数は、1, 2, 3, 4 のいずれかだ。時間差の最小が1、最大が3になる。あまり時間差が無い。もっと大きな時間差があった方がゲームは面白いだろう。
この時間が短いと、アクションゲームとして忙しくなるが、変化が少ないので、飽きてしまいそうだ。速いだけではなくて、緩急の差を付けようと思った。
そこで、T x T x T = T3 としてみた。そうすると、1, 8, 27, 64 になる。時間差の最小が 7で、最大は 63となる。かなり劇的な時間差になった。プログラムでT3 は、T^(3)と書く。[ ^ ]記号を使う。
これで、ランダムに時間差を大きく変化させるカウントタイマーができた。
RanInt#(1,4)→T
T^(3)→T
Lbl 1
Dsz T
Goto 1
なお、ここの T の設定は、実際にゲームで遊んでみてからチューニングする時に、もう一度考えることにする。
3.モグラがランダムな位置に顔を出す処理を考える
[ ][ ][ ]
[ ][ ][O]
[ ][ ][ ]
こんな感じで、「O」がモグラだ。
そこで、モグラの位置を、X と Y を使って、座標で決めることにする。
fx-5800P の画面は(一般にパソコンの画面も同じだが...)、原点が左上、X は右向き、Y は下向きに増えるように座標が決められている。モグラの位置もこの決まりに従うことにする。
上の例では、モグラの位置は X=3 (3列目)、Y=2 (2行目) となる。
つまり、X と Y と言う2つの数字が決まれば、モグラの位置が決まる。
なお、今は横3個、縦3個の穴なので、X = 1, 2, 3、Y=1, 2, 3 のいずれかになるようにする。
X と Y をランダムに決めるには、T と同じように 整数乱数関数を使う。
つまり、
RanInt#(1,3)→X
RanInt#(1,3)→Y
とすると、モグラの顔が出るランダムな位置が決まる。
4.モグラが実際に顔を出す処理を作る
座標が決まっただけでは、実際にモグラが顔を出せない。
[ ][ ][ ]
[ ][ ][O]
[ ][ ][ ]
モグラを「O」で表現する。
穴の並びが既に表示してあって、そこへモグラだけを追加表示したい。そこで、Locateコマンドを使って、特定の位置に文字を表示する。
つまり、
Locate A,B,"O"
と書く。
次に、この A と B をどうすれば良いかを考える。
モグラの位置は、プログラム上では、既に上で X と Y で決まるようにした。従って、実際のLocateコマンドで使う A と B を X と Y を使って表せば良いことになる。
A は横の並びを決めるのだった。
A = 3X -1
B = Y
これでよい。ちょっと考えて思いついたのでラッキーだ。
例えば、上のモグラの例だと、X=3、Y=2 なので、A= 8、B=2 となるから、モグラを表示するには、
Locate 3X-1,Y,"O"
と書けば良い。これは、1~3のどのような X と Y でも正しい。
以上をまとめると、ランダムな場所、なおかつランダムなタイミングで、モグラに顔をださせるソースコードは次のようになる。
For 1→B To 3
Locate 1,B,"[ ][ ][ ]"
Next
RanInt#(1,4)→T
RanInt#(1,3)→X
RanInt#(1,3)→Y
T^(3)→T
Lbl 1
Dsz T
Goto 1
Locate 3X-1,Y,"O"
このソースコードの先頭のモグラの穴の表示の直後に Lbl 0 を、最後に Goto 0 を追加して、実際に実行してみると、モグラがピョコピョコ顔を出すのが見られる。
私がfx-5800Pで初めて作った、動きのあるプログラムだ。
For 1→B To 3
Locate 1,B,"[ ][ ][ ]"
Next
Lbl 0
RanInt#(1,4)→T
RanInt#(1,3)→X
RanInt#(1,3)→Y
T^(3)→T
Lbl 1
Dsz T
Goto 1
Locate 3X-1,Y,"O"
Goto 0
つづく...
⇒ もぐら叩き(2)
応援クリックをお願いします。励みになるので...