e-Gadget - プログラム関数電卓 2015年12月

迷路プログラム

アドイン版 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 設定でいずれのモードにしても、時間表示が確実に小数になります。






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


 




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

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



関連記事

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

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

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

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



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

fx5800P_calc  

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

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

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

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

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


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

※ fx-5800Pの取扱説明書:以下からPDFファイルをダウンロードできる
https://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}キーのキーコードだ。

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



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


 



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人、ノラ・ジョーンズのいつも聞き慣れている曲を聴いてみたところ、それまで気付かなかった息づかいまで感じられるような描写力の高さには、、驚いてしまった。技術の進歩は凄いものだ。欲しいプログラム電卓があるものの、ひょっとしたらハイレゾ対応の携帯プレイヤーを先に買ってしまいそうだ...



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




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

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

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

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

やす (Krtyski)

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


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

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

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


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR