Casio Basic入門6
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終: 2015/01/07
最終: 2015/01/07
4. CasioBasicを使ってみる(続き)
Chapter 1 - 初級
Getkey と Locate コマンドを使いこなす
前回: Casio Basic入門5
◆ Chapter 1 の目標: キーコードを調べるプログラムを作る
Chapter 1-7 で作ったプログラム
プログラム名 CH1-7
" GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>
Lbl 0
Do
Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE = "
Locate 1,1,K
Goto 0
このプログラムを走らせて色々なキーを押してみたところ、特定のキーを同時に押すとキーコードが1桁になることを発見しました。しかし、取扱説明書には、1桁のキーコードについては説明がありません。
と言うことは、秘密のキー入力ができるわけです。ここで、こうして書いてしまっては秘密も何もあったモンじゃありませんが、まあ取扱説明書にない動作を使えば、秘密のキー入力です。
実は、以前作ったゲーム Hit&Blow でも、秘密のキー入力(複数キーを同時に押す)により、1桁キーコードが取得された時、ゲーム開始前に答えが分かるように作りました。これは、プログラムのデバッグ用に設定したのですが、面白いので完成版にも残しました。詳しくは、こちら。
ところで、最近の携帯機器や家電の操作系は、少ないボタンに複数の機能を持たせるために、複数のキーの同時押しや、長押しによって別の機能を割り当てるものが結構多いように思います。
関数電卓のプログラムにも同じことが言えると思います。プログラム CH1-7 で複数キーの同時押しを認識できることが分かったので、今度は長押しを認識できればプログラムの操作系の幅が広がるはずです。さらに、ゲームを作る時に使えるかも知れません。
そこで、Chapter 1 の締めくくりとして、キーの長押しを認識させる機能を追加しようと思います。
Chapter 1-8
DoループとWhileループ再び
キーを長押しした時、押されている時間をキーカウントとして表示する機能を追加します。
プログラムの動作としては、普通にキーを押すとキーカウントの表示は 1 となり、キーを押し続けるとキーカウントの表示がリアルタイムでどんどん増えるようにします。
今回の改造ポイントは、以下の赤文字で示した部分です。プログラム名を CH1-8 とします。今回はプログラムの説明は後にします。先ずこのプログラムを入力して、動作を確認してみてください。
プログラム名 CH1-8
" GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>
Locate 1,4,"CNT:0 "
Lbl 0
Do
Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE = "
Locate 11,1,K
1→C
Locate 5,4," "
Locate 5,4,C
While Getkey
Isz C
Locate 5,4,C
WhileEnd
Goto 0
プログラム起動時は、キーカウントは0(ゼロ)ですから、表示もゼロとします。それが上から4行目の
Locate 1,4,"CNT:0 "
で、今回追加する新機能に関する初期表示です。なおCNT は COUNT (カウント)の略です。
Locateコマンドの表示位置は、1桁目、4行目になっています。つまり画面の左下です。この位置に CNT: に続いてキーカウントの数値を表示させる作戦です。
今回は、追加機能に Whileループを使います。Whileループについては、Doループとの違いを既に説明しています。繰り返し処理の最初で繰返条件の判断を行うのでしたね。
さらに、Isz命令も使います。これは、Casio Basic独特のコマンドなので命令と呼ぶことにしています。
Isz C
は、変数Cを1つ増やすします。つまり、
C+1→C
と同じことを行います。変数を1や2など決まった分だけ増やすことを、インクリメントと呼びます。
Whileループの中で、Isz C を行っています。これは、ループが回った回数をカウントしていることになります。そうです、変数Cはキーカウントを代入する変数です。
残りの複数のLocateコマンドは、キーカウントを適切に表示させるためのものです。
以上をヒントにして、もう一度プログラムを読み解いてみてください。
※ CasioBasicコマンドリファレンス
- Isz命令
- Dsz命令
キーカウント取得の動作
プログラム CH1-8 をもう一度見てみます。
プログラム名 CH1-8
" GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>
Locate 1,4,"CNT:0 "
Lbl 0
Do
Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE = "
Locate 11,1,K
1→C
Locate 5,4," "
Locate 5,4,C
While Getkey
Isz C
Locate 5,4,C
WhileEnd
Goto 0
キーカウント取得以外の既に作った部分を簡単な説明に置き換えると、着目すべきところが明確になります。
[ 初期表示 ]
Locate 1,4,"CNT:0"
Lbl 0
[ キーコード取得と表示 ]
1→C
Locate 5,4," "
Locate 5,4,C
While Getkey
Isz C
Locate 5,4,C
WileEnd
Goto 0
プログラム全体は、Lbl 0 と Goto 0 で作られるループが基本構造です。
このループに入って、Lbl 0 の次に、先ず [キーコード取得と表示] が実行されます。これは今まで作った部分です。
ここまでくると、キーは押されたことになりますので、キーカウント変数Cは、1 にならなければなりません。そこで、1→C により、キーカウント変数Cを1に初期化します。
続いて出てくるLocate コマンド2つは、以下の仕事をします。
・キーカウントを表示する位置の3桁分を一旦消去、つまりスペース3個を上書きする
・キーカウントを表示する、つまりここではキーカウント 1 を表示する。
これは、Locateを使った典型的な表示方法で、既にお分かりのことです。ここでも同じ方法を使えば良いのです。
プログラムは、上から下へ止まらずに進みます。そして、Whileループに入ります。
While Getkey
Isz C
Locate 5,4,C
WhileEnd
Whileループは、ループ継続条件による判定を、ループに入ろうとする時点で行う点が、Doループと異なることは、以前一度触れました。ここれは、Getkeyの結果が0でない時にループを継続すると言う条件になっています。つまり何かキーが押された時はループを継続するわけです。
Whileループに入ろうとする時にキーが押されていない時は、Getkey は0を返しますので、Whileループには入らず、一気にWhileEndまでジャンプします。そしてその下に Goto 0 があるので、そのまま Lbl 0 へジャンプします。これは、キーが1回だけ押された時の動作ですね。そして、キーコード取得と表示を再度行います。
Whileループに入ろうとする時にキーが押されている時は、Getkey は 0 以外のキーコードを返します。つまり、キーが長押しされていると、Whileループの中に入ってゆきます。
Whileループに入れば、最初に Isz C が実行され、キーカウント変数Cを1つ増やす動作をします。続いて Locate 5,4,C によりキーカウントを表示します。ここではキーカウントは1つ増えて2になっているので、
CNT:2
と表示されます。
表示をしたら、WhileEnd に到達するので、そこから While Getkey までジャンプし、2回目の繰り返しの判定を行います。
もし、まだキーが押されたままだと、Whileループに再び入ります。キーが押されていなければ、Whileループに入らず WhileEndまでジャンプし、続いて Goto 0 を実行して、Lbl 0 までジャンプします。
もうお分かりのように、キーが長押しされた状態が続けば、Whileループがまわり続けます。そして Isz C によりキーカウントが1つづつ増えてゆき、それが即座に表示されます。そして、キーが離された時は、[キーコード取得と表示] の処理の中の Doループが回り続け、キー入力待ちの状態になります。
さて、While Getkey ですが、While Getkey≠0 と同じことになります。
While [ループ継続条件]
WhileEnd
と言う書式では、[ループ継続条件] が「真」の時ループを継続し、「偽」(真でない)時 WhileEnd にジャンプしてループを終了します。これが、Whileループのループ判定条件の本質的な意味です。
Doループの説明で、[ループ継続条件] が 「正しい」 か 「正しくない」 かで判定すると書きましたが、「真」か「偽(真でない)」かで判定するのが、本質的な意味になります。
この本質的な意味は重要なので、少し解説します。
While Getkey≠0 の ≠ は、関係演算子で、右と左が等しくないとき、「真」となります。Getkey≠0 が「真」ならループを継続するわけです。
一方、While Getkey と書いた時は、Getkey の戻り値が「真」か「偽」かを判定した結果、それが「真」ならループを継続すると言う意味になります。
Casio Basicでは、コマンドの戻り値や変数が、0でなければ「真」で、0の時は「偽」であると、決められています。この規則は、Visual Basicなどの他の多くのBasic言語やC言語系言語(C、C++、C#)などの多くのプログラミング言語でも採用されている、基本的なものです。
ですから、While Getkey と言う書き方は、While Getkey≠0 の省略形などではありません。どちらの書き方でも、[ループ継続条件] が「真」であるかどうかで判定するのです。
条件が「真」か「偽」か?は、Doループの LpWhile [ループ判定条件] でも適用されますし、今後出てくる If [判定条件] にも適用されます。これは、多くのプログラミング言語で適用される重要な考え方なので、覚えておくと良いでしょう。
話を元に戻します。キーカウント取得のための Whileループですが、代わりに Doループを使うとどうなるでしょうか?
Doループは必ず1回ループがまわります。すると上のままだと、キーが長押しされていないのにキーカウントが1つ増えてしまい、おかしなことになります。
次回は、WhileループをDoループに置き換える場合のプログラムを紹介します。
※ CasioBasicコマンドリファレンス
- Doループ
- Whileループ
つづく...
⇒ CasioBasic入門7 / 目次
応援クリックをお願いします。励みになるので...