迷路プログラム

アドイン版 Casio Basic 用サンプルプログラム
<トップページ>

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

2015/12/15
修正 2015/12/17

迷路作成プログラム

ガノー様から、C.Basic 向けに迷路作成プログラムをご紹介頂きました

Maze1 

や、

Maze2 

といったグラフィックス画面全体を使って迷路を自動作成するプログラムです。棒倒し法で作成されたとのことですが、純正Casio Basicでは作成が終わるまでにカップラーメンが出来るくらいの時間がかかります(ガノー様・談)。

確かに、嫌になるくらい待たされます。なので、純正Casio Basicでは全画面描画のグラフィックスプログラムは厳しく、高速インタープリター  C.Basic 向けの良いサンプルプログラムと言えます。

シンプルなロジックから複雑な図形が生成されるのは、なかなか面白いものです。


ガノー様作
ファイル名: MAZEG
' GRAPHICS SETTING
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,62,0,0
' DRAW FRAME
Vertical 0
Vertical 126
Horizontal 0
Horizontal 62
' CREATE MAZE
For 3→B To 61 Step 2
SketchDot Horizontal B-1
For 3→A To 125 Step 2
B=3⇒RanInt#(1,4)→R
B≠3⇒RanInf#(1,3)→R
R=1⇒PxlOn B,A+1
R=2⇒PxlOn B+1,A
R=3⇒PxlOn B,A-1
R=4⇒PxlOn B-1,A
Next
Next

手入力が面倒なら、ダウンロードしてください。
⇒ ダウンロード: MAZEG

=====

さて、ここで高速インタープリタ C.Basic の登場!

このソースのまま C.Basic Ver 0.83a で動作するのが、上位互換の良いところ。
⇒ ダウンロード: C:Basic プロジェクト からどうぞ

起動すると、0.61秒 で作成終了!

カップラーメンが間に合いません(^^;)


では、Ftune2 を使ってオーバークロックしてみます。
⇒ ダウンロード: fx-9860GII の高速化 - Ftune2 の導入 からどうぞ

236MHz で、0.09 秒!

一瞬で迷路が表示さました。


 
実際に迷路で遊んでみる

目の前に迷路ができたら、遊んでみたくなりました。

この迷路の通路は、1ドット分の幅しかないので、自分をドット1個で表示して、このドットを左上から右下まで移動して、、迷路を抜けるようなプログラムを作ってみました。カップ面を作るほど待つのは嫌なので、最初から C.Basic を前提にすることにして、それなら C.Basic の独自拡張機能の「タイマー機能」「変数型指定機能」を使うことにしました(以下に簡単説明あり)。

自分を示すドットと迷路の壁の区別が付かないので、自分のドットは点滅させることにしました。これは純正Casio Basicでは不可能で、C.Basicの独自拡張機能を利用しました。

このプログラムでは、最初にガノー様作の MAZEG を呼び出して、迷路を作ります。そのあと、ドットを左上に表示し、それを矢印キーで動かし、右下へ到達したら、Goal! と表示してゲーム終了!

こんな感じで、取りあえず作ったのが以下のものです。

[2015/12/17  修正]
変数型の設定について、C.Basicの仕様を勘違いしていたので、プログラムを修正し以下の説明も修正します。

ファイル名:TRYMAZE
'#CBint
Prog "MAZEG"
0→G:2→A:2→B
%→S:%→T

'1st Loop
Do

If A=126 And B=62
Then 1→G:Break:IfEnd

While Getkey
WhileEnd
Do
Getkey→K
If %-S>30:Then %→S
PxlChg B,A
IfEnd
LpWhile K=0
PxlOn B,A

K=47⇒Break
PxlOff B,A
If K=27:Then
PxlTest(B,A+1)=0⇒Isz A
Else If K=28:Then
PxlTest(B-1,A)=0⇒Dsz B
Else If K=37:Then
PxlTest(B+1,A)=0⇒Isz B
Else If K=38:Then
PxlTest(B,A+1)=0⇒Dsz A
IfEnd:IfEnd
IfEnd:IfEnd

'1st Loop End
LpWhile 1

'== Finish up ==
'#CBdbl
(%-T%)÷128→T
Ig G%:Then
Locate 9,3,"Goal!"
Locate 3,5,"Time(s)"
Locate 10,5,T
Else
Locate 9,4,"bye!"
IfEnd

⇒ ダウンロード: TRYMAZE


[EXIT] キーを押せばプログラムが終了して、 bye! と表示されます。
無事にゴールすると、Goal! と表示され、ゴールするまでの時間が秒数で表示されます。この時間は、迷路が表示された後スタートして計測されるので、迷路が表示されたらスグに始めてください。

出来た迷路を眺めるだけでなくて、これで実際に遊べるようになりました(^_^)/

=====

ここで使った2つの C.Basic 独自拡張機能についての簡単な説明;

1. タイマー機能
C.Basic では、実行時に常にタイマーが回っていて、1/128秒でカウンタが1増えるようになっています。
タイマーカウンタの値は、 変数 % に格納されているので、% を参照するとタイマーカウンタの値がわかります。

時間計測開始時に、
 %→T
とすると、開始時のカウンタの値が変数 T に入ります。

時間を知りたい時には、
 (%-T)÷128→T
とすると、開始からの経過時間が秒で分かって、それが変数 T に入ります。

自分を示すドットの点滅もタイマー機能を使っています。
キー入力を待つ Do / LoWhile ループの中で、タイマーカウントが 30 を超えるたびに PxlChg を実行させて、ドットを点滅させています。


2. 変数型指定機能
[2015/12/17 修正]
C.Basic は、実数型変数 (倍精度変数) と 整数変数 の2つを扱えるようになっていて、整数変数を使えば処理が高速化します。
C.Basic を起動して、[SFHIT] [MENU] (Setup) を押すと、環境設定画面になます。そこで、設定リストの一番最後に Execute mode があり、Double (DBL) か Int を設定できます。Double (DBL) が倍精度変数で動作するモードで、Int が整数変数で動作するモードです。
プログラム中で、'#CBint と書くと、それ以下は整数モードになって処理が速くなりますが、変数は整数型になるので小数を格納しようとしても整数部分しか格納できません。'#CBdbl 或いは '#CBasic と書くと実数(倍精度)モードになって、想定的に処理が遅くなります(それでも十分速いですが...)。そして変数に小数を格納できます。

ところで C.Basic では、大文字と小文字のアルファベットを異なる変数として使えるようになっていて、それぞれはさらに 倍精度用と整数用が用意されています。純正Casio Basic の4倍もの多くの変数が使えるのも、C.Basic の特徴です。プログラムで整数しか使っていない場合は、整数モードにすると実数(倍精度)モードよりもかなり速くなります。

さて、上で
 (%-T)÷128→T
を実行すると、小数の計算結果が 変数 T に格納されます。もし T が整数変数だとすると、これには小数は入らないので正しい値になりません。そこで、'Finish up とコメントしている以降の処理を '#CBdbl により実数(倍精度)モードに切り替え、
プログラムが整数モードで実行されている時、T は整数変数が使われます。そこで実数(倍精度)モードで T% とすることで 整数変数 T をそして T# とすることで実数(倍精度)変数を明示的に指定できるようになっていて、正しい変数を使えるようになります。

但し、[SHIFT] [MENU] (Setup) により C.Basic の Excute mode を Int にするか、'#CBint を記述することで、整数モードになると、Locate コマンドは整数しか受け取りません(それによって高速化していますので...)。従って、Locate で小数を表示させたい時には、実数(倍精度)モードにしておく必要があるので、上のように Locate を実行する前に 実数(倍精度)モードにしておく必要があります。

従って、上の計算は、
 (%-T%)÷128→T#
と記述しておくと、C.Basic の Execute mode 設定でいずれのモードにしても、時間表示が確実に小数になります。






応援クリックをお願いします。励みになるので...


人気ブログランキングへ









keywords: fx-9860GIICasioBasic、プログラム関数電卓、C.Basic、C:Basic

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



関連記事

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

Casio Basic入門 G01

Casio Basic入門
<目次>

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

追記 2015/06/26
更新 2015/08/15
修正 2015/12/07

※ 文章と図が重なって表示される時は、ページを再読込してください(最近この現象が発生しています)。

 5. Casio Basic でグラフィックス


はじめに

グラフ描画機能を世界で初めて電卓に取り入れたのが、カシオの fx-7000G です。それ以来、カシオのグラフ関数電卓は、教育現場の意見や要望を取り入れながら、数学教育ツールとして開発が継続されています。その延長線上に fx-9860GII があります。

私自身は、これまで fx-5800P を使いこなしてきたので、fx-9860GII のグラフ機能やグラフィックス機能が、Casio Basic にどのように実装されているのかは殆ど知らず、カシオのグラフ関数電卓のグラフィックス描画速度が非常に遅いという感覚だけが有りました。

fx-9860GII やグラフ関数電卓の Casio Basic でグラフィックス プログラミングがどのようなものか知りたいと思っても、fx-9860GII の取扱説明書のプログラム機能の記述は、特にグラフィックスに関しては、fx-5800P 以上に不親切です。

そこで、入手できる情報を元にして、自分で色々と調べて、Casio Basic 入門として記録してゆこうと思います。


Chapter G01
LCDと3つの座標系

グラフィックス描画の単位は、LCD(液晶ディスプレイ)の1ピクセルです。
fx-9860GII はモノクロLCDを使っているので、必要なピクセルをOn / Off すれば、グラフィックス描画ができます。

ピクセル1つを On したり、Off したり、On と Off を切り替えるなどのコマンドがあり、線分、水平線や垂直線、円を描画するコマンドがあります。さらに、関数をグラフとして表示するための高度なコマンド もありそうです。


Casio Basic のグラフィックス描画エリア


グラフィックス表示エリア fx-9860GII のLCDは、128 x 64 ピクセルのドット・マトリックスです。ところが、Casio Basic では、LCDの横 127ピクセル、縦63ピクセルがグラフィックス描画エリアになっています。横と縦のピクセル数を奇数にすれば、エリアの中央のピクセルを原点として、エリアを対称に使えます。グラフ描画を主眼に考えてのことだと推察されます。ちなみに Add-in プログラムを作る際には、128 x 64 ピクセル全てを使えることから、127 x 63 ピクセルの描画エリアは Casio Basic の仕様だと分かります。



デフォルトの論理座標系

論理-座標系
Casio Basic で用いる座標系の1つに、描画エリア中央を原点にし、左の図のような論理座標系があります。1dot の値が 0.1 に固定されています。

例えば、座標 (5, -3) は、原点ピクセルから、右に50 dot、下に 30dot の位置になります。





この座標系で使えるコマンドには、Plot, PlotOn, PlotOff, PlotCng, Line, F-Line, Circle, Horizonal, Vertical などが挙げられます。

この座標系は、数学でグラフを書く時に分かりやすいのですが、1dot の値が 0.1 に固定されているので、この狭い範囲にグラフが収まりきらないことが多く発生します。そこで、1dot の値を自由に設定し、原点も自由に設定できれば、あらゆるグラフが書ける座標系を設定できるようになります。


ViewWindow 座標系

Casio Basic には、論理座標系を自由に設定するために、ViewWindow コマンドが用意されています。

ViewWindow 座標系設定の書式 (直行座標系の場合) [2015/06/27 更新]

ViewWindow
[左端のxの値],[右端のxの値],0,[下端のyの値],[上端のyの値],0 
  1. 3番目と6番目のパラメータは、座標軸を描画する際、AxesOn を指定した場合の目盛間隔(スケール)を指定する。座標軸と共にグラフを描画しない場合は、両方とも 0 としておけば良い。
  2. 例えば、ViewWindow 1,127,0,63,1,0 とすれば、物理座標系と同様になる(但し、小数値での座標設定ができる点が、物理座標とは異なる)。

ViewWindow座標系   
例えば、
ViewWindow 0,126,0,0,62,0 [2015/08/15 訂正]
とすれば、左の図の座標系を設定できます。
この設定例は、1dot の値が 1 つまり、数値とピクセル数が一致するので、グラフィックス描画を行う時、分かりやすくなります。


プログラムのロジックや使う変数に応じて、処理速度を最適化するために、柔軟に座標系を設定できる点も、グラフィックス プログラミングに適しているかも知れません。

この座標系で使えるコマンドには、デフォルトの論理座標系と同じ Plot, PlotOn, PlotOff, PlotChg, Line, F-Line, Circle, Horizontal, Vertical などが挙げられます。


物理座標系

さて、Casio Basic には、もう一つの座標系があります。

物理-座標系
LCDの左上隅のピクセルを原点とする座標系で、PCなどのグラフィックスで最も一般的な座標系です。

但し、原点は (0, 0) でなくて、(1, 1) で、x や y には 1以上の整数しか使えません。整数でないとエラーになります。

ちなみに、論理座標系や ViewWindow座標系では(x, y) に小数を使ってもエラーにならず、指定位置に最も近いピクセルが自動的に選ばれます。

さらに、物理座標系で使えるコマンドの座標値の記法は、x と y の順序を逆、つまり y の値を先に x の値を後にして (y, x) としなければなりません。

この座標系では、Text, PxlOn, PxlOff, PlxChg, PxlTest( ) が使えます。これらのうち、Text を除く他のコマンドでは、座標値に変数を用いる時、PxiOn Y,X というように、変数 XY を使えません。他のアルファベットは使えます。X と Y は、内部動作のための予約変数で、XY を使うとエラーになります。

[2015/12/07 修正]

座標指定に変数 X と Y を使う際、例えば、PxlOn Y,X と記述する時には注意が必要です。Text を除く他のコマンドを実行すると、変数 X と Y には、指定した物理座標系での位置を論理座標系に変換した座標 (X, Y) が自動的に格納されます。PxlOn B,A を実行しても、物理座標系での座標 (A, B) が 論理座標系に変換された座標 (X, Y) に対応する値が X と Y に自動格納されます。

さらに、X と Y には論理座標系での値が自動的に入るので、負の値や小数になることが多く、PxlOn B,A の実行直後に PxlOn Y,X を実行すると、X と Y に正の整数以外が入っている場合はエラーになります。Text を除く物理座標系で使うコマンドには、X と Y 以外の変数を座標指定に使った方が、このエラーに悩まされずに楽かも知れません。
====== 修正ここまで =====

これは、面白いので後で取り上げる予定ですが、確認するために作ったプログラムをダウンロードできます。興味のある方には、先行して遊んでみてください。
 ⇒ PxlOn の予約変数 X, Y を調べて見る
   (上を左クリックして現れるポップアップウィンドウで、リンクを右クリックし、[名前を付けてリンク先を保存] を選択)



サンプルプログラムを作ってみる

fx-9860GII は、128 x 64 ドットのモノクロLCD(液晶ディスプレイ)を搭載していますが、Casio Basic でのグラフィックスエリアは 127 x 63 ドットです(上記参照)。

以下のプログラムを実行すると、LDCの上端の1ラインと左端の1ラインが、グラフィックスエリアに使われていないことが確認できます。(但し、グラフィックス描画以外には、使われるケースがあることも分かっています。今後紹介します)。

なお、プログラム実行中の方が視認性が良くなります。見づらい場合はLCDのコントラストを調整してみてください。

ClrGraph
LabelOff
For -3.1→Y To 3.1 Step 0.1
Horizontal Y
Next

(論理座標系)

プログラムの入力と実行の操作方法は、「ソフトウェア バージョン Ver 2.04 取扱説明書」の第8章 プログラム機能、8-1 ページにある 「1.プログラムの作成から実行までの流れ」 を参照してください。

fx-9860GII の取扱説明書は、製品に添付されているCDに PDF ファイルとしてあります。または、カシオのサイトからダウンロードできます。
 ⇒ fx-9860GII_Soft_J.pdf

fx-9860GII で入力するコマンドは、複数のメニューに分散していて、最初は探すのに苦労します。fx-5800P のようにスッキリとまとまっていないので、なんとかして欲しいと思います。

- ClrGraph の入力
[SHIFT] [VARS] (PRGM) [F6] (▷) [F1] (DLR) [F2] (Grph)


- LabelOff の入力
[SHIFT] [MENU] (SET UP) [F5] (LABL) [F2] (Off) 


- For / To / Step / Next の入力
[SHIFT] [VARS] [F1] (COM) [F6] (▷) 
とすると、[F1][F4] にそれぞれ、ForToStepNext が割り当てられている。


- Horizontal の入力
[SHIFT] [F4] (Skeych) [F6] (▷) [F5] (Hztl)



コマンド類は、おおよそ以下の場所に分散しています;

- プログラムの制御に関するもの:
[SHIFT] [VARS] から下位のメニュー

- グラフ機能(グラフィックス機能) の描画に関するもの;
[SHIFT] [F4] (Sketch) から下位のメニュー

-グラフ機能(グラフィックス機能)の設定に関するもの;
[SHIFT] [MENU] (SET UP) から下位のメニュー

- ViewWindowの設定に関するもの;
[SHIFT] [F3] (V-Window) から下位のメニュー


上記のプログラムは、グラフィックスエリアを塗りつぶしています。同様にエリアを塗りつぶすために、PxlOn コマンドでピクセルを順に塗りつぶすプログラムは以下になります。

ClrGraph
For 1→A To 63
For 1→B To 127
PxlOn A,B
Next
Next

(物理座標系)

描画速度を比較すると、Horizontal コマンドを用いる方が、圧倒的に速いことが分かります。



今回のまとめ
  • fx-9860GII のLCDは 128 x 64 ピクセル
  • fx-9860GII のグラフィックス描画エリアは 127 x 63 ピクセル
  • fx-9860GII は3つの座標系を使い分ける
    • デフォルトの論理座標系: LDC中央が原点、1dot = 0.1 で固定
    • ViewWindow座標系: 自由に設定可能な座標系
    • 物理座標系: LCDピクセルを直接指定する座標系、1 dot = 1、整数指定
  • グラフィックス コマンドにより描画速度が大きく異なる

今回使ったグラフィックス コマンド
  • ViewWindow
  • ClrGraph
  • Horizontal
  • PxlOn





つづく...

Casio Basic入門G02 / 目次




応援クリックをお願いします。励みになるので...

人気ブログランキングへ









keywords: fx-9860GIICasioBasic、グラフィックス, プログラミング入門プログラム関数電卓

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


関連記事

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

Casio Basicでグラフィックス

Casio Basic入門 - Casio Basicでグラフィックス
<目次>


2015/10/21 更新
2015/12/07 追記


「Casio Basic でグラフィックス」を Casio Basic入門で連載を始めています。
 ⇒ Casio Basic入門G01 から (詳しくは Casio Basic入門 - 目次 - を参照)


これまでは、「Casio Basic を使ってみる」の連載で、Casio Basic入門50 まで続いています。グラフィックス プログラミングについては、敢えて別シリーズに分けており、今後も引き続き Casio Basic入門51 以降は続くと思います。

基本的に楽しんでやっているのですが、プログラムのネタを思いつくのは、用途や位置づけといった大枠からの発想に助けられることが多いので、一見面倒な感じの「電卓でグラフィックス プログラミングとは?」といったことも考えています。


このあたりは、今後まとまってくると思いますが、今のところ考えていることを白状しておきます。



プログラム電卓でグラフィックスプログラミングには否定的でした。今でも否定的な考えは少なからず残っています。

電卓にPCと同じ機能を求めるのではなく、電卓ならではの利点を活かしたプログラムを作って、利用すれば良いと主張してきました。特に、Casio のプログラム電卓のグラフィックス機能は、グラフ機能に特化(制限)されていて、LCDの解像度や描画速度を考えると、敢えて電卓でグラフィックスプログラミングを行うメリットは無い、というのが理由です。

では、私自身が Casio Basic のグラフィックス機能(グラフ機能) を本当に分かった上で、これを言っていたのかと問われると、幾つか味見程度のプログラミングを行った程度だったと、白状しなければなりません。

つまり、当ブログのポリシー「実際に試して、確認した内容を公開する」を考えると、中途半端です。

実は、これまでに以下のような記事を書いています。私の考えの変化がそのまま現れています。

fx-9860GII グラフィックス - モンテカルロ法
  • [2015/02/28] fx-5800P で作ったプログラムを fx-9860GII へ移植し、さらにグラフィックス表示を追加するために、プログラム電卓で初めてグラフィックスコードを書いた。グラフィックス描画は思った以上に処理時間がかかることが実際に分かり、画面全体を埋め尽くすようなグラフィックスプログラムには向かないと思った。
楽屋裏 - Casio Basicプログラミング
  • [2015/01/19]  少しだけグラフィックスプログラミングについて、考えを変え始めたことに触れている。
楽屋裏 - Casio Basic のグラフィックス描画
  • [2015/02/17] Casio Basic ではグラフィックス描画速度が遅いが、グラフィックスコマンドの動作に少し興味を持った。
楽屋裏 - Casio Basic のグラフィックス プログラミング
  • [2015/06/24] グラフィックスコマンドは、マニュアルには殆ど記載が無いので、実際に調べ始めたところ、従来の Basicコマンドから想像するだけでは全く分からない機能が隠されていること、プログラムに依っては処理速度が問題にならない用途も有りそうなこと、そして何よりも、実際に調べてみなければ判断するのは早いと思った。
  • そこで、Casio Basic でのグラフィックスプログラミングを徹底的に調べて、Casio Basic入門で取り上げることにした。
楽屋裏 - 酔っ払いの虫 (Drunk Bug)
  • [2015/07/20] Casio Basic のグラフィックスコマンドが少し分かってきて、安心してシミュレーションゲームを作ってみた。面白い。

「楽屋裏」で記事を書いていたのは、Casio Basic でのグラフィックスをブログで取り上げるかどうか、少しは考えていた証拠ですが、Casio グラフ関数電卓でグラフィックス プログラミングについて、本腰を入れて調べるまでに半年ほど逡巡していたことになります。そして、実際に詳しく調べ始めると、取扱説明書には全く説明されていない、重要な仕様が次々と分かってきています。宝探しのようで、やっていて面白いものです。

これまでに調べて分かっているだけでも、仕様を知っていれば有用なプログラミングが出来る一方で、仕様を知らないと想定外のバグで悩むことになりがちなのが、Casio Basic のグラフィックスコマンドだと分かってきました。


ところで、新世代Casio Basic は、Basicプログラミングの入門に良いと、これまで主張してきました。グラフィックスに否定的で、テキストベースでのプログラミングを前提にすれば、いまでも同じように考えています。

ところが、グラフィックスコマンドについては、かなり Casio 色が強い仕様になっていて、果たして Basic修得の入門に良いと言えないかも知れません。さらに、電卓でのグラフィックス・プログラミングでは、繰り返し処理を頻繁に使うように思うので、繰り返し処理に不慣れな初学者には、その分敷居が高いようにも思います。

グラフィックス・プログラミングには電卓特有のグラフ作成機能が活きてくるのかどうか、これはまだ分かりません。そこで、グラフィックスコマンドについて、さらに知見が深まるまで、結論は保留にしておこうと思っています。


先ずは Casio Basic でのグラフィックス プログラミングを徹底的に調べて、なにか楽しいプログラムを作ろうと思います。


[2015/12/07 追記]
Casio Basic グラフィックスコマンドの探索が進むにつれて、純正 Casio Basic では、グラフィックスコマンドが限られており描画速度が遅いので、本格的なグラフィックスプログラミングには向かないという感覚はやはり正しいと分かってきました。画面を埋め尽くすような描画やビットマップを扱うのは純正Casio Basic では無理があります。

ところが、「アドイン版高速・高機能Casio Basic」 の開発 "C:Basicプロジェクト" が始まり、テスト版でグラフィックスプログラムを作ってみると、速い処理速度でグラフィックスプログラムが走ることが経験できます。これの最大のポイントは、Casio Basic の上位互換なので、基本的にCasio Basic でプログラムが書ける点にあります。試しにライフゲームを作ってみたところ、現実的な速度でビットマップ処理が出来るので、Casio  Basicでグラフィックスプログラミングが面白くなってきました。

Casio Basic のグラフィックスコマンドを詳しく探索した結果を反映した「アドイン版 Casio Basic - C:Basic」うという新しい選択肢が現実的になってきたので、電卓でグラフィックスプログラミングへの否定的な感覚がかなり薄くなっています。適材適所で開発処理系の使い分けると良いのです。




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ




  



keywords: fx-9860GIICasioBasic、グラフィックス, プログラミング入門プログラム関数電卓

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


関連記事

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

fx-5800P のキーコード 【修正あり】

【2013/11/3 修正】
fx-5800Pのキーコード取得プログラムのソースに、1行抜けがあったので、それを修正。同時に、若干のスリム化をした。 お詫びして以下に修正を加える。

[2015/12/07 修正]
Casio Basicを使いこなす前に書いた記事だが、その後多くのプログラムを書いて Getkeyコマンドの有用性が分かってきたので、それに伴う修正を行った。



パソコンのプログラミング経験者は、キーボードのキー1つひとつに、固有の番号が割り当てられていることをご存じだろう。
この番号をキーコードと言う。

fx-5800P-3 

カシオプログラム関数電卓 FX-5800P-N

fx-5800Pもプログラミングでキーコードを使えるようになっている。
特定のキーが押されたかどうかを監視することができるわけだ。

fx-5800Pの専用プログラミング言語には、Getkey と言うコマンドが用意されている。

Getkeyコマンド
・引 数:なし
・戻り値:取得したキーコード
・動 作:Getkeyが実行された時、最後に押されたキーのキーコードを返す。何も押されていない場合は0を返す。

なお、[AC/ON]キーは例外で、それ以外の全てのキー(49個)のキーコードを取得できる。


直前に押されたキーのコードを取得することから、パソコンと同様に、キーバッファからキーコードを取得するようになっているのだろう。

※ fx-5800Pの取扱説明書:以下からPDFファイルをダウンロードできる
http://support.casio.jp/manualfile.php?cid=004007004



Getkeyを使う場面


Getkeyが有用なのは、プログラムが何か処理をしている時に押したキーに応じて処理を割り込ませる場合だ。テンキー以外のキーを使うメニュー処理にも有用だ。

そこで、[9]をキー入力してメニュー選択を行うプログラム作ってみる。

試しにGetkeyを使わないプログラムを作ってみると、以下のようになる。
ここでは、[9]を入力した時、入力した数字を表示させることにする。

======================
"INPUT NUMBER"?→K
"THE NUMBER = ":K◢ 

======================

このプログラムを実行すると、

------------------
INPUT NUMBER ?
------------------


と表示され、「9」を入力すると、

------------------
INPUT NUMBER ?
9
------------------

と表示され、一旦処理が止まる。

ここで、[EXE]キーを押すと、次の処理へ進んで、「入力した内容を表示する」処理が実行される。

------------------
INPUT NUMBER ?
9
THE NUMBER =   9
------------------

Getkeyを使わずに入力命令「?」を使うと、必ずプログラムが一旦停止するので、先へ進むにはどうしても [EXE]キーを押す必要がある。メニュー選択で余計なキー操作が必要だ。それでもテンキーを使ったメニュー処理なら、この方法は簡単ではある。


次に、Getkeyを使って、[9]を押してメニュー選択すると、[9]のキーコードを表示するプログラムを作ってみる。

======================
"INPUT NUMBER ?"
Do
Getkey→K
LpWhile K≠33
"THE NUMBER =":K◢ 

======================


キーが押されたかどうかを監視するには、Getkeyコマンドとループ処理と組み合わせる必要がある。

Do~LpWhile ループ処理では、キー入力監視を行い、数字キー[9]に相当するキーコードを取得しない限り、ル-プが回り続ける。キーコード33が取得されると、ループを脱出して、次の表示処理へ進む。

プログラムを実行すると、

--------------------
INPUT NUMBER ?   ■
--------------------

と表示される。

右端の■は、プログラムが動いていることを示す。つまり、ループが回り続けているわけだ。

ここで、[9]キーを押すと、

------------------
INPUT NUMBER ?
THE NUMBER =
            33
------------------

と[9]のキーコードである33が表示された。


Getkeyコマンドを使うと、メニュー選択のために何かキーを押すと、直ちに次の処理を行えることが分かる。さらに、テンキー以外のキーを使うには、Getkey を使うしかない。


キーコード取得プログラム
fx-5800Pの取扱説明書には、各キーのキーコードが記載されている。

Getkeyを利用するプログラムを書いている時、手元に取説が無いことが結構ある(私の場合は、通勤電車で電卓プログラミングを愉しんでいるので、こういうことになってしまう)。

そこで、キーコードを調べて表示するプログラムを作ってみた。

fx-5800P専用
キーコード取得プログラム:2013/12/20 修正
===============================
"Get KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"
:QUIT"
Lbl 0
Do
Getkey→K
LpWhile K=0
Cls
Locate 1,1,"KEYCODE =   "
Locate 11,1,K
Goto 0

================================


これを実行すると、

----------------
  GET KEYCODE

   HIT ANY KEY
     :QUIT
----------------

と、プログラムの説明を表示。

ここで、いきなり好きなキー(調べたいキー)を押す。

例えば、[DEL]キーを押すと、

-------------------
KEYCODE = 34    ■
    HIT ANY KEY
            :QUIT
-------------------

と表示される。

ここで表示されているキーコード34は、動作開始で押した[DEL}キーのキーコードだ。

さらに、好きなキーを押すと、そのキーコードが次々に表示される。 結構重宝している。




keywords: fx-5800PGetkeyコマンドキーコード, keycodeプログラミングプログラム関数電卓

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

続きを読む

関連記事

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

番外編 - ノイズキャンセリング イヤホンの比較

番外編
e-Gadget


ノイズキャンセリング イヤホンについて...

電卓、電子辞書、携帯オーディオなど、自分なりの選定基準(こだわりとも言いますが...)で選び、気に入ったものは壊れても修理して、長く使い続ける傾向が強いので、結構古い製品を使い続けている。

海外出張が結構あり、必需品の1つにノイズキャンセリング イヤホンがある。ヘッドホンタイプは嵩張るが、イヤホンタイプは ケーブルを束ねて機内持ち込みのカバンやズボンのポケットに収まるので断然イヤホンタイプが良い。HMVじゃないが、No Music No Life な私は、海外出張時以外でも、通勤時や新幹線利用時など、日頃からボリュームを下げても聞けるノイズキャンセリング イヤホンを使っている。

海外出張で一番嫌なのが、長時間乗らなければならない飛行機なわけだが、エンジンの騒音が疲れの原因の多くを占めている。機内で眠る時や集中仕事をする時、静粛性が手に入るノイズキャンセリング イヤホンは必需品。国際線では、たまに日本封切り前の映画を見られることもあり、映画も機内の楽しみの1つだ。いずれにせよ、国際線機内ではノイズキャンセリング イヤホンが必需品となる。

余談になるが、主にJAZZ のピアノ曲やボーカル、クラシックのピアノ曲を中心に、アコースティックなものをよく聞いている。だから外で音楽を楽しむにはノイズキャンセリングがどうしても欲しくなる。

ここしばらくは 2006年に購入したソニーのノイズキャンセリング イヤホン、MDR-NC22 を愛用していたが、これが壊れてしまった。座席にイヤホンを刺したまま勢いよく立ち上がった時、ケーブルが引きちぎれてしまったもので、なんとも迂闊なことだ。

MDR-NC22 

単4電池1本で動作するので、充電したエネループを一緒に持ち歩いていた。飛行機のエンジン音が聞こえなくなるので、映画や音楽を楽しむ以外でも、飛行機内ではこれを使っている。機内で資料をまとめたり、電卓プログラムを作ったりするのにも、静かなので集中できる。

先月の海外出張で、これを使って映画を見ている時、隣の人が通路に出たいというので、迂闊にも座席にプラグを差したままで勢いよく立ち上がってしまった。本体のクリップが割れて吹っ飛び、ケーブルが本体から引きちぎられてしまった。



そこで、新しく購入する前に、ノイズキャンセリングの能力を確認するため、家電量販店で他の製品と聞き比べてみた。ヨドバシカメラでは快く聞き比べさせて貰えた。

現行販売品のうち、パナソニック のRP-HC30 と オーディオエクニカの ATH-ANC23 そして、Bose の Quiet Confort 20 を ソニーの MDR-EX750NA と共に聞き比べてみた。


Bose Quiet Conofort 20

Bose の Quiet Confort 20 のノイズカット能力は圧倒的で、広い周波数帯でノイズが消えているように感じた。仮に5点満点で5点を挙げて良いと感じた。
QuietConfort20 



SONY MDR-EX750NA "h.ear in NC"

聞いた瞬間、日頃使ってきた 2006年製の MDR-NC22 に比べて格段に静かなことが分かるくらい差があり、7年間の技術の進歩に驚かされた。Bose の製品を試していなかったら、これがベストと思っただろう。5点満点で3点だ。Bose の Quiet Confort 20 よりは明らかにノイズカット性能に差があるが、以下の2つよりは明かに優れているのが、3点の理由だ。
MDR-EX750NA 

audio-technica ATH-ANC23

オーディオテクニカの ATH-ANC23 は、ノイズキャンセリング性能に関しては 2006年製の ソニー MDR-NC22 と同等だと感じたので、5点満点で2点。環境騒音を99%低減と謳っていたが、とてもそんなに低減しているとは思えない。測定条件をきちんと調べる必要がありそうだ。感覚的には、かなり疑わしい過大表記と言えそうだ。ソフトバンクの繋がりやすさN0.1 の広告と同じ臭いがする。
ボリューム調整のダイアルが付いているのはプラスポイント、一方でノイズキャンセルの On/Off スイッチが硬くて使いづらいのはマイナスポイントだ。
実は、以前オーディオテクニカ製のマイク付きヘッドフォンを購入した時に、製品パッケージ記載内容が曖昧で購入前に期待した使い方が出来ず、メーカーに相談したところ、記載の齟齬を認めながら対応が悪かったことを思い出し、曖昧・過大な表記は企業体質に違いない。今回の過大表記に嫌悪感を覚えたので1点減点して、評価点1点としておこう。アナログ時代に持っていた良い企業イメージが、今回また悪くなってしまった。
ATH-ANC23 

Panasonic RP-HC30

さて、パナソニックの RP-HC30 は、ノイズ低減能力においては、ソニーMDR-NC22 と変わらず MDR-EX750NA よりはハッキリと劣ると感じた。ノイズカット75%と謳っているので、この点では正しく表示している感じがして好感は持てる。比較した中では、最も安価だったので、大いに納得。ノイズキャンセリング入門用としてはベストバイだ。それだけに、オーディオテクニカの90%低減の表記には、反感を抱くことになった。ノイズカットの能力は5点満点で2点といった感じ。なおボリューム調整ができるのはプラスポイントだ。
RP-HC30 

現行販売品を店頭で聞き比べた結果、ノイズキャンセリング能力では、圧倒的に Bose の Quiet Confort 20 だが、3万円台半ばの価格は、さすがに躊躇する。そこで、妥協して ソニーの MDR-EX750NA を、価格交渉の結果2万円以下で購入した。ヨドバシカメラはamazonの価格を提示すると同等以下に値引きしてくれることが多いし(但しヨドバシポイントが付かないこともある)、気持ちよく聞き比べをさせてくれたので、その場で購入した。



SONY MDR-EX750NA "h.ear in NC"

今回購入した ソニーの MDR-EX750NA だが、商品名が h.ear in NC となっている。ドットを使った命名は、当ブログで紹介している 開発中の C.Basic と通じるところがあって、これも気に入っている。

これは、ハイレゾ対応のノイズキャンセリング機能を持っていて、最近発売されたかなり新しい製品だ。私は今のところハイレゾ対応のプレイヤーやスマホを持っていないが、将来入手した時の楽しみに取っておこうと思う。

ノイズキャンセリングをONにした時のサーというホワイトノイズが聞こえる。これは以前から使ってきていた MDR-NC22 とほぼ同様な感じだが、音楽を再生すれば全く気にならないレベルだ。

充電式なので、電池が空になったら外出時には使えなくなるかと思ったが、充電しながら使える。これは助かる。ミニUSBプラグでスマホを充電しながら使うのと同じだ。


現在使っているスマホ (SONY Cperia Z1f)、携帯プレイヤー (SONY NW-X1050)で使った感じをメモしておく。

一応、MP3 と CD の音質の違い程度はハッキリ分かる耳を持っているが、Xperia Z1f では特に違和感なく聞けた。意外だったのが ウォークマン NW-X1050 では、音がこもって、周波数の解像度が悪くなる。イコライザを触ってみてもあまり改善しない。標準添付のイヤホンの方が断然綺麗な音質で聞ける。従って、標準添付のイヤホンで聴けば良いだけの話しで、問題ではない。

ソニーのノイズキャンセル機能付きスマホ用イヤホン MDR-NWNC33 などでは、X1050/1060 では使えないと注意書きのあるので、何か技術的に明確な理由があるのだろう。そして、同じ問題が 今回購入した MDR-EX750NA でも有るのではないかと想像している。

この点については、いずれソニーに相談してみようと思っている。


今回の件がきかっけで、量販店でハイレゾのプレイヤーを視聴する機会があった。好きなボーカルの1人、ノラ・ジョーンズのいつも聞き慣れている曲を聴いてみたところ、それまで気付かなかった息づかいまで感じられるような描写力の高さには、、驚いてしまった。技術の進歩は凄いものだ。欲しいプログラム電卓があるものの、ひょっとしたらハイレゾ対応の携帯プレイヤーを先に買ってしまいそうだ...




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


keywords: ノイズキャンセリングイヤホン

リンク集 | ブログ内マップ
関連記事

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

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

やす (Krtyski)

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


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

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

おもしろい・役に立つならクリックしてください。励みになります。
にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

RSSリンクの表示
最新トラックバック
ブロとも申請フォーム

この人とブロともになる

QRコード
QR