fx-5800P【ゲーム】:もぐら叩き(2)

fx-5800Pでもぐら叩き
e-Gadget


fx-5800P【ゲーム】:もぐら叩き(1)の続き...

前回までに作ったプログラム:

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



このプログラムは、Lbl 0 と Goto 0 の間でループにして、ランダムな時間とランダムな位置にモグラの顔を出させる動作を繰り返す。

このプログラムを実行すると、モグラが顔を一旦出すと、二度と引っ込まない。そのうち全ての穴がモグラで一杯になって、それ以上の変化がなくなる。

モグラを引っ込める(=消す)処理を書いていないから、当然ではある。顔を出したモグラをく叩いた(命中した)かどうかを判定する処理を追加し、そのタイミングでモグラを消す処理を追加するつもりだ。

消す処理は簡単だ。モグラは Locate 3X-1,Y,"O" で表現した。消すには、同じところに空白 " " を書き込めば良い。

Locate 3X-1, Y, " "


では、次へ進む...



5.モグラ命中の判定ロジックを考える

さて、ピョコピョコ顔を出すモグラは出来たが、これを叩いて、さらに命中したかどうかの判定を作れば、ゲームの動きの中心部分が完成だ。どのような理屈で、この判定ロジックを実現しようか...


モグラの穴を 3x3 の配列にしたのは、fx-5800Pの1~9の数字キーも 3x3 の並びになっていて、モグラの位置に対応した数字キーを押して、モグラを叩く動作にしようと考えているから...

 [  ][  ][  ]
 [  ][  ][O]
 [  ][  ][  ]


例えば、このモグラを叩いて命中させるには、[6]キーを押せばよいわけだ。

数字キーの並びは、このようになっている。

 [7][8][9]
 [4][5][6]
 [1][2][3]


そこで、モグラの位置を決める1組の数 X と Y に対して、1~9の数字を対応させる法則が分かれば、つまり式が見つかれば話は簡単になる。

この数字キーの並び方は、電卓やパソコンのテンキーではみな同じになっている。一方、携帯を含めた電話機の数字の並びは異なっている。ちょっと調べてみた。

パソコンのテンキーの配列は ISO (国際標準委員会)で決めた規格に従っており、電卓はその流れを汲んでいる。一方、電話機はCCITT (国際電信電話諮問委員会)の規格に従っていて、それらの規格が異なっていると言う背景がある。電話機についてはアメリカのAT&Tが作ったプッシュホンの配列を追認したようだ。

パソコンについてはよく使う0や1が下に来るようになっていると聞くが、おそらくそのような考えで作ったどこかの(多分アメリカの)メーカーの社内規格が標準規格として採用されたのだろうと勝手に想像している。

今作っているプログラムをスマホ上のプログラムに移植する時は、ソースコードの一部を変更する必要が出てくるわけだ。


1) モグラの位置に対応する数字キーを求める

fx-5800P は省電力が最優先事項だからCPUのクロックをかなり落としている筈で、そのためにプログラムの動作が遅くなっていると想像される。従ってアクションゲームを作るには、如何に少ない手順で処理を行うかがポイントだと思う。

そこで、モグラの位置を数字キーに関連付けるのも、数式1つで解決し、If 文などの条件分岐を使わない方法にしたい。

まず以下のようなメモを書いてみた。

X Y  N
------------
1 1
1 2
1 3
------------
2 1
2 2
2 3
------------
3 1
3 2
3 3
------------


X と Y の全ての組み合わせを書き出した。続いてそれぞれのX と Y にに対応する数字キーを、Nの下に書き込んでみた。

X Y  N
------------
1 1  7
1 2  4
1 3  1
------------
2 1  8
2 2  5
2 3  2
------------
3 1  9
3 2  6
3 3  3
------------


これを、じぃ~っと眺めていると、ひらめいた\(^_^)/

9+X-3Y = N

検算してみると、確かに正しい( ^o^)ノ

モグラの座標から対応する数字キーNへの簡潔な公式が見つかった。


2) 数字キーの判定 = モグラ命中の判定

押されたキーを知るには、Getkeyコマンドを使う。

余談だが、fx-5800Pに限らず、最近のカシオ製のグラフ関数電卓 fx-CG20 も Getkeyコマンドを備えており、fx-986GII と fx-CG20 のキーコードと完全んい互換性がある。ただし、これら2機種のキーコードは fx-5800P と互換性はない。参考までに、シャープのグラフィック関数電卓 EL-9900では、取扱説明書を読む限りではあるが、テンキーと矢印キーのみを取得できる KEY コマンドはあるが、他のキーを調べる手段は提供されていないようだ。

さて、[1]キーが押された時、Getkey が 1を返してくれたら話は簡単なのだが、実際はそう都合よくなっていない。

fx-5800Pの Getkey は、以下のような2桁のキーコードを返す。

[1] ⇒ 35
[2] ⇒ 36
[3] ⇒ 37
[4] ⇒ 21
[5] ⇒ 22
[6] ⇒ 23
[7] ⇒ 31
[8] ⇒ 32
[9] ⇒ 33

数字キーの数とキーコードには、簡単な式で表現できる関連性が見つからない。今度は、いくらじぃ~っと眺めていても、分からない。

そこで、数字キーの1~9の数字とキーコードを強引に関連付けるために、配列変数を使って、Nのキーコードを Z[N] に入れて初期化しておく。具体的には、

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] に

入れて、初期化すれば良い。つまり、配列変数 Z[N]N にテンキーの数字を入れると Z[N] がキーコードが返すようにする作戦だ。


以上をまとめると、モグラ命中の判定は以下のような流れになる。

乱数でモグラの位置を決める ⇒ X, Y のペアが決まる。
          ↓
X, Y のペアから N が決まる ⇒ 9 + X -3Y = N
          ↓
N に対応するキーコードが分かる ⇒ Z[N]
          ↓
実際に押された数字キーのキーコードと Z[N] を比較する ⇒ 判定



キーコードを取得する時は、

押されたキーを確実に拾うためにループをグルグル回しておいて、探しているキーが入力されない限りループを回し続け、目的のキーが入力された時にループを終了して、次へ進む...


といった処理が Casio Basic では良さそうだ。上の流れに従ってコードを書くと...


[ Z[1]~Z[9]をキーコードで初期化するコードをここに書く ]
RanInt#(1,3)→X
RanInt#(1,3)→Y
9+X-3Y→N

Do
Getkey→K
LpWile K≠Z[N]



ところで、配列変数 Z[ ] を使う時は、変数の確保と初期化が必要だ。今回は、10→DimZ として10個の配列変数を確保する。本来は9個確保すれば良いが、キリの良いところで、10個にした。深い意味は無い。

配列変数が確保されると、全て0に初期化されるので、改めて対応するキーコードを入れておく必要がある。なおプログラムの最後で、確保した配列変数を解放しておく。解放するには、0→DimZ と書く。

ここまでをまとめると、以下のようなコードになる。

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→B To 3
Locate 1,B,"[ ][ ][ ]"
Next

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

Locate 3X-1,Y,"O"

Do
Getkey→K
LpWhile K≠Z[N]

Locate 3X-1,Y," "

[ 新たなコードは、主にここに追加する ]

Goto 0
0→DimZ



押されたキーが、正しいキーでないと Do~LpWhileのループが回り続ける。つまり、モグラに命中した時に初めて、次の処理へ進むようにしている。

今回の冒頭で、判定処理の後に、顔を出したモグラを消す処理を追加すると書いたように、上のコードには、Locate コマンドを用いてモグラを消す処理を追加してある。

叩いたモグラの判定処理までできた。今後、判定結果に応じた処理を追加してゆく。


さて、このプログラムを実行すると、モグラが顔を出して、それを叩いたらモグラが引っ込む、と言う動作を軽快に楽しめる。この程度の処理では、電卓といえどもサクサク動いていてくれる。


つづく...

⇒ もぐら叩き(3)



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

人気ブログランキングへ


FC2ブログランキングへ



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

リンク集 | ブログ内マップ
関連記事

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

コメントの投稿

非公開コメント

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

やす (Krtyski)

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


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

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

おもしろい・役に立つならクリックしてください。励みになります。

人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR