Casio Basic入門11
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終: 2015/01/08
最終: 2015/01/08
4. CasioBasicを使ってみる(続き)
Chapter 2 - 初級
◆ Chapter 2 の目標: 動きのあるプログラムを作る
簡単なアクションゲームを作る
前回: Casio Basic入門10
Chapter 2-4 でフライング対策をしたゲームの基本部分ができました。
プログラム名 CH2-4
0→E
RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"
Else
Locate 8,2,"+"
IfEnd
Getkey=57⇒1→E
Dsz C
LpWhile E=0
Locate 8,2," "
0→C
Do
E=1⇒Break
Isz C
LpWhile Getkey≠57
Locate 8,2,C
If E=1
Then
Locate 3,2,"FALSE START"
IfEnd
プログラムのブロック構造
[初期化処理] ブロック
[アニメーション表示] ブロック
[反応時間測定&表示] ブロック
[例外処理] ブロック
ゲーム仕様
1) ゲームスタート時、所定の試行回数が与えられる
2) アニメーションを表示する待ち時間がある(待ち時間はランダム)
3) アニメーションが終わったら、できるだけ速くキーを押す
4) 反応が速いほうが多くの得点が加算される
5) 表示が変わる前のお手つきや、反応が遅すぎる場合は、得点と試行回数が減る
6) 試行回数が0になるとゲーム終了し、その際の得点を競う
項目の 2) と 3) と 5)の一部は実現できました。
残る部分を作るには、これまで作った部分を繰り返すようにプログラムの変更が必要だとわかります。その上で、試行回数、得点を表示し、試行回数0でゲームが終わるようにすれば完成です。
Chapter 2-5
プログラム制御
プログラムを繰り返すには、ループを使えば良いので、全体を繰り返すループに Lbl / Goto ループを使うことにします。メインループなので、Main Loop の M を使って Lbl M / Goto M とします。
Lbl M
[ゲーム全体の処理]
Goto M
これは、無限ループです。
ゲーム仕様に従えば、試行回数(トライ回数)の残りが0になればゲーム終了となるので、試行回数(トライ回数)の残りが 0 になったときにループを終了すれはOKです。試行回数を変数 T (トライ=Try の T)に代入しておき、何かの条件により T を減らすようにしてゆきます。
T がゼロになったときゲームを終了するためには、以下のように 条件ジャンプ命令⇒ を使うと、うまくループを終了できます。
Lbl M
[ゲーム全体の処理]
M⇒Goto M
条件ジャンプ命令の仕様から、Mがゼロでない時は Goto M を実行しますが、Mがゼロになると、Goto M を飛ばして、次へジャンプするので、ループが終了します。トライ回数を減らす条件については、後で作ることにし、今は無限ループにしておきます。
それでは、無限ループを組み込みます。
Lbl M
0→E
RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"
Else
Locate 8,2,"+"
IfEnd
Getkey=57⇒1→E
Dsz C
LpWhile E=0
Locate 8,2," "
0→C
Do
E=1⇒Break
Isz C
LpWhile Getkey≠57
Locate 8,2,C
If E=1
Then
Locate 3,2,"FALSE START"
IfEnd
Goto M
これを走らせてみてください。
プログラムが全く止まりません。忙しすぎて、メリハリが無くて、ゲームとしては問題です。そこで、アニメーションを開始するところで、一旦プログラムを止めます。止まると同時に操作方法を表示させることにします。
操作方法の表示のために、プログラム冒頭にある初期化処理部分に操作方法表示の Locate コマンドを追加します。
初期化処理部分は、今のところ
0→E
だけで、ここに以下のように追加します。
0→E
Locate 6,4,"<EXE>:START"◢
ここで、出力命令◢ を利用します。
出力命令◢ には一時停止の機能が付加されおり、それを利用するわけです。画面の右下に <EXE>:START と表示され、プログラムが一時停止します。
プログラムが出力命令◢ で止まった後、停止解除するには [EXE] キーを押します。それ以外のキーでは停止解除しません。従って、<EXE>:START としました。
[EXE] キーを押すと、ゲームが始まり、[(-)] キーを押せば、結果が出るかフライングになって、また最初の表示に戻ってプログラムが一時停止します。
操作方法を表示するのなら、ついでに <(-)>:STOP も表示させましょう。
[EXE] キーを押してゲームがスタートしたら、<(-)>:STOP に表示を切り替えることにします。
そして、結果が出るかフライングになるか、いずれにせよ [(-)] キーを押したときに、表示を <EXE>:START に切り替えます。
0→E
Locate 6,4,"<EXE>:START"◢
Locate 6,4," <(-)>:STOP"
<(-)>:STOP の前に、スペースが1つ入っていることに注意してください。<EXE>:START をきれいに上書きするためには、このスペースが必要です。スペ-スを入れることで、どちらの表示も11桁になるように揃えました。


もう一つ、必要な表示処理があります。フライングになった場合は 2行目の中央に FALSE START と表示されます。次の試行の前に、これを一旦消さないと、アニメ-ション表示と重なって表示されてしまいます。そこで、一旦2行目を端から端まで消去します。
2行目の1桁めから16桁めまで、スペースで上書きすればOKですね。
以上から、初期化部分は、以下のようになります。
0→E
Locate 6,4,"<EXE>:START"◢
Locate 6,4," <(-)>:STOP"
Locate 1,2," "
これで、連続して何回もゲームを続けられるようになりました。
プログラム名 CH2-5
Lbl M
0→E
Locate 6,4,"<EXE>:START"◢
Locate 6,4," <(-)>:STOP"
Locate 1,2," "
RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"
Else
Locate 8,2,"+"
IfEnd
Getkey=57⇒1→E
Dsz C
LpWhile E=0
Locate 8,2," "
0→C
Do
E=1⇒Break
Isz C
LpWhile Getkey≠57
Locate 8,2,C
If E=1
Then
Locate 3,2,"FALSE START"
IfEnd
Goto M
プログラムのブロック構造
Lbl M
[初期化処理] ブロック
[アニメーション表示] ブロック
[反応速度測定&表示] ブロック
[例外処理] ブロック
Goto M
Chapter 2-6
複数条件分岐の記法
ゲームを何回もトライして、その点数を付ける機能を、追加します。
点数の付け方を次のようにしでみます。
1.毎回のトライで得た得点を積算して、総得点Pとする
2.制限時間を設定する: 変数L (Limit の L)、20とする
3.反応時間は、カウンターC
4.得点を、L-C とする
5.フライング時は、減点を L-C とする
6.タイムアウト時は、減点を L とする
ゲーム進行上は以下のようになります。
・制限時間を超えるとタイムアウト。減点L
・制限時間ギリギリで反応すると、得点ゼロ
・制限時間内で、速く反応するほど高得点になる: L-C
・フライングの時は、減点L-C。フライングが速いほど減点が多くなる。
このように決めると、実際の総得点は、
A) フライングしない時の総得点計算: P+L-C→P
B) フライングしたときの総得点計算: P-L+C→P
C)タイムアウトした時の総得点計算: P-L→P
※今は、Lを20とします。
最終的には、L をゲーム進光状況に応じて変化させると、ゲームが面白くなるかもしれません。そこで、制限時間には、決め打ちの20ではなくて、変数 L を使って、プログラムを作ります。但し、L の初期値は20としておきます。
先ずは、[初期化処理] (1ブロック)に
0→P:20→L
を追加します。
今回、タイムアウトと言う要素を追加します。タイムアウトの条件は、C>L です。
タイムアウトは [反応時間測定&表示] (3ブロック)での例外事象として扱います。
0→0
Do
E=1⇒Break
Isz C
LpWhile Getkey≠57
Locate 8,2," " (スペース16個)
この [反応時間測定&表示] (3ブロック)で、C>L の時 Break コマンドで Doループから抜け、抜けた直後に 例外フラグE に 2 を代入します。
その結果、例外フラグE は3つの値をとります。例外フラグEが1の時はフライング、2の時はタイムアウトと言うわけです。例外でない場合は例外フラグEは0です。
以上をプログラムに反映させると、
0→C
Do
E=1⇒Break
C>L⇒Break
Isz C
LpWhile Getkey≠57
C>L⇒2→E
Locate 8,2,C
追加部分は、赤文字で示しました。
例外処理
総得点の計算は、[例外処理] ブロックで行います。
<総得点計算>
Eが2の時: P-L→P
Eが1の時: P-L+C→P
Eが0の時: P+L-C→P
の計算を追加します。
表示内容は、以下の場合分けになります。
<表示内容>
Eが2の時: TIME OUT
Eが1の時: FALSE START
Eが0の時: 特になし
総得点の表示は、例外フラグEの値に関わらず、共通の処理で実装可能です。
Locate 3,1," " (スペース4個)
Locate 3,1,P
総得点は増減するものなので、少ない桁数で更新されることもあります。その時は、既に何度も行っているように、あらかじめ消去(スペースで上書き)した上に、総得点を上書きする必要があります。
複数条件分岐
If ~ Then ~ Else ~ IfEnd は、1つの条件に対して、それが成り立つかそうでないか、つまり真か偽かによって処理を振り分けます。二者択一の処理をします。
今回は例外フラグEが、2、1、0 の3通りの値になります。これらを条件として3通りに処理を振り分けたいので、If 文を使う場合は If 文の中にもう1つ If 文を入れる多重構造(入れ子構造)が必要になります。
ところで、Visualbasicでは、ElseIf と言うコマンドがあって、
If [条件1]
Then [処理1]
ElseIf [条件2]
Then [処理2]
ElseIf [条件3]
Then [処理3]
:
:
Else [処理0]
End If
といった、複数の条件による分岐処理が可能です。
或いは、
Select Case [変数]
Case 1
[処理1]
Case 2
[処理2]
Case 3
[処理3]
Case 4
[処理4]
:
:
End Select
といった、複数分岐処理も可能です。
C言語でも
switch (変数) {
case 1:
[処理1];
case 2:
[処理2];
case 3;
[処理3];
case 4:
[処理4];
:
:
default:
[処理0];
}
といった処理が可能です。
このように、多くの高級言語には、複数条件分岐処理が可能なステートメントが備わっています。一方で、Casio Basicには、このような複数条件分岐処理のステートメントが用意されておらず不便に感じます。
ところが、Casio Basic では、次のような記述方法を使えば、簡単に複数条件分岐処理を実現できます。
CasioBasic用 複数条件分岐の構文
基本構文は以下の通りです(Else と If を組み合わせるところがミソ):
If [変数]=4:Then
[処理4]
Else If [変数]=3:Then
[処理3]
Else If [変数]=2:Then
[処理2]
Else If [変数]=1:Then
[処理1]
Else If [変数]=0:Then
[処理0]
IfEnd
IfEnd
IfEnd
IfEnd
IfEnd
※注意点: If の数と同数の IfEnd を最後に書くこと
Else If は、普通に Else と If を続いて入力します。
Casio Basic には ElseIf と言う1語(ワンワード)のコマンドは用意されていないものの、Else と If を並べて書くことで、プログラムの読みやすさ(可読性)を損なわずに複数条件分岐ができます。但し、この記法を用いる時には、最後に IfEnd を If と同じ数だけ記述する点に留意してください。
※ IfEnd が If の数よりも少なくても正常動作する可能性はありますが、運が良いだけです。制御構造が複雑になると必ず誤動作するので、原則通りにIfEndを記述すべきです。
さて、今回の例外処理を行うには、[変数] に「例外フラグE」を使えば良いわけです。
※ CasioBasicコマンドリファレンス
- If 文
[例外処理] ブロックのプログラム
話を元に戻して、[例外処理]ブロックのプログラムは、以下のようになります。
If E=2
Then
P-L→P
Locate 5,2,"TIME OUT"
Else If E=1
Then
P-L+C→P
Locate 3,2,"FALSE START"
Else If E=0
Then
P+L-C→P
IfEnd
IfEnd
IfEnd
Locate 3,1," " (スペース4個)
Locate 3,1,P
ここまでをまとめると、以下のプログラムになります。
プログラム名 CH2-6
0→P:20→L
Locate 1,1,"P:0"
Locate 1,3,"L:"
Locate 3,3,L
Lbl M
0→E
Locate 6,4,"<EXE>:START"◢
Locate 6,4," <(-)>:STOP" (頭にスペース1個)
Locate 1,2," " (スペース16個)
RanInt#(2,50)→C
Do
If C-4Int(C÷4)≦1
Then
Locate 8,2,"×"
Else
Locate 8,2,"+"
IfEnd
Getkey=57⇒1→E
Locate 8,2," " (スペース1個)
0→C
Do
E=1⇒Break
C>L⇒Break
Isz C
LpWhile Getkey≠57
C>L⇒2→E
Locate 8,2,C
If E=2
Then
P-L→P
Locate 5,2,"TIME OUT"
Else If E=1
Then
P-L+C→P
Locate 3,2,"FALSE START"
Else If E=0
Then
P+L→P
IfEnd
IfEnd
IfEnd
Locate 3,1," " (スペ-ス4個)
Locate 3,1,P
Goto M
プログラムのブロック構造
Lbl M
[初期化処理]
[アニメーション表示]
[反応速度測定&表示]
[例外処理]
Goto M
フライングとタイムアウトの例外処理を作り、総合得点の表示までできました。プログラムを走らせてみると、なんとかゲームの形ができあがってきたことが分かります。
次回では、引き続きゲームオーバーの処理を作り込んでゆきます。
つづく...
⇒ CasioBasic入門12 / 目次
応援クリックをお願いします。励みになるので...