キー押下でプログラムをコントロールしたい - Casio Basicプログラミング

Casio Basicプログラミング
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

追記修正 2017/01/03
[純正] [5800P / FX / CG]
プログラムの一旦停止や実行をキー押下でコントロールしたい。



プログラムは、コードの上から下へ順に実行されるものだ、と理解することは基本だ。逆にプログラムを一旦停止するには、一旦停止の機能をコードとして書く必要がある。

最も簡単な方法は、Casio Basic に備わっている Casio 特有の旧来からの命令の1つ  (出力)命令を使うことだ。
命令には、一旦停止の機能も備わっているので、プログラムを一旦停止したいところで使うことができる。但し、一旦停止を解除するには [EXE] を押す必要があり、他のキーは使えない。なお  命令は出力命令なので空白を含めて何か出力させるようにコードを書く必要がある。何も出力せずに一旦停止のみ行うには ""◢ とすれば良い。

命令を含んた旧来の命令の使いこなしは、Casio Basic 入門38 を参照



Basic コマンドを使うと、キーを押した時のプログラムの動作のコントロールを、より自由度高く行える。

汎用性のあるコードとして、以下の事例を紹介する。
  • 処理を一旦停止させ、何かキーを押している間に処理を先に進める方法
  • 処理を一旦停止させ、何かキーを押すたびに(押している時間に係わらず) 処理を1回だけ実行する方法
  • ◢ 命令と同じ動作を、Basic コマンドで実現する方法
  • ◢ 命令とほぼ同じ機能だが、[EXE] キー以外で一旦停止を解除する方法
  • 処理を一旦停止させ、何かキーを押している間だけ処理を実行する方法
これらのコードは、基本的にキーが押されたことの検出とキーが離されたことの検出、それらの組み合わせで実現するところに共通点がある。具体的には While / WhileEnd ループと Getkey を使って2~4行のコードで実現できる。

⇒ Casio Basic コマンドリファレンス: Whileループ


先ず、以下のプログラムを作り、これを元にそれぞれの課題を実現する方法を付加してゆく。
以下のプログラムは、fx-5800P, fx-9860GII, fx-CG20 のすべてに共通して使える。

ファイル名: C-UP
0→C
While 1
Isz C
Locate 1,1,C
WhileEnd


変数 C0 で初期化し、
Isz CC を1つ増やして Locate 1,1,C で増やした C の値を表示する。
While 1 / WhileEnd による無限ループでこの処理を繰り返す。

プログラム C-UP を実行すると、数字がカウントアップされ、[AC] キーで強制終了する。

==========

何かキーを押している時だけカウントアップを実行し、キーを離したら一旦停止するように、C-UP を改造する。

ファイル名: C-UP1
0→C
While 1
Isz C
Locate 1,1,C
While Getkey=0
WhileEnd

WhileEnd


プログラム C-UP に赤文字の2行を追加した。
 While Getkey=0
 WhileEnd

は、いずれのキーも押されていない時に処理を先に進めない (一旦停止) 機能を実現する。プログラムを一旦停止し、何かキー([AC] キーを除く)を押したら一旦停止を解除する。

さらにキーを押している間カウントアップ処理が継続され、キーを離したら処理が一旦停止する。
なお、カウントアップを1回だけ行うには、キーを押している時間をできるだけ短くする必要がある。言い換えればキーの長押しは、キーを複数回押したのと同じと判定される、つまりキ-リピートを検出する。

ここで、
 While Getkey=0
 WhileEnd

の動作を詳しく見てみる。While Getkey=0 は、While ループの [ループ継続条件]Getkey=0 になっている。
Getkey=0 は、何もキーが押されていないことを意味するから、何もキーが押されていないときこのループが継続する。つまりループがグルグル回っていて、プログラムの処理は先に進まないから、ここでプログラムが一旦停止しているように見える(実際はループ処理が続くのでプログラムは停止していない)。

Getkey は、それが実行された時に押されているキーを判別するコマンドで、押されているキーごとの固有のキーコードを返し、キーが押されていない時は 0 を返す。「返す」というのは、Getkey が その値になっていると思って良い。キーが押されていない場合は 0 になる。
従って、Getkey=0 は、いずれのキーも押されていない条件を示す。

==========

次に、C-UP1 を改造して、キーを押す時間にかかわらず、1回押したらカウントアップを1回だけ行うようにする。

ファイル名: C-UP2
0→C
While 1
Isz C
Locate 1,1,C
While Getkey
WhileEnd

While Getkey=0
WhileEnd

WhileEnd


C-UP1 に青文字の
 While Getkey
 WhileEnd

の2行を追加した。

ここで、
 While Getkey
 WhileEnd
は、何かキーが押されている限りこの2行のループ処理が続き、キーが離された時にこのループを抜ける。つまりキーリピートを抑制する機能を実現する。

Getkey は、このコマンドが実行された時に何かキーが押されていたら 0 以外のキーコードを返す。「返す」とは、Getkey その値であると思って良い。
While Getkey は、While のループ継続条件が Getkey になっていて、何かキーが押されていたら Getkey が 0 以外の値になるから、この時ループは継続され、処理は先へ進まない。キーが離されると、Getkey は 0 になるからループから抜けて、処理は先へ進む。

==========

C-UP2 を改造して、 命令と同じ機能を実現してみる。

つまり、

0→C
While 1
Isz C
Locate 1,1,C◢

WhileEnd

と同じ機能を実現する。


ファイル名: C-UP3
0→C
While 1
Isz C
Locate 1,1,C
While Getkey
WhileEnd

While Getkey≠47
WhileEnd

WhileEnd


C-UP2 の赤文字の部分を変更した。

ここで、、
 While Getkey≠47
 WhileEnd
このループは、キーコード 47 のキー、つまり [EXE] キーが押されない限り、繰り返しを継続して、処理が先に進まない。[EXE] キーが押される時のみ、処理が先へ進む。

命令を使う時は、キーリピートは無いので、
 While Getkey
 WhileEnd
によりキーリピートを抑制している。

この例は、キーコード47の [EXE] キーで処理を1回進めるものだが、他のキーに対応するキーコードを使えば、好きなキーコードで処理を1回進めることができる。汎用の高い方法だ。

==========

プログラム C-UP を改造して、何かキーが押されている時だけ、カウントアップを停止させるようにする。

ファイル名: C-UP4
0→C
While 1
Isz C
Locate 1,1,C
While Getkey
WhileEnd

WhileEnd


このコードで、
 While Getkey
 WhileEnd

は、何かキーが押されている限り、この2行のループが継続することは、上で紹介した。キーが離されている時は、このループは継続しない。

もし、この Getkey が実行されるとき、キーが押されていない場合、[ループ継続条件] である Getkey は 0 なので、ループに1度も入ることなくループを抜ける。




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


 




keywords: プログラム関数電卓、Casio Basic、C.Basic、プログラミング

関連記事

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

2017 Happy New Year

2017元旦 


抱負

fx-5800P は発売開始からついに10年になり、後継機の登場が待たれます。後継機を徹底的に調べたい!

C.Basic の海外デビューのための英語版マニュアルをまとめたい!

Inside Casio Basic を取り敢えずまとめたい!



4年目の e-Gadget?

これまでを簡単に降り返ると、

2013年は、10月30日に e-Gadget を始め、わずか2ヶ月間で、fx-5800P キー同時押しでキーコードが1桁になる発見や、試しに作った「もぐら叩き」ゲームで fx-5800P 搭載 Casio Basic が結構イケテルことが分かって、Casio Basic にハマリました。

2014年は fx-5800P 搭載 Casio Basic の詳しい仕様の探索と使いこなしの提案をしました。Casio Basic 入門やコマンドリファレンスの連載を始めました。

2015年は fx-9860GII 搭載 グラフィックスコマンドの探索と 汎用サブルーチン入力ボックスの開発とその使いこなしを提案しました。それから「逆引き Casio Basic」 の連載を始めました。また10月にsentaro様の手による fx-9860G / fx-986GII 用の アドイン版Basicインタプリタ:C.Basic が登場し狂喜乱舞しました。

2016年は fx-5800P や fx-9860GII に fx-CG20 を加えて網羅的に Casio Basic 探索をした結果、機種別の相違点と共通点をまとめました。さらに C.Basic が大きく進化して、試しにライフゲームを作ったり、ガノー様作のゲームにより C.Basic の潜在能力の高さに魅了されました。

この歩みが予め予定していたものでは全くないのが、面白いところです。正直に言えば、自分として全く想定外に(fx-5800Pが盗難に遭ったことがきっかけで) e-Gadget を始めて、その後 Casio Basic の面白さを認識したのだから、始まりから無計画でした。

なので、2017年 が抱負通りに進むかどうか、私自身も全くわかりません(^^;


最近、私の娘から聞いた話があります。

”日常生活や睡眠時間から、なんとか時間を作りだして熱中する、それが趣味。”

「プログラム電卓でプログラミング」は私の趣味、その延長線上に当ブログ e-Gadget があります。

新たな記事の投稿や記事の更新は不定期で、昨年のように2ヶ月間殆ど新記事の投稿がなかったり、怒濤の投稿もあります。


ノンビリとマイペースでやってゆきますので、今年もよろしくお願い致します。



関連記事

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

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

やす (Krtyski)

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


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

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではなく、Casio Basicが面白いと感じる1ユーザーです。


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR