fx-5800P【ゲーム】:もぐら叩き(4)
fx-5800Pでもぐら叩き
e-Gadget
fx-5800P【ゲーム】:もぐら叩き(3)の続き...
今回で暫定的にゲームを完成させ、次回以降でゲームのクオリティを上げてゆく。
前回までに作ったプログラム:
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]
17→D:0→P
For 1→B To 3
Locate 1,B,"[ ][ ][ ]"
Next
Locate 11,2,"PRIZE"
Locate 12,3,P
Locate 1,4,"LIFE:"
Locate 6,4,L
Lbl 0 : 一番下のGoto 0からジャンプしてくる
RanInt#(1,4)→T
RanInt#(1,3)→X
RanInt#(1,3)→Y
T^(3)→T
9+X-3Y→N
Lbl 1
Dsz T
Goto 1
0→C
Locate 3X-1,Y,"O"
Do
Isz C
Getkey→K
LpWhile K≠Z[N]
Locate 3X-1,Y," "
If C≦D:Then
P+20-C→P
Else
L-1→L
IfEnd
Locate 12,3," "
Locate 12,3,P
Locate 6,4,L
L⇒Goto 0 : 上のLbl 0へジャンプして繰り返す、L=0 ならジャンプせず終了
0→DimZ
ここまで作って遊んでみると、気に入らない点が出てきた。モグラへの反応をしないでいると、プログラムはモグラを叩くのをズ~ッと待っているのだ。これではゲームとしてはマズイ。
プログラムで何が起きているかと言えば、入力キーの判定を行う Do ~ LpWhileループ でモグラを叩くためのキー入力を待ち続けている状態になっている。
そこで、タイムアウト機能を追加して、モグラを叩くキー入力を少し待って、入力が無い時には、このループから強制的に出て、次の処理へ進むように変更しようと思う。
そこで、改めてゲームの仕様を変更することにした。
10.ゲームの暫定仕様を変更する
タイムアウトの基準を変数Eに格納しており、タイムアウトした時はPRIZE(総合点)とLIFEを供に減らすことにする。
1) | 持ち点について: モグラを1匹相手にするたびに、持ち点をもらう: 持ち点 = 20とする |
2) | COSTについて: COST は変数 C に格納する(偶然だが、既にそうなっている、ちょっとコジツケ) モグラを速く叩くと COST が小さくなり、遅いとCOSTが大きくなる |
3) | 得点について: モグラへの反応が速ければ得点が多くなり、遅ければ得点は少ない モグラ1匹を叩く際、最初にもらった持ち点=20から C を引いた結果が得点 得点: 20-C ・C≦17 の時(モグラへの反応が速い時): 得点 = 20-C を得る ・C>18 の時(モグラへの反応が遅い時): 得点 = 0、さらに LIFE が1つ下がる この境目の17を変数Dに格納して、判定させるようにする。 |
4) | PRIZE(総合点)について: 獲得した得点を足し合わせたものを PRIZE(総合点)とする。 PRIZE を変数 P に格納する PRIZE をリアルタイム表示する PRIZEの計算: P+20-C→P |
5) | Time-out処理について: モグラへの反応が非常に遅ければ、モグラが引っ込み、PRIZEとLIFEの双方が減らされる。 ・タイムアウト条件: E=25 ・C>E の時(モグラへの反応が非常に遅い時): 総合点が25点減り(P-25→P)、LIFEが1減る(L-1→K) |
6) | LIFE(ゲーム継続権利)について ゲーム開始時に、LIFE をもらう: LIFE=5 とする LIFE を変数 L に格納する LIFE をリアルタイム表示する ・C>18 の時(モグラへの反応が遅い時): LIFE が1減る ・LIFE が0になると、ゲーム終了 |
11.タイムアウト処理をコードに反映させる
モグラが叩かれる判定処理は、Do ~ LpWhileループで処理している。
Do
Isz C
Getkey→K
LpWhile K≠Z[N]
このループ内で、C がE (=25) を超える場合は、強制的にループを抜ける処理を書く。
fx-5800Pでは、ループから強制的に外に出る時に役立つコマンドが準備されている。Breakコマンドだ。Breakコマンドは、Do ~ LpWhileループ、While ~ WhileEndループ、For ~ Next ループで使える。
では、タイムアウト時のコードを書く。
Do
Isz C
If C>E:Then
P-25→P
Break:IfEnd
Getkey→K
LpWhile K≠Z[N]
追加した部分を赤い文字で示す。
さて、Do ループを抜けると、その下に続いている処理が実行される。その部分を見てみる。
Locate 3X-1,Y," "
If C≦D:Then
P+20-C→P
Else
L-1→L
IfEnd
Locate 12,3," "
Locate 12,3,P
Locate 6,4,L
L⇒Goto 0 : 上のLbl 0へジャンプして繰り返す、L=0 ならジャンプせず終了
0→DimZ
この部分は、特に変更が不要なことがわかる。
オレンジ色のコードに注目してみると、Do ループから抜けた後、Cは25よりも大きいのだから、If C≦D の条件には 合わない。従って、Elseへ移って、L-1→L が実行される。つまり、LIFEが1つ減らされる。
このままで、仕様通りの処理ができる。
ところで、タイムアウトの条件を決めるEの初期化処理を、忘れずに行っておく。変数DやPの初期化を行っているプログラム冒頭部分に、25→E を追加しておく。
12.暫定仕様のプログラムを仕上げる
ゲームが終了した時、やはり GAME OVER の表示や、ちょっとした動きが欲しくなった。
そこで、次のような表示を考えて、その機能を追加してみる。
[ ][ ][ ]
[ ][ ][ ] PRIZE
[ ][ ][0] 1618
LIFE:0
LIFEがゼロになった。ここでゲーム終了となる。
先ずは、口を手で押さえてウフフ笑いのモグラ「Q」が、次々に全部の穴から顔を出させる。
[Q][Q][Q]
[Q][Q][Q] PRIZE
[Q][Q][Q] 1618
LIFE:0
続けて、GAME OVER の表示が出る。
[Q][Q][Q]
GAME OVER PRIZE
[Q][Q][Q] 1618
LIFE:0
この処理を追加するには、モグラの穴に Q を順次表示させ、続いて "GAME OVER"を表示すれば良い。
For 1→A To 3
For 1→B To 3
Locate 3B-1,A,"Q"
Next:Next
Locate 1,2,"GAME OVER"
これで、暫定仕様がひとまず完成した。
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]
17→D:0→P
For 1→B To 3
Locate 1,B,"[ ][ ][ ]"
Next
Locate 11,2,"PRIZE"
Locate 12,3,P
Locate 1,4,"LIFE:"
Locate 6,4,L
Lbl 0
RanInt#(1,4)→T
RanInt#(1,3)→X
RanInt#(1,3)→Y
T^(3)→T
9+X-3Y→N
Lbl 1
Dsz T
Goto 1
0→C
Locate 3X-1,Y,"O"
Do
Isz C
If C>E:Then
P-25→P
Break:IfEnd
Getkey→K
LpWhile K≠Z[N]
Locate 3X-1,Y," "
If C≦D:Then
P+20-C→P
Else
L-1→L
IfEnd
Locate 12,3," "
Locate 12,3,P
Locate 6,4,L
L⇒Goto 0
0→DimZ
For 1→A To 3
For 1→B To 3
Locate 3B-1,A,"Q"
Next:Next
Locate 1,2,"GAME OVER"
13.ゲームで遊んでみる
作ったゲームで遊んでみた。徐々に上達してきて、1000 PRIZE 程度を出せるようになった。
ところで、我が家にはゲーマーが2人いるので、遊んで貰った。いきなり 3000 PRIZE 以上をたたき出した。そして評価を聞いてみたところ、もっとスピードが無いとつまらないと言う。
そこで、モグラの顔を出すタイミングを決める処理;
RanInt#(1,4)→T
T^(3)→T
の部分がスピードを落としている原因なので、以下のように変更しスピードアップさせた。
RanInt#(1,9)→T
そして、このスピードアップには満足してもらい、面白くなったと言う。そして、さらに遊んで貰ったところ、ついに30005 PRIZE をたたき出した。
現状では、5桁のPRIZEに対応していないので、PRIZEの値Pを表示する前の空白4個で埋める部分を、空白6個で埋めるように変更した。
ゲームらしくなってきた。
fx-5800P用プログラム
もぐら叩き 暫定仕様
==================
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]
17→D:0→P
For 1→B To 3 :初期画面表示
Locate 1,B,"[ ][ ][ ]"
Next
Locate 11,2,"PRIZE"
Locate 12,3,P
Locate 1,4,"LIFE:"
Locate 6,4,L
Lbl 0 :ゲームメインループ(始まり)
RanInt#(1,9)→T :モグラ出現のタイミングと座標
RanInt#(1,3)→X
RanInt#(1,3)→Y
9+X-3Y→N
Lbl 1 :モグラ出現のカウントタイマー
Dsz T
Goto 1
0→C :モグラを出現させ、叩くまでの処理
Locate 3X-1,Y,"O"
Do
Isz C
If C>E:Then
P-25→P
Break:IfEnd
Getkey→K
LpWhile K≠Z[N]
Locate 3X-1,Y," "
If C≦D:Then :モグラを叩いた後の判定
P+20-C→P
Else
L-1→L
IfEnd
Locate 12,3," " :リアルタイム表示
Locate 12,3,P
Locate 6,4,L
L⇒Goto 0 :ゲームメインループ(終わり)
0→DimZ :ゲーム終了時の処理
For 1→A To 3
For 1→B To 3
Locate 3B-1,A,"Q"
Next:Next
Locate 1,2,"GAME OVER"
==================
fx-5800Pでは、上のような注記(コメント)を挿入することが出来ないので、上の注記は実際に入力していない。注記を見てみると、スッキリと処理が軽くなるように作ったことが、分かると思う。
このゲームを作るきっかけは、電卓でどの程度のアクションゲームが出来るかと言う興味からであったが、この程度の遊べるゲームなら作れることが分かった。
より面白いゲームにするための我が家のゲーマー達からのアドバイスは、以下のようなものだった。
1) 間違ったモグラを叩いた時にペナルティーとしてLIFEを減らす
2) たまには、モグラでないものが顔を出し、それを叩くとペナルティーとしてLIFEを減らす
このようにすると、より緊張感が増すので、面白くなる....なるほど、確かにそうだ(´д`)
ここまできたので、もう少し面白くしようと思う。
まだ、つづく...
⇒ もぐら叩き(5)
応援クリックをお願いします。励みになるので...