Casio Basic入門12
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終: 2014/03/03
最終: 2014/03/03
4. CasioBasicを使ってみる(続き)
Chapter 2 - 初級
◆ Chapter 2 の目標: 動きのあるプログラムを作る
簡単なアクションゲームを作る
前回: Casio Basic入門11
Chapter 2-6 で、「フライング」と「タイムアウト」に対応し、総合得点を計算して表示するまでを作りました。
プログラム名 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
今回は、ゲームオーバーの処理を作り込んでゆきます。
Chapter 2-7
ゲーム仕様では、試行回数の残りが0になったらゲーム終了です。ゲーム開始時に、どの程度の試行回数を与えると良いかは、実際にゲームで遊んでみて微調整することにして、今は今はゲーム開始時に3回の試行回数を与えることにします。
試行回数は、試行 = トライ = TRY なので、頭のアルファベット T をとって、変数 T を残っている試行回数に割り当てることにします。ゲーム開始時に T に3を代入します。
そして、「タイムアウト」や「フライング」した時に、ペナルティーとして T を1つ減らすことにします。
これに伴う変更は、以下のようになります。
・[プログラム全体の初期化] で、3→T を追加
・[プログラム全体の初期化] で、T の表示を初期化する
・[例外処理] で、タイムアウトとフライングの時に Dsz T を追加する
・新たに [ゲームオーバー時の処理] ブロックを追加し、そこでゲームオーバー時の表示を追加
[プログラム全体の初期化] 処理の変更
プログラムの1行目を、以下のようにします。
0→P:20→L:3→T
Locate 1,1,"P:0"
Locate 1,3,"L:"
Locate 3,3,L
Locate 10,1,"TRY:"
Locate 14,1,T
(追加部分を赤文字で示した)

[例外処理] の変更
If E=2
Then
P-L:Dsz T
Locate 5,2,"TIME OUT"
Else If E=1
Then
P-L+C→P:Dsz T
Locate 3,2,"FALSE START"
Else If E=0
Then
P+L-C→P
IfEnd
IfEnd
IfEnd
Locate 3,1," "
Locate 3,1,P
Locate 14,1,T
(追加部分を赤文字で示した)
ここで、追加した Dsz T は、T がゼロになると、Locate 文を飛ばして、次の Else If (正しくは Else)へジャンプすることを利用して余計な表示がされないようにしています。
そして、試行回数の残り T を表示します。
[ゲームオーバー時の処理] の追加
試行回数の残りが0になった時にゲームオーバーとするには、全体のループの Goto M を以下のように変更し、さらにゲームオーバー時の表示を追加します。
T⇒Goto M
Locate 1,2," "
Locate 4,2,"GAME OVER"
Locate 6,4," <AC>:QUIT
(追加部分を赤文字で示した)
T⇒Goto M は、T がゼロになったら Goto M を飛ばして、次の Locate 1,2," " へジャンプします。これは、条件ジャンプ命令:⇒ の機能です。
一番最後に追加したものは、「[AC] キーを押すとプログラムが終了する」、と画面表示で説明する部分です。
CasioBasicでは、[AC] キーを押すとプログラムが強制終了するので、これを利用しています。
但し、頭にスペースが2個入っていることに注意! こうしないと、<EXE>:START を完全に上書きできません。
これは、Locate 6,4," <(-)>:STOP" で頭にスペースを1個入れるのと同じ理由です。

以上をまとめます。
プログラム名 CH2-7
0→P:20→L:3→T
Locate 1,1,"P:0"
Locate 1,3,"L:"
Locate 10,10,"TRY:"
Locate 14,1,T
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
C>L⇒Break
Isz C
LpWhile Getkey≠57
C>L⇒2→E
If E=2
Then
P-L→P:Dsz T
Locate 5,2,"TIME OUT"
Else If E=1
Then
P-L+C→P:Dsz T
Locate 3,2,"FALSE START"
Else If E=0
Then
P+L-C→P
IfEnd
IfEnd
IfEnd
Locate 3,1," "
Locate 3,1,P
Locate 14,1,T
T⇒Goto M
Locate 1,2," "
Locate 4,2,"GAME OVER"
Locate 6,4," <AC>:QUIT"
(今回追加した部分を赤文字で示した)
プログラム構造は、以下のようになります。今回は新たに [ゲームオーバー時の処理] ブロックを追加しました。
[プログラム全体の初期化]
Lbl M
[繰り返し処理の初期化]
[アニメーション表示]
[反応速度の測定&表示]
[例外処理]
T⇒Goto M
[ゲームオーバー時の処理]
ゲーム仕様
1) ゲームスタート時、所定の試行回数が与えられる
2) アニメーションを表示する待ち時間がある(待ち時間はランダム)
3) アニメーションが終わったら、できるだけ速くキーを押す
4) 反応が速いほうが多くの得点が加算される
5) 表示が変わる前のお手つきや、反応が遅すぎる場合は、得点と試行回数が減る
6) 試行回数が0になるとゲーム終了し、その際の得点を競う
今回は、1)、4)、6) を追加して、ゲーム仕様を実装できました。
プログラム全体を、処理内容別のブロックを単純に並べた構造にしています。1つのブロック内で、分岐処理やループを使ってまとまった処理を行います。そして、次のブロックへ移ります。
プログラムをこのような構造にしておくと、機能追加や変更を、プログラムのどの部分でやれば良いかが分かりやすく、楽になることを、これまで体験してもらっています。
これまでの機能追加や変更について、ちょっと振り返ってみます。
[アニメーション表示]ブロックでは、フライングを検出しています。フライング検出後すぐに表示を行わずに、例外フラグを設定するだけにして、次のブロックへ処理を移しています。フライング検出をした直後で "FALSE START" と表示すれば楽なのに、回りくどいと思われたかも知れません。
実際問題、"FALSE START" の表示以外に、総得点の計算や、試行回数の計算も追加していますが、これらを [例外処理] ブロックにまとめることで、他のブロックを殆ど変更せずに機能追加ができました。これがブロック構造の利点です。
今回のようなアクションゲームでは、アニメーション表示 や 反応速度測定&表示 のループが軽く、速く回る必要があります。これが遅くなると、ゲームのレスポンスが遅くなり、つまらなくなる恐れがあります。なので、これらのループの中には余計な処理を入れたくないわけです。従って、余計な処理は別のブロックに入れた方が良い、と言う事情もあります。
[反応時間測定&表示]ブロックでは、タイムアウトを検出しています。ここでも例外フラグを設定するだけで、次のブロックへ処理を移しています。フライングフラグが設定されている時にも、直ちに次のブロックへ移動しています。
このように、まとまった処理ごとのブロックを作って、これらのブロックが上から下へ連なる構造を意図的に作る方法を、構造化プログラミングと言います。構造化プログラミングについては、こちら で裏話をしています。興味のある方は読んでみて下さい。
今使っている "新世代Casio Basic"は厳密には構造化Basic とは言えません。引数や戻り値のある関数を自由に作れず、局所変数(ローカル変数)が使えないからです。しかし、サブルーチンや大域変数を工夫して使いながら、ブロックが上から下へ連なるプログラム構造を作れます。Gotoであっちこっちにジャンプする構造ではなく、機能別に作った処理ブロックを上から下へ流れるようにコーディングし、必要な時は一箇所へジャンプし、用事が済めば元に戻るような流れを作ることこそが、重要です。そこで、"新世代Casio Basic" は構造化プログラミング風コーディング可能な言語と言えます。
簡単なプログラム、特にプログラム関数電卓での簡単なプログラムは、ブロックを意識する必要の無いことも多いのでですが、ちょっと機能追加をしようと思うと、とたんにプログラムが複雑になってしまいます。
「ブロックを並べて作る」構造化プログラミングの対極にあるのが、思いつきで色々な機能を追加したり変更し、同種の処理がプログラムのあちこちに分散しているもので、Goto を多用することが最大の原因です。
さて、このゲームで実際に遊んでみると、確実に試行回数が減ってゲーム終了....なんだか面白くありません。そこで、次回はゲームがチョットだけ面白くなる機能を追加しようと思います。
つづく...
⇒ CasioBasic入門13 / 目次
応援クリックをお願いします。励みになるので...