SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

穴掘り法迷路の速度比較

穴掘り法で迷路を作るプログラムで、IchigoJam S(1.4.3)とR(1.5β1)の速度を比較しました。
動画はこちら。

【IchigoJam】穴掘り法迷路の速度比較

f:id:shiro0922:20210129180002p:plain
Sだと迷路完成まで19~20秒かかりますが、Rだと2秒ほどでできます。
ゲームプログラムで迷路を作る時に、これまでは時間節約のために棒倒し法で作ることが多かったのですが、棒倒し法だと正解の道が片方の壁際へ偏ることが多いです。
Rで2秒で作れるなら、今後は穴掘り法を使っても良さそうです。

プログラム

f:id:shiro0922:20210129180250p:plain
穴掘り法で道を掘る手順は以下のとおりです。

  • 道を掘る方向を、上下左右4方向から乱数で決める。ただし迷路の外へ出てしまう方向、既に道になっている方向、掘ると他の道へつながってしまう方向へは掘らない。
  • 掘る方向が2方向以上選べる場所は、スタック(配列変数)に記録しておく。
  • 掘るのに行き詰まったら、スタックの1つ前の位置に戻って、別方向へ掘る(分かれ道)。
  • スタックが無くなったら完成。
10 '*MAZE DRILL
20 CLV:CLS:SRND TICK():CLT
30 LET [94],-1,0,1,0,0,-1,0,1
40 FOR J=0 TO 22
50 FOR I=0 TO 30:?CHR$(1);:NEXT:?
60 NEXT
70 X=1:Y=1:LC X,Y:?CHR$(0)
80 @LOOP
90 E=0
100 FOR D=0 TO 3
110 GSB @CHK
120 IF C E=E+1<<D
130 NEXT
140 IF E=0 IF P=0 GOTO @END ELSE GSB @POP:GOTO @LOOP
150 D=RND(4):IF E&(1<<D) ELSE CONT
160 IF E-(1<<D)>0 GSB @PUSH
170 FOR I=1 TO 2
180 X=X+[94+D*2]:Y=Y+[95+D*2]
190 LC X,Y:?CHR$(0)
200 NEXT
210 GOTO @LOOP
220 @END
230 T=TICK()/60
240 LC 0,23:?T;"sec.";
250 CONT
260 @CHK
270 U=X+2*[94+D*2]:V=Y+2*[95+D*2]
280 C=SCR(U,V)
290 IF U<0 OR U>30 C=0
300 IF V<0 OR V>22 C=0
310 RTN
320 @PUSH
330 P=P+1:[P]=X+Y*32:RTN
340 @POP
350 X=[P]%32:Y=[P]/32:P=P-1:RTN