Casio Basic入門9
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終: 2015/01/07
最終: 2015/01/07
4. CasioBasicを使ってみる(続き)
前回: Casio Basic入門8 - Chapter 1
Chapter 2 - 初級
動きのあるプログラムを作る
Chapter 1 でまだ紹介していないコマンドやプログラム構成(ロジック)を使いながら、新しいプログラムを作ってゆきます。
◆ Chapter 2 の目標: 動きのあるプログラム作る
Chapter 2 では、動きのあるプログラムをテーマにしようと思います。
そこで、以下の概略仕様で、「反射ゲーム」を作ることにします。
1) ゲームスタート時、所定の試行回数が与えられる
2) アニメーションを表示する待ち時間がある(待ち時間はランダム)
3) アニメーションが終わったら、できるだけ速くキーを押す
4) 反応が速いほうが多くの得点が加算される
5) 表示が変わる前のお手つきや、反応が遅すぎる場合は、得点と試行回数が減る
6) 試行回数が0になるとゲーム終了し、その際の得点を競う
Chapter 2-0
Lbl / Goto ループを使う
今回は、待ち時間でのアニメーションを 「回転している羽根」にします。
アニメーションを作る前に、アニメーションの準備をします。
取りあえず、アニメーションの代わりに「静止している羽根」を "X" で現し、(8桁、2行)の位置に表示させます。そして、所定時間だけ「静止している羽根」を表示させるプログラムを作ります。これは、アニメーションの基本構造になります。
プログラム名 CH2-0
50→C
Lbl 0
Locate 8,2,"X"
Dsz C
Goto 0
Locate 8,2," "
上のプログラム CH2-0 を詳しく見てゆきます。その中で、所定時間だけ表示させるためには、ループの中に表示処理を入れて、ループを所定回数まわすようにしています。表示時間を決める部分を赤文字で示しています。
さて、赤文字部分だけを抜き出します。
50→C
Lbl 0
Dsz C
Goto 0
この部分は、Lbl / Goto を用いたループで構成されていて、ループを50回まわしています。
Lbl 0 と Goto 0 の間で、ループが回ります。
そして、カウンタ変数Cは、最初50で、ループを1回まわるたびに、カウンタCが1づつ減ります。
Dsz C は、ディクリメント・ジャンプ命令と言います。Cを1つ減らします(デクリメントします)。そして、デクリメントした結果Cが0(ゼロ)になった場合は次の処理を飛ばして、その次の処理までジャンプします。
「その次の処理」は、ここでは Locate 8,2," " ですね。
ここで思い出してもらいたいのは、「プログラムは特に指示がなければ上から下へ処理が進む」と言うことです。だから、Lbl / Goto と Dsz を組み合わたカウントループを作ることが出来ます。
Chapter 1 では、Isz 命令 を使いました。この時は、単に変数を1つ増やす目的で使用しましたが、Isz 命令も Dsz 命令と同様に、変数が0になると2つ目の処理へジャンプする機能を持っていて、インクリメント・ジャンプ命令といいます。変数に負の数を指定すれば、いずれ変数が0になり、そこでインクリメント・ジャンプします。Chapter 1 では変数に正の数を指定したので、0になることはなく単にインクリメント(1づつ増える)だけでした。
※ incrementは「増やす」と言う意味の英語。increaseの方が馴染みがあるかも知れません(これも「増やす」の意味)。一方 decrement は「減らす」と言う意味で、同様にdecrease も「減らす」と言う意味です。
Dsz命令やIsz命令は、If 文と Lbl/Goto を組み合わせて、同じ処理を記述することができます。しかし同じ処理を行う場合は、Dsz命令やIsz命令の処理速度の方が速いことが分かっています。
C-1→C の代わり Dsz C とすると処理が速くなるだけでなく、変数Cが0かどうかの判定とジャンプ処理まで含んでいるので、記述もシンプルになります。
従って、Casio Basic特有のこれらの命令を、私は積極的に使っています。
※ CasioBasicコマンドリファレンス
- Dsz 命令
プログラム CH2-0 は、ループの中で羽根を表示し、ループが50回まわった後羽根の表示を消しています。Cの初期値を変えると、ループ回数が変わります。そこで、Cをランダムに変更すれば、羽根の表示時間をがランダムに変化します。
では、羽根がまわるアニメーションを作ってゆきます。
Chapter 2-1
回る羽根をつくる
アニメーションは、映画もテレビもパラパラ漫画も、理屈は同じです。連続して表示される静止画を見ると、我々には動いているように見えるわけです。そこで静止画を見せる間隔は、長すぎても短すぎてもダメで、ちょうど良い間隔があります。
回る羽根のアニメーションは、× と + を交互に見せて実現しています。つまり、
Locate 8,2,"×"
と
Locate 8,2,"+"
を適切な間隔で交互に表示させれば回っているように見えるはずです。
そこで、例えば
50→C
Lbl 0
Locate 8,2,"×"
Locate 8,2,"+"
Dsz C
Goto 0
Locate 8,2," "
を実際に走らせてみてください。なんだか、薄ぼけたXと+が同時表示されているように見えます。2つの静止画の間隔が短すぎるのでしょう。そこで、この2つのLocate コマンドの表示間隔を、もう少し長くしようと思います。間隔が長すぎてもダメなはずなので、間隔を調節できるようにしたいものです。
仮に、以下のようにしてみても、状況は改善しません(実際に試してみるとわかります)。
50→C
Do
Locate 8,2,"×"
Locate 8,2,"×"
Locate 8,2,"×"
Locate 8,2,"+"
Locate 8,2,"+"
Locate 6,2,"+"
Dsz C
Goto 0
Locate 8,2," "
× の表示と + の表示の間隔がほとんど無いことが、うまくゆかない最大の理由でしょう。そこで、Lbl/Goto ループがくりかえし実行されるとき、有るときは × を表示し、有るときは + を表示する作戦に切り替えます。表示の切り替えは、ループを通る回数から判定すれば良さそうです。
さて、ループが回るたびに変数Cが1づつ減る(Dsz C)ので、Cが奇数の時にxを表示し、偶数の時に + を表示する方法を試してみます。判定処理にかかる時間だけ間隔が長くなることを利用します。
その判定は、ループの中で変数Cが奇数か偶数かを判定 (奇遇判定) すれば、交互に × か + を表示させられます。
Cの奇遇判定には、「奇数は2で割り切れず、偶数は2で割り切れる」ことを利用します。そこで、C÷2 の小数部を取り出して、それがセロなら割り切れる、ゼロでないなら割り切れないと判定できそうですね。
小数部を取り出すには CasioBasicの関数 Frac( ) を利用します。
Frac(C÷2)
これが「0でない」か「0か」を If 文を使って調べます。「0でない」場合はCは奇数、「0である」場合はCは偶数だとわかります。
If [条件]
の条件が0でない時は「真」0の時は「偽」でした。
従って、Frac(C÷2) が「真」か「偽」かを判断すればよいので、以下のようにIf 文を使って書けます。
50→C
Lbl 0
If Frac(C÷2)
Then Locate 8,2,"×"
Else Locate 8,2,"+"
IfEnd
Dsz C
Goto 0
Locate 8,2," "
実際にこのプログラムを走らせると、動きが見えるようになりました(試してみてください)。しかし実行してみると分かりますが、チカチカした感じで、羽根が回るようには見えません。今度は、× と + それぞれの表示時間が短いのでしょう。
そこで、上の考え方を発展させて、ループが2回まわる時に連続して × を表示し、続く2回で + を連続して表示させるようにします。Cが Dsz C で1づつ減ってゆくとき、連続する2回をうまく区別する方法が必要です。
具体的には、「Cを4で割った時の余りが 0、1、2、3のいずれかになる」性質を利用します。
Cがループの中で1づつ順に減ってゆき、Cを4で割った時の余りは
3⇒2⇒1⇒0⇒3⇒2⇒1
の順に循環してゆきます。つまり、4で割った余りが 0と1の時、及びそれ以外の時を判定できれば、連続する2回を判定できますね。余りが0か1の時は × を表示し、余りが2か3の時は + を表示します。
理屈はさておき、実際にプログラムを作ってみましょう。この方法は、取りあえず覚えておくと色々なところで使えて便利です。理屈を納得するのは後回しにしても良いと思います。
Cを4で割った余りは、
C-4Int(C÷4)
です。
もっと一般的に言うと、CをNで割った余りは C-NInt(C÷N) です。但し、CとNは整数です。
CasioBasicには、Int( ) 関数があります。これは、( ) 内の整数部を取り出す関数です。
Int(C÷4)
は、C÷4 の結果から整数部を取り出します。
Int(C÷4) に 4 を掛けた結果、つまり
4Int(C÷4)
は、当然ながら4で割り切れますね。そして、この結果は、Cと等しいか、Cより小さくなります(当たり前ですね)。
なので、C から 4Int(C÷4) を引き算すると、つまり、C-4Int(C÷4) の計算結果は Cを4で割った余りになります。
例えば、C が 25 の時は、C÷4 は、6.25 です。そして、Int(C÷4) は 整数部を取り出すので 6 となります。そして 4Int(C÷4) は、6×4 = 24 です。なので、C-4Int(C÷4) は 25 - 24 = 1 となり、これは 25÷4 の余りです。
つまり、4Int(C÷4) は 、Cに一番近い4で割り切れる数(同時にC以下)になるので、これをCから引き算すれば余りが求まる、と考えても良いです。
※ CをNで割った余りは C-NInt(C÷N) となります。
これは、プログラムを作る際、色々なところで使える計算です。
これを使う他の事例は、「矢印キーの効用」 でも紹介していますので、を参考にしてください。
※ CasioBasicコマンドリファレンス
- Int( )関数 / Frac( )関数
さて、If 文を使って、Cを4で割った余りが0か1の時に × を表示、2か3の時に + を表示する方法で、プログラムを具体的に書いてみます。
プログラム名 CH2-1
50→C
Lbl 0
If C-4Int(C÷4)≦1
Then
Locate 8,2,"X"
Else
Locate 8,2,"+"
IfEnd
Dsz C
Goto 0
Locate 8,2," "
このプログラムを走らせると、冒頭の動画が得られます。
※ プログラムが走る?
プログラムは「走る」もののようです。広く普及しているプログラミング言語にはアメリカ生まれが多く、Basicも最初はアメリカで開発されました。だから、コマンドは英語から派生したものが多くなります。で、A program runs. などと彼らが言うので、日本語で「プログラムが走る」 と言うようになっているようです。余談ですが、日本語を使ってプログラミングが書ける "Mind"というプログラム言語もあります。
※ BASICの起源
BASICは、1964年にダートマス大学の ジョン・ケイニー と トーマス・カーツ により、教育用の ダートマスBASIC として作られたのが最初で、その後発展してきたと、いうことのようです。[ 出典: Wikipedia - BASIC ]
つづく...
⇒ CasioBasic入門10 / 目次
応援クリックをお願いします。励みになるので...