迷路プログラム
2015/12/15
修正 2015/12/17
ガノー様から、C.Basic 向けに迷路作成プログラムをご紹介頂きました
や、
といったグラフィックス画面全体を使って迷路を自動作成するプログラムです。棒倒し法で作成されたとのことですが、純正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 設定でいずれのモードにしても、時間表示が確実に小数になります。
応援クリックをお願いします。励みになるので...