楽屋裏 - 虫の閉じ込め (Bug Trap)

楽 屋 裏 - Bug Trap
e-Gadget

プログラム改善 2015/08/11
更新 2015/08/14

[2015/08/11 プログラム改善]
sentaro様のご提案で、虫 (=点) の描画を常に3個分残像(黒い三連星!) にすることで、視認性の向上が顕著です。そこで、この改善プログラムを BUGTRAP3 (3連星の '3' で、'2' は有りません(^^;) としてダウンロードできるようにしました。具体的な改造点については、上記のコメントをご覧ください。
⇒ ダウンロード: BUGTRAP3 (黒い三連星バージョン)


以前、酔っ払いの虫 (Drunk Bug) - シミュレーションゲーム - を作ってみました。

Casio Basic でのグラフィックスプログラミングで、どんなプログラムが作れるのか? その一例で、Drunk Bug は、虫がランダムに動く様子をグラフィックスで表現したもので、箱の壁で虫が進行方向を変えます。見ていて、そこそこ楽しめるプログラムになりました。


そこで、虫1匹=点1個 を画面内で直線的に移動させて、壁で反射させるプログラムを作るとどんな感じになるのか、ちょっと試してみたころ、
fx-986GII は、点描画の応答速度がかなり遅いので、点を動かすと、ピクセル表示の応答が、移動速度に追いつかなくて、動く点の視認が難しいことが分かりました。かなりウェイトをかけて、やっと視認できるようになります。

そこで、壁で反射するだけでなくて、適当に障害物を置いて、そこで反射させるような処理を追加して、処理の時間がウェイト代わりになれば、動きが複雑になって、ついでに点移動も視認できて、都合良くなるかも知れない...意外に形になるかも...と、思って作ったのが今回のプログラムです。

今回のプログラムでは、fx-9860GII の画面イメージを 保存/読出し する機能も併せて使ってみます。



Bug Trap の遊び方

⇒ ダウンロード: BugTrap [最終 2015/08/14]

先ずは、ダウンロードして遊んでみてください。

1. 障害物設置 (ペイントモード):
プログラムが起動すると、[EXE] でペイントモードに入ります。カーソルを自由に動かして、点と点を繋ぐ直線を折れ線を一筆書きで描いて、好きなように障害物を描きます。障害物無しにもできます。左下を原点 (0,0)  として、位置を考えながら障害物を自由に描きます。[DEL] でペイントモードを終了します。何も描かずに [DEL] を押してもペイントモードを終了します。
BugTrap-PaintMode 
[EXE] を押すと十字カーソルが現れます。カーソルを矢印キーで動かして [EXE] キーを押せば直線が描かれ、カーソルは消えます。再び [EXE] キーを押すと、前回カーソルが消えた位置にカーソルが現れ、次の点まで移動して [EXE] で確定すると、一筆書きで折れ線が描画できます。これを繰り返して障害物を設置します。カーソルが消えている時に [DEL] キーを押せばペイントモードを終了します。
[DEL] を押した時に、障害物のパターンを画面コピーして PICT15 として自動保存されます。

2. 虫の走行 (描画モード):
ペイントモードを終了すると、左下から虫(=点)が45度の角度で走り出します。壁(外枠)や障害物に当たると進行方向を90度変えます。斜め線などでピクセルが上下あるいは左右に隣接していない点 (孤立した点) は、虫が通り抜け、その点は消えます。

3. 終 了
[EXIT] で正常終了し、この時のグラフィックス画面をコピーして PICT16 として自動保存します。

点の動きは応答速度が遅いために、薄く視認性がよくありません。[SHIFT] [OPTN] (LIGHT) でバックライトを点灯すると少し見えやすくなります。

[2015/08/14 追記]
虫 (=点) 3個を残像のように表示させて、視認性を向上させた バージョンを使えば、虫の動きがかなり見やすくなります。
⇒ ダウンロード: BugTrap3 (黒い三連星バージョン) 


遊び方

さて虫の動きを見ていると、障害物の置き方によっては、最初から同じ経路を循環する場合や、始めは孤立した点を消去しながら進むが最終的に同じ経路を循環する場合もあります。数学的な規則性があるのでしょうが、難しいことを抜きにしても、面白いです。

このように 虫の動きを一定の範囲に閉じ込めるように障害物のパターンを探して遊びます。虫を閉じ込めるので、Bug Trap (虫の閉じ込め) という名前にしています。

せっかく見つけたパターンを保存したり、保存したパターンを呼び出して使えます。fx-9860GII には画面コピーを最大20枚保存する機能が備わっていて、これを利用します。正し、プログラム停止状態でないと画面コピーできない点に注意が必要です。


障害物パターンの取込

例えば、以下のパターンを fx-9860GII に取り込んでみましょう。

BugTrap-Pict20 
⇒ パターンのダウンロード: PICT20.G1M 


点が2つありますが、虫はこれらの点を通り抜け、その際この点は消えるので、気にする必要はありません。

ダウンロードした PICT20.G1M ファイル を、PCリンクソフト FA-124 を使って fx-9860GII に取り込みます。 FA-124 を起動して、メニューの [HELP] - [Manual] を選んで、表示される取扱説明書を読めば、全ての操作方法が分かります。今回の手順は以下参照;
  1. PICT20.G1M ファイルを上からダウンロードし、分かるフォルダに保存します。
  2. FA-124 Ver 2.04 を起動。
  3. 右ペイン (FA-124) で アイコンメニューの Main アイコン (電卓の恰好したアイコン) をクリック。
  4. ツリービューの Default フォルダの上でマウスの右クリック。
  5. メニューから Import をクリックして、保存したPICT20G1M を選んで、[開く] ボタンをクリック。
  6.  すると、右ペインのツリービューにある `Picture フォルダ下に PICT20 が取り込まれる。 
次に、fx-9860GII と PC を接続して、PICT20 をfx-9860GII へ取り込みます。詳細手順は以下参照;
  1. PCリンクソフト FA-124 Ver 2.04 を起動した状態で、fx-9860GII と PC をUSBリンクケーブルで接続。
  2. fx-9860GII に Select ポップアップメニューが現れ、そこで [F1] (DataTrans:[F1]) を押す。
  3. FA-124 画面の左ペイン (Calculator) のアイコンメニューで、Connect アイコンをクリック。
  4. 接続動作の後、接続できたらツリービューが現れる。
  5. 右ペインの Picture フォルダを右ペインの User1 フォルダまで ドラッグ&ドロップする。或いは、右ペイン (FA-124) の Picture フォルダで右クリック→メニューで Copy をクリックし、左ペイン (Calculator) の User1 フォルダの上を右クリック→メニューで Paste をクリックします。
  6. これで、fx-9860GII に PICT20 が転送される。
  7. fx-9860GII で [AC] を押すか、FA-124 の左ペイン (Calculator) のアイコンメニューの Disconnect アイコンをクリックすれば、接続が解除される。
続いて、BugTrap プログラムで PICT20 を呼び出します。

BUGTRAP を起動します。

BugTrap-PaintMode 

ペイントモードになっています。
ここで、[OPTN] キーを2回押すと、画面左下に PICT アイコンが現れ、[F1] (PICT) [F2] (RCL) で Recall From Picture Memory ポップアップが現れます。ここで、Pict 番号である 20 を入力すると画面に Pict20 の画像が取り込まれます。十字カーソルも表示されているので、[EXE] キーでカーソルを消します。カーソル位置に点が描画されますが、気にする必要はありません。孤立した点を虫が通ると、方向転換せずに、その点が消されます。もしどうしても気になるなら、カーソルを既に ON になっているピクセル上へ移動してから [EXE] キーを押してください。

BugTrap-SetPict20 

カーソルが消えると、画面左上に DEL: Go! 表示が現れます。[DEL] キーを押せば、虫の移動が始まります。24回反射して、同じ経路を巡回し続けますね。見ているとちょっと面白いです。

==========

他にも、以下の障害物パターンをダウンロードして試してみてください。

 似たようなパターンですが、ちょとした違いでかなり違います。

BugTrap_Pict16 
⇒ ダウンロード: PICT16

52回反射する軌跡が繰り返されます。


BugTrap-Pict19 
⇒ ダウンロード: PICT19

これは、虫を閉じ込められないように見えます(?)


BugTrap-Picct18 
⇒ ダウンロード: PICT18

これは、閉じ込めに成功します。


BugTrap-Pict17 
⇒ ダウンロード: PICT17


このパターンは、ピクセル3個です (左下の点は無視してください、実際に動作させると虫が通過して消えます)。おそらく閉じ込めに成功する最小ピクセルパターンではないかと思います。


障害物パターンの保存

[2015/08/14 追記]
障害物パターンを PICT15 に自動保存するように変更しました。しかし、PICT15 に決めて保存するのが不都合の場合は、以下のプログラムソースにある StoPict 15 を削除するか、行頭に ' 記号を追加してコメント行にすることで、自動保存をさせないようにできます。この場合は、以下の方法で、好きな Pict # (1 ~ 20) に画面コピーができます。

コメントアウト記号 ' の入力方法 : プログラム入力画面で、BUGTRAP あるいは  BUGTRAP3 のプログラムを表示させたばかりの状態にします。画面下の右端に CHAR  が表示されていればOKです。これが表示されていない場合は [EXIT] を1回あるいは複数回押せば、そこかで CHAR が表示されます。プログラムコードで StoPict 15 の行頭にカーソルを移動させ、
 [F6] (CHAR) [F2] (SYBL) [▶] [▶] [▶] [▶] [▶] [▶] (右を6回) [EXE] 
で、コメントアウト記号 ' が入力できます。


例えは、以下のような障害物パターンを作るとします。

BugTrap2 

十字カーソルが表示されていて、この位置まで一筆書きするために、[EXE] を押すと、

BugTrap3 

線が秒がされてカーソルが消えます。カーソルが消えると DEL: Go! が表示され、描画モードへ移行できます。

右上に マークが表示されていて、プログラムがループを回っていて実行中であることが分かります。この時は fx-9860GII 内蔵の画面コピー機能は使えません。

この画面をコピーしたいのですが、先ず [DEL] キーを押して描画モードへ以降させてから、素早く [EXIT] を押します。すると、

TC10-Quit_Bye_2 

となり、ここで [EXE], [AC], [EXIT] のいずれかを押せばプログラムは正常終了しますが、この時点ではプログラムはまだ終了していません。

ここで、[SHIFT] (F6] (G↔T) を押すと、グラフィックス画面に切り替わります。

BugTrap4 

この画面の右上には、 マークが有りませんね。従ってこの状態では 画面コピーができます。
一旦描画モードに移行しているので、左下に移動中の虫(点)が見えています。

ここで、[OPTN] [F1] (PICT) [F1] (STO) を押すと、Store In Picture Memory ポップアップが現れるので、ここで Pict番号を 1~20 のいずれかを入力します。これで、画面コピーが完了しました。

PCリンクソフト FA-124 を使って、fx-9860GII から PC へこの画像データを転送することもできます。


面白いパターンが見つかったら、ぜひ教えて下さい。



プログラム

[2015/08/14 更新]
ペイントモードの操作の統一性が出すための修正(赤文字部の追加)を行いました。

ファイル名: BUGTRAP
'==Initialize==
ClrGraph
CoordOn
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0

'==Draw frame==
S-L-Normal
F-Line 0,62,0,0
F-Line 126,62,0,62
F-Line 126,0,126,62
F-Line 126,0,0,0

'==Paint mode==
Text 7,3,"EXE/→/↑/←/↓: Draw Wall
Text 13,3,"DEL: Go!"
63→X:31→Y
While 1
While Getkey
WhileEnd
Do
Getkey→K
Text 13,3,"DEL: Go!"
LpWhile K=0 Or K=47
K=44⇒Break
If K=31 Or K=68
Then
Text 13,3,"    " '8 spaces
Plot X,Y◢
Line
IfEnd
WhileEnd
Text 7,3,"             " '25 spaces
Text 13,3,"    " '8 spaces
StoPict 15

'==Draw dot==
62→B:2→A:-1→D:1→C
PxlOn B,A

'==Move dot==
While 1

'✶Set direction
If B=1 Or B=63
Then (-1)D→D
Else If A=1 Or A=126
Then (-1)C→C
Else
PxlTest(B+D,A)⇒(-1)D→D
PxlTest(B,A+C)⇒(-1)D→C
IfEnd:IfEnd

'✶Clear & Plot dot
PxlOff B,A
B+D→B:A+C→A
PxlOn B,A

Getkey=47⇒Break
WhileEnd

'==Normal end
StoPict 16
ClrText
Locate 9,5,"bye!"

⇒ ダウンロード: BugTrap

⇒ ダウンロードBugTrap3 (視認性向上した黒い三連星バージョン) [2015/08/11 追加]



Casio Basic グラフィックスのポイント

プログラム全体は、構造化プログラムになっていて、

初期化 (Initialize)
 ↓
ペイントモード (Paint mode)
 ↓
最初の点の描画 (Draw dot)
 ↓
点の移動 (Move dot)
While 1
  進行方向設定 (Set direction)
  点の削除と描画 (Clear & Plot dot)
WhileEnd
 ↓
正常終了処理 (Normal end)


と、ペイントモードの中身以外は、非常にスッキリしていると思います。

ペイントモード
ペイントモードでは、Plot コマンドと CoordOn を組み合わせて、左下を原点 (0,0)  として、位置を考えながら障害物を自由に描きます。Plot コマンドや Plot と組み合わせて使える Line コマンドは、十字カーソルを使った簡単なお絵かきツールを作るのには便利なので、これを使ってみました。Casio Basic ならではの機能です。Plot コマンドや Line コマンドについては、Casio Basic入門G04 を参照してください。

描 画
左下から虫(=点)が45度の角度で走り出します。PxlOff で点を消してから次の位置に PxlOn で点を描画します。これらのコマンドは物理座標系 (詳細は Casio Basic入門G07 参照) で動作し、座標指定に X と Y を使えません(仕様)。物理座標は縦方向を先に、横方向を後に指定するので、普通の (X, Y) 座標の感覚に合わせるため、座標値を (B, A) としています。そこで、PxlOn B,APxlOff B,A といった記述にしています。

虫が1歩進むとき、座標 (B, A) から (B+D, A+C) へ進むようにします。D や C は、-11 のどちらかにします。要するに虫の進みは DC の値で制御します。これらのプラスマイナスの符号が逆転すれば進行方向が90度変わります (反射します)。

ピクセルが2個以上、縦か横に繋がっているところに当たると90度方向転換します (実際は当たっていません、当たる直前に方向転換しています)。障害物が斜め線になっていて、当たるピクセルの上下左右の隣にピクセルが無い時は、反射せず突き破ります(そのピクセルを消去し、虫は直進し続けます)。

指定したピクセルが ON か OFF かを判定するコマンドは PxlTest( ) しか無く、このコマンドは物理座標で動作するので、点の消去と描画にも物理座標で動作する PxlOffPxlOn を使いました。

次に描画する点が ON か OFF かを PxlTest( ) コマンドで調べて、ON なら方向転換します。

障害物での方向転換は意外に簡単に記述できます。PxlTest(B+D,A)⇒(-1)D→DPxlTest(B,A+C)⇒(-1)C→C と、たったこれだけです。こうやって DC の値を更新してから、B+D→BA+C→A によって座標 BA を更新し、最後に PxlOn B,A を実行するだけで、方向転換した虫(=点) が描画できます。

PxlOn, PxlOff, PxlTest( ) については、Casio Basic入門 で取り上げる予定です。

正常終了処理
[EXIT] で正常終了します。fx-9860GII では、[AC] で強制終了するとプログラム編修画面になって、思わぬプログラムの変更をしていまう可能性があるので、そのリスクを減らすために正常終了させることにこだわってみました。実用プログラム作成へのこだわりです。正常終了すると、bye! と表示します (実験プログラムは別として、私が作成するプログラムはこれに統一しています)。



[2015/08/14 追記]
sentaro様が 同等機能の Add-in を作ってくれました。グラフィックスプログラムは アドインで作ると高速描画が可能になる良い例です。
なお、描画中に [MENU][EXIT] 以外の好きなキーを押せば、描画が劇的に高速化します(ターボ効果)。
⇒ ダウンロード: BugTrace.g1a (Ver 1.10)



以下の一連の Casio Basic が アドインプログラムになっていて、その一部に Drunk Bug があります

楽屋裏 - 酔っ払いの虫 (Drunk Bug)
楽屋裏 - 虫の閉じ込め (Bug Trap)
楽屋裏 - 虫の軌跡 (Bug Trace)


このアドインを再コンパイルや改造できるソース付き全ファイルのダウンロードは以下;
⇒ ダウンロード: BugTrace110.zip (Ver 1.10)






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

人気ブログランキングへ


FC2ブログランキングへ





keywords: fx-9860GII、CasioBasicプログラム関数電卓コメントアウトバグ

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

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

コメントの投稿

非公開コメント

Re: リアルタイムキー入力とグラフィクスのコラボレーション

akatuki様

こんばんは、

ようこそ、お越し下さいました(^_^)/

> fx-5800Pでのリアルタイムキー入力の研究成果がグラフ電卓にも活かされ、更に興味深いものとなっています、これは面白いです !

テキストベースですと、実行が一旦停止する入力コマンドが使えて便利ですが、グラフィックスプログラムの場合は、コマンドベースでの入力の一旦停止機能が無いのが、Casio Basic です。なので、Getkeyしかありません。というか、Getkeyがなければ、おそらくまともなグラフィックスプログラムが作れないと思います。

そうなると、Getkey を有効に使うには、ループとの併用が不可欠なので、ループの理解が進まない初級者には、途端に敷居が上がってしまうのだろうと思われます。

プログラム(だけでなく、物作り全体にも言えそうですが...)では、機能の分解と再構成が不可欠で、ループ処理は日常生活で会得している分解と再構成がそのまま活きてこないのが、難しさの根底にあるのではないかと、最近気付いています。

そのあたり、Casio Basic入門で、どのように料理できるのか? 大きな課題になりそうです。


> ユーザー入力を受け付けるのは、プログラムの世界観を変更、拡充するのに有効なI/Fであります。
>
> 当方も、何かもう少し考えないとなぁ ... 。

はい、そうなんです。なので、パソコンはスマホで当たり前の Input Box や Edit Box を Casio Basic で実現させようと、Casio Basic版「入力ボックス」なる汎用サブルーチンを作って公開しています。Casio Basic では、引数と戻り値のある関数 (Function) を自分で作って使うような仕様になっていないので、サブルーチン (Procedure) での対応しか出来ないという大きな制限があるんです。

これのおかげで、私の手元の Casio Basic プログラムは、とてもユーザーフレンドリーになっています。


No title

管理人様、こんにちは!

虫の軌跡 (Bug Trace)にかなりハマってました(^^;

黒い三連星バージョン、早速にありがとうございます!

>虫を 2x2 の四角に置き換えるのは試したのですが、ノーマルクロックでは、描画のたびに渦巻きのように見えて、描画が極端に遅くなったので、公開しませんでした(大リーグボールバージョン...かなり古い世代にしか分からないですね(^^;)

4ドットごとにLCD転送が発生するので速度的にはかなりきついですね。
でも、それで渦巻きに見えて大リーグボールになるわけで…
4ドットまとめてLCD転送したらただのドット描画ですし、難しいところです(^^;


>このあたり、何をするにも fx-CG10/29 は処理が面倒になりますね。

そうなんです。
色も解像度も増えているのでその増えた分の面倒見ないといけないということなんですね(^^;
グラフィックに関しては最初から専用バージョンで作成する方がいいかもしれません。


>軌跡追跡ゲーム BugTrace ですが、実際にこれで遊んでいて、Casio Basic の動作仕様が、また一つ見つかった...と思います。ちょっと確認中ですが、コンパイラでの考慮が必要になる可能性大です!

お!
グラフィックはやはり底無し沼状態なのですね(^^;



akatuki様、こんにちは!

>fx-5800Pでのリアルタイムキー入力の研究成果がグラフ電卓にも活かされ、更に興味深いものとなっています、これは面白いです !

ですよね(^^)

電卓言語でリアルタイムキー入力ができる機種は少ないですから、CasioBasicでGetKeyコマンドが装備されているのは大きいですね。

リアルタイムキー入力とグラフィクスのコラボレーション

親分、夜分にどうも。お疲れ様です。

fx-5800Pでのリアルタイムキー入力の研究成果がグラフ電卓にも活かされ、更に興味深いものとなっています、これは面白いです !

ユーザー入力を受け付けるのは、プログラムの世界観を変更、拡充するのに有効なI/Fであります。

当方も、何かもう少し考えないとなぁ ... 。

Re: これは面白いです!(^^)

sentaro様

こんばんは、黒い三連星バージョン、素晴らしいです。

ありがとうございます。俄然面白くなりました!

虫を 2x2 の四角に置き換えるのは試したのですが、ノーマルクロックでは、描画のたびに渦巻きのように見えて、描画が極端に遅くなったので、公開しませんでした(大リーグボールバージョン...かなり古い世代にしか分からないですね(^^;)

黒い三連星バージョンは、早速本分に追加して、ダウンロードできるようにしました。280MHzでもしっかりと見えて、大満足です。


> fx-CG10ではPxlTestとPxlOnが3倍解像度になるのでそのままでは動かず手直しが必要ですね(^^;

このあたり、何をするにも fx-CG10/29 は処理が面倒になりますね。


軌跡追跡ゲーム BugTrace ですが、実際にこれで遊んでいて、Casio Basic の動作仕様が、また一つ見つかった...と思います。ちょっと確認中ですが、コンパイラでの考慮が必要になる可能性大です!

何事もやってみると、色々分かるものですね。

これは面白いです!(^^)

管理人様、こんにちは!

あのDrunk Bugが一気に思考ゲームっぽく進化しましたね(^^)
閉じ込めるというゲーム性がなかなかに秀逸なアイデアです。
fx-9860GIIでは実用的な速度で動くのでドットの動きを見てるだけでも面白いです。

ただ、そのドットが、

>動く点の視認が難しい

ここが唯一の難点ですね(^^;

最初、コントラストを上げてみたら少し見やすくなったのですが改善効果としてはちょっと薄いということで、Bug Trapでは常にドットが移動していることを利用して複数ドットを描いてから尻尾を消していくとどうなるかと思ってちょこっと改造してみました。

-------------------------
'✶Clear & Plot dot
G→I:H→J
E→G:F→H
B→E:A→F
B+D→B:A+C→A
PxlOn B,A
PxlOff I,J
-------------------------

こうすると黒い三連星っぽく常に3ドットが点灯するのでクロック上げても見やすくなりました(^^)v


fx-CG10ではPxlTestとPxlOnが3倍解像度になるのでそのままでは動かず手直しが必要ですね(^^;
最新記事
最新コメント
カテゴリ
C# (3)
検索フォーム
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

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


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

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

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


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR