- さてどうしましょう。はい、 LWAIT 0 にして実行することにします。
- それでも当然ですが無限ループすることに変わりはありません。ということで、まずグラフィックウィンドウをアクティブにして「Shift+Home」を入力します。
Ok
RUN
pause in 1110
(Ok)
- なんか変なプロンプトが出ました。これはプログラムを一時的に中断していることを意味します。
- まずは毎度の LINECONTER コマンドです。
(Ok)
LINECOUNTER
0000000000000001 1000 $RANDSEED=1; GETARG $RANDSEED
0000000000000001 1005 ALIAS XY:R03, T:R06; // これを付けるとサイズを小さくできる
0000000000000001 1010 ARY INT NEW A[1504]
0000000000000001 1020 FOR T=0,1503; A[T]=1; NEXT
0000000000000001 1030 A[33]=0; // 1<<5|1 // 左上に一つだけ穴をあける
0000000000000001 1040 FOR I=0,1000000
0000000000000187 1050 X=(RAND%23)*2+1
0000000000000187 1060 Y=(RAND%15)*2+1
0000000000000187 1070 XY=X<<5|Y; T=A[XY]; IF T==0 THEN
0000000000000002 1080 DOLOOP
000000000197887b 1090 D0=0; D1=0; D2=0; D3=0
000000000197887b 1100 IF X<45 THEN D0=A[XY+32]; T=A[XY+64]; D0=D0&T; FI
000000000197887b 1110 IF X> 1 THEN D1=A[XY-32]; T=A[XY-64]; D1=D1&T; FI
000000000197887a 1120 IF Y<29 THEN D2=A[XY+ 1]; T=A[XY+ 2]; D2=D2&T; FI
000000000197887a 1130 IF Y> 1 THEN D3=A[XY- 1]; T=A[XY- 2]; D3=D3&T; FI
000000000197887a 1140 T=D0+D1+D2+D3
000000000197887a 1150 IF T==0 GOTO BRK; D=T
0000000001978879 1160 T=RAND%D
0000000001978879 1170 IF D0!=0 THEN IF T==0 THEN A[XY+32]=0; X=X+2; FI; T=T-1; FI
0000000001978879 1180 IF D2!=0 THEN IF T==0 THEN A[XY+ 1]=0; Y=Y+2; FI; T=T-1; FI
0000000001978879 1200 IF D3!=0 THEN IF T==0 THEN A[XY- 1]=0; Y=Y-2; FI; T=T-1; FI
0000000001978879 1210 XY=X<<5|Y; A[XY]=0;
0000000001978879 1220 ENDDO
0000000000000000 1230 FI
0000000000000185 1240 BRK:
0000000000000186 1250 NEXT
0000000000000000 1260 FOR Y=0,30
0000000000000000 1270 FOR X=0,46
0000000000000000 1280 XY=X<<5|Y; T=A[XY]; IF T==0 THEN
0000000000000000 1290 PRINTF " "
0000000000000000 1300 ELSE
0000000000000000 1310 PRINTF "##"
0000000000000000 1320 FI
0000000000000000 1330 NEXT
0000000000000000 1340 PRINTF "\n"
0000000000000000 1350 NEXT
(Ok)
- 言い忘れましたが、 LINECOUNTER のカウンタは16進数表示になっています(できるだけ少ない桁数で表示したかったので)。
- でもこれだけでは無限ループなのかどうかいまいち判断できません。だから RESUME コマンドで処理を再開して、少ししてからもう一度「Shift+Home」します。
(Ok)
RESUME
pause in 1180
(Ok)
LINECOUNTER
0000000000000001 1000 $RANDSEED=1; GETARG $RANDSEED
0000000000000001 1005 ALIAS XY:R03, T:R06; // これを付けるとサイズを小さくできる
0000000000000001 1010 ARY INT NEW A[1504]
0000000000000001 1020 FOR T=0,1503; A[T]=1; NEXT
0000000000000001 1030 A[33]=0; // 1<<5|1 // 左上に一つだけ穴をあける
0000000000000001 1040 FOR I=0,1000000
0000000000000187 1050 X=(RAND%23)*2+1
0000000000000187 1060 Y=(RAND%15)*2+1
0000000000000187 1070 XY=X<<5|Y; T=A[XY]; IF T==0 THEN
0000000000000002 1080 DOLOOP
0000000002db8218 1090 D0=0; D1=0; D2=0; D3=0
0000000002db8218 1100 IF X<45 THEN D0=A[XY+32]; T=A[XY+64]; D0=D0&T; FI
0000000002db8218 1110 IF X> 1 THEN D1=A[XY-32]; T=A[XY-64]; D1=D1&T; FI
0000000002db8218 1120 IF Y<29 THEN D2=A[XY+ 1]; T=A[XY+ 2]; D2=D2&T; FI
0000000002db8218 1130 IF Y> 1 THEN D3=A[XY- 1]; T=A[XY- 2]; D3=D3&T; FI
0000000002db8218 1140 T=D0+D1+D2+D3
0000000002db8218 1150 IF T==0 GOTO BRK; D=T
0000000002db8217 1160 T=RAND%D
0000000002db8217 1170 IF D0!=0 THEN IF T==0 THEN A[XY+32]=0; X=X+2; FI; T=T-1; FI
0000000002db8217 1180 IF D2!=0 THEN IF T==0 THEN A[XY+ 1]=0; Y=Y+2; FI; T=T-1; FI
0000000002db8216 1200 IF D3!=0 THEN IF T==0 THEN A[XY- 1]=0; Y=Y-2; FI; T=T-1; FI
0000000002db8216 1210 XY=X<<5|Y; A[XY]=0;
0000000002db8216 1220 ENDDO
0000000000000000 1230 FI
0000000000000185 1240 BRK:
0000000000000186 1250 NEXT
0000000000000000 1260 FOR Y=0,30
0000000000000000 1270 FOR X=0,46
0000000000000000 1280 XY=X<<5|Y; T=A[XY]; IF T==0 THEN
0000000000000000 1290 PRINTF " "
0000000000000000 1300 ELSE
0000000000000000 1310 PRINTF "##"
0000000000000000 1320 FI
0000000000000000 1330 NEXT
0000000000000000 1340 PRINTF "\n"
0000000000000000 1350 NEXT
(Ok)
- ということで、どうやら何らかの理由で、1080~1220の DOLOOP から抜け出せなくなったようです。
- じゃあちょっと状況を確認してみることにします(改行幅のせいで見にくくてすみません。実画面ではもっと見やすいです)。
(Ok)
PRINT X,,Y
25 3
(Ok)
FOR Y=0,30; FOR X=0,46; XY=X<<5|Y; T=A[XY]; IF T==0 THEN PRINTF " "; ELSE PRINTF "##"; FI; NEXT; PRINTF "\n"; NEXT
##############################################################################################
## ###### ## ## ## ## ## ###### ## ##
########## ###### ## ## ## ## ## ## ###### ## ## ## ## ###### ########## ## ##
########## ## ## ## ## ## ###### ## ## ## ## ########## ##
############## ## ################## ## ########## ############## ## ##################
############## ################## ## ## ############## ## ##################
###################################### ## ## ###################### ## ##################
###################################### ###################### ##################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
##############################################################################################
(Ok)
- これで、状況が分かりました。どうやら穴掘りで左に曲がらなければいけないときに、曲がれなくなってしまったようです。
- ・・・でも、なぜ??
- (こういう状況でカジュアルに実行できるところが、ただのデバッガよりも格段に便利なところだと思っています。)
- ということで、プログラムを確認してみると・・・あーー!1180行が2つあって1190行がない!!上書きしてしまったのか!
- ということで、行番号を打ち間違えるという、実に恥ずかしいミスだったのです。ちゃんちゃん。
- コンソールでEND命令を実行して、プロンプトを「Ok」に戻してから、プログラムを修正して、RUNするとうまくいくようになります。