Casio Basic入門11

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終: 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 LoopM を使って 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桁になるように揃えました。

CH2-4_Start 

CH2-4_Stop 

もう一つ、必要な表示処理があります。フライングになった場合は 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 は、普通に ElseIf を続いて入力します。

Casio Basic には ElseIf と言う1語(ワンワード)のコマンドは用意されていないものの、ElseIf を並べて書くことで、プログラムの読みやすさ(可読性)を損なわずに複数条件分岐ができます。但し、この記法を用いる時には、最後に 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 / 目次



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

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



関連記事

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

コメントの投稿

非公開コメント

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

やす (Krtyski)

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


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

プログラム電卓を実際に使って気づいたこと、自作プログラム、電卓での Casio Basic, C.Basic そして Casio Python プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではありません。いつでもどこでもプログラミングができるプログラム電卓が好きな1ユーザーです。


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR