fx-5800P【ゲーム】:もぐら叩き(8):修正あり
fx-5800Pでもぐら叩き
e-Gadget
fx-5800P【ゲーム】もぐら叩き(7) の続き
色々と工夫するところがまだ有りそうだが、前回までに作ったゲームのメインルーチンを土台にして、ゲームとしてまとめようと思う。
そこで、ゲームコンセプトを、「もぐら退治の賞金稼ぎ」とする。
◆ゲーム開始時に、LIFE をもらう。
◆モグラ退治が遅い場合や間違って退治すると、LIFE が減り、それがゼロになるとゲーム終了
◆モグラ1匹あたり、定額の資金をもらう。
◆モグラ退治に時間がかかるほど、費用がかさむ
◆モグラを素早く退治すると、退治費用が節約でき、資金の残りが賞金となる
◆限られたLIFEで、どこまで賞金(PRIZE) を稼げるか、がんばろう!!
◆モグラが出現すると FUND (資金)を貰う
◆モグラを叩くと、反応時間分のCOST(費用)が減る
◆モグラ退治が速いほど、FUND - COST 分の儲け(得点)が多くなり、PRIZE(賞金)が増える
◆モグラ退治に時間がかかると、BURST となり LIFE が減る。
◆モグラを取り逃がすと、TIME-OUTとなり、 LIFE が減るだけでなく、 PRIZE がごっそり減る
◆ゲームが進むと、FAKE モードが発動される
◆FAKE ONE モードは、偽モグラが出現する。これは放置。手を出すと LIFE が減る
◆FAKE TWO モードは、偽モグラと本物モグラが同時に出現する。本物を退治すると儲けがあるが、偽モグラを退治すると LIFE が減る。
ゲームの内部仕様を、以下のようにする。これまで作ったロジックはそのままにして、上の仕様に併せて、分かりやすい変数名になるように、変数を一部変更する。
1) | 持ち点について: ・モグラが出現するごとに、持ち点(資金=fund)をもらう ・ 持ち点は、設定変更できる ・持ち点を "FUND" と呼び、変数 F に格納する ・変数F のデフォルトを 20 とする |
2) | モグラを叩くまでの手間 (COST): ・COST は、モグラが出現すると時間とともに増えてゆく ・正しいモグラを叩くと、その時点で COST が確定する。 ・モグラを叩くのに時間がかかれば、それだけCOSTが多いことになる ・COSTを変数C に格納する |
3) | 得点について: ・モグラが出現する際に貰う持ち点から、COST を差し引いたものが得点 ・得点 = [ FUND (F) ] - [ COST (C) ] ・モグラへの反応が速ければ得点が多くなり、遅ければ得点は少ない ・COSTが一定以上になる(反応が遅い)時は、BURST してペナルティーが課される。 ・BURST になる COST を "BURST LIMIT"と呼び、変数B に格納する。 ・BURST LIMITは、設定変更できる。デフォルトを17とする。 ・C≦B の時(モグラへの反応が速い時): 得点 = F-C を得る ・C>B の時(モグラへの反応が遅い時): 得点 = 0、さらに LIFE が1つ下がる |
4) | PRIZE(総合点)について: 獲得した得点を足し合わせたものを PRIZE(総合点)と表記し、を変数 P に格納する PRIZE をリアルタイム表示する PRIZEの更新: P+F-C→P |
5) | Time-outについて: モグラへの反応が遅すぎると、モグラが逃げてしまい、PRIZE と LIFE の双方が減らされる。この時間を "TIME OUT"と呼び、変数E (End のE)に格納する。 ・タイムアウト条件の設定を変更可能とする。 ・C>E の時(反応が遅く、モグラを逃した時)の減点を "BURST LOSS"と呼び、変数S に格納する。 ・変数S のデフォルトを25とする ・BURST LOSS 発生時は、PRIZEが25点減り(P-S→P)、LIFEが1減る(L-1→L) (shake = 逃がす) |
6) | FAKEモードについて: ・PRIZEが所定点数に達すると、FAKE機能を発動させる。 ・FAKEが機能が発動する時の PRIZE (総合点)を "INVOKE FAKE" と呼び、変数V に格納する。 ・変数V のデフォルトを200とする。 ・FAKE機能は、以下の2つ ・FAKE ONE: (Q=2) 偽モグラのみを出現させる。何かを叩くとLIFEが1減る。放置してTIME-OUTにすれば良い。 ・FAKE TWO: (Q=1) 偽モグラと本物モグラを同時に出現させる。本物モグラ以外を叩くと、LIFEが1減る。 |
7) | LIFEについて: ・ゲーム開始時に、LIFE をもらう ・LIFEの初期値を変数M に、ゲーム進行時にリアルタイム変化する LIFE を変数 L に格納する ・LIFEの初期値のデフォルトを 7 とする。 ・LIFE をリアルタイム表示する ・C>E の時(モグラへの反応が遅い時): LIFE が1減る、但し FAKE ONE モードは例外。 ・LIFE が0になると、ゲーム終了 |
【2013/12/18 修正】
fx-5800P:コマンドの処理時間【再編集】で、幾つかのコマンドの処理時間を調べたところ、条件分岐には If 文よりも ⇒ 命令の方が速く、特に 変数の評価を行う場合は、⇒ が圧倒的に速いことが分かった。
If A:Then
[何か処理]
IfEnd
よりは、
A⇒[何か処理]
の方が圧倒的に速い。
一方、
If A=B:Then
[何か処理1]
Else
[何か処理2]
IfEnd
より、
A=B⇒[何か処理1]
A≠B⇒[何か処理2]
の方が時間がかかる。
従って、[変数]の評価では極力 ⇒命令を使うようにし、[式] の評価では Else を使わない場合は ⇒を 使ってプログラムコードを書く。
======ここまで修正 ======
最後に、FAKEモードで、偽モグラを [Q] で表現してたが、[0] (斜め線の入ったゼロ (fx-5800Pではオーとゼロを区別するために、ゼロのフォントは斜め線が入っている)を使うことにする。本物と偽のモグラを紛らわしくする作戦だ。
これに併せて、GAME OVER 表示の際に用いていた偽モグラ も、Qから0(斜め線付き)に変更する。
各種設定を変更するルーチンを、メインルーチンとし、ゲーム本体をサブルーチンとする。そしてメインルーチンからゲーム本体を呼び出す構造にする。
先ずは、実行画面から紹介しよう。
[FILE] キーを押して、プログラム リストから WHACK-A-MOLEを実行すると、もぐら叩きゲームの初期画面が表示される。

[0] キーを押すと、デフォルトの設定変更だ。
[EXE] キーを押せば、ゲームスタート。
[AC] を押せば終了。
[EXE] キーで、もぐら叩きの画面登場!

[0] キーで GO(ゲーム開始)!

モグラが出現する。
モグラの位置対応するテンキー[1]~[9]を、素早く押す!
PRIZEが200になると、FAKE モード発動!

偽モグラは、O (オー)ではなくて、ゼロ なので、間違えやすいので、要注意!
間違えると、LIFE が減ってしまう、慎重に...

偽物と本物モグラの両方も出現する。
本物を、素早く叩くのだ...

ついに、LIFE がゼロになって、GAME OVER ...
右下の表示に従って [EXE] キーを押すと、終了メニューが現れる。

GAME OVER メニュー:
[0] キーで、最初のゲームタイトル画面へ戻る。
[RCL] キーで、同じ条件でゲーム開始!
最後に、完成したプログラムコードをまとめる。
先ずは、ゲーム本体(サブルーチン)の完成版は次のようになる。赤文字は、今回追加・変更した部分だ。
fx-5800P用プログラム
もぐら叩きゲーム Ver 1
ゲーム本体
プログラム名:"WAM"
==================
Lbl 2
M→L:0→P:0→Q :変数の初期化
Cls :メインルーチンで他の初期化を行う
10→DimZ
35→Z[1]:36→Z[2]
37→Z[3]:21→Z[4]
22→Z[5]:23→Z[6]
31→Z[7]:32→Z[8]
33→Z[9]
For 1→I To 3 :初期画面表示
Locate 1,I,"[ ][ ][ ]" :For の制御変数をBからIに変更
Next
Locate 11,2,"PRIZE"
Locate 12,3,P
Locate 1,4,"LIFE:"
Locate 6,4,L
Locate 11,4,"GO:<0>" :もぐら叩き開始
While Getkey≠25
WhileEnd
Locate 11,4," " :スペースが6個
Lbl 0 :ゲームメインループ(始まり)
RanInt#(1,9)→T :モグラ出現のタイミングと座標
RanInt#(1,3)→X
RanInt#(1,3)→Y
RanInt#(0,3)→Z
RanInt#(1,3)→W
9+X-3Y→N
If P≧V:Then :FAKEモード発動
Z=0⇒2→Q
Z=1⇒1→Q
Z≧2⇒0→Q
Else 0→Q:IfEnd
Lbl 1 :モグラ出現のカウントタイマー
Dsz T
Goto 1
0→C :本物/偽モグラを出現させる
If Q=2:Then :FAKE ONE モード
Locate 3X-1,Y,"0" :斜め線のあるゼロ
Else :FAKE TWO モード
Q=1⇒Locate 3W-1,X,"0" :斜め線のあるゼロ
Locate 3X-1,Y,"O"
IdEnd
Do :モグラを叩くまでのカウンタ
Isz C :C (COST)が増える
C>E⇒Break :2014/03/20 修正
Getkey→K
LpWhile K=0
:モグラを消す
Q=1⇒Locate 3W-1,X," " :スペース1個
Locate 3X-1,Y," " :スペース1個
If Q≦1:Then :モグラを叩いた後の判定
If C≦B And K=Z[N]
Then P+F-C→P
Else L-1→L
C>E⇒P-S→P :2014/03/20 修正
IfEnd
Else
C≦E⇒L-1→L : 2014/03/20 修正
IfEnd
Locate 12,3," " :リアルタイム表示(スペース6個)
Locate 12,3,P
Locate 6,4,L
L⇒Goto 0 :ゲームメインループ(終わり)
0→DimZ :ゲーム終了時の処理
For 1→I To 3 :For 文の制御変数をA, Bから I, J に変更
For 1→J To 3
Locate 3J-1,I,"0" :0に斜め線のゼロ
Next:Next
Locate 1,2,"GAME OVER"
Locate 10,4," <EXE>
Cls
Locate 1,2,"GAME OVER"
Locate 2,3,"<0> :GO BACK"
Locate 1,4,"<RCL>
Do :キー入力待ち
Getkey→K
K=25 Or K=41⇒Break
LpWhile 1
K=41⇒Goto 2
==================
ゲームが終了すると、以下の画面になる。

画面上でのこれまでとの違いは、右下に
ここで[EXE]キーを押すと、ゲーム終了時メニューが現れる。

ここで、[RCL] を押すと、同じ条件でゲーム開始の画面になる。

ゲーム終了時メニューで、[0] キーを押すと、プログラムを起動した時の最初の画面に切り替わる。ここで、各種デフォルト設定を変更できる。

最初にゲームを起動した時と同じ画面だ。[0]キーと[EXE]キーは、Getkeyコマンドでキーコードを取得し、If 分による条件分岐で必要な処理を行う。
この処理を行うプログラム(メインルーチン)は今回新たに作った。具体的には、以下のようになる。
fx-5800P用プログラム
もぐら叩きゲーム Ver 1
メインルーチン
プログラム名:"WHACK-A-MOLE"
==================
7→M:17→B:25→E :各種デフォルト設定
20→F:25→S:200→V
Lbl 0
Cls
" WHACK-A-MOLE" :ゲームタイトル
Locate 5,2,"<0>:SETTINGS" :メニュー表示
Locate 6,3,"<EXE>
Locate 8,4,"<AC>
Do :キー入力待ち
Getkey→K
If K=25:Then
Break:IfEnd
LpWhile K≠47
If K=25:Then Cls :[0]キーで設定変更
"LIFE"?M
"BURST LIMIT"?B
"TIME-OUT"?E
"FUND"?F
"SHAKE LOSS"?S
"INVOKE FAKE"?V
Goto 0:IfEnd
Prog "WAM" :ゲーム本体を呼出す
Goto 0
==================
これで、しばらく遊んでみている。
今のところ、徐々にスキルが上がって、PRIZE(総合点)が向上している。
我が家のゲーマーも、まぁまぁだ、と言ってくれている。
少なくとも、私自身はやるたびに PRIZE が増えてゆくので、今は愉しい。
つづく...
⇒ もぐら叩き~まとめ~
応援クリックをお願いします。励みになるので...