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)



応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ



keywords: fx-5800Pゲームプログラミングもぐら叩きプログラム関数電卓

リンク集 | ブログ内マップ

関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

コメントの投稿

非公開コメント

最新記事
最新コメント
カテゴリ
C# (3)
検索フォーム
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム関数電卓は、プログラムを作り・使ってナンボ!

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています

おもしろい・役に立つならクリックしてください。励みになります。
にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村


人気ブログランキングへ


FC2ブログランキングへ


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

RSSリンクの表示
最新トラックバック
ブロとも申請フォーム

この人とブロともになる

QRコード
QR