15 パズル

 

MSX が 100 回動かした後、カーソルキーで戻します。

プログラムは SCREEN 0 の 1画面で抑えています。

 

IchigoJam BASIC 版 ・ PC-E200・G シリーズ版 も公開しています。

 

スプライト表示にした 15 パズル version 2 もあります。

100 I$="123456789ABCDEF0":J$=I$:S=100
110 CLS:FOR L=S TO 1 STEP -1
120 U=INSTR(I$,"0"):R=RND(-TIME)*4+1
130 ON R GOSUB 280,290,300,310
140 IF C=U GOTO 120
150 GOSUB 330:GOSUB 220:NEXT L:S=0
160 GOSUB 220:PRINT:PRINT"COUNT ";S
170 IF I$=J$ THEN END
180 U=INSTR(I$,"0"):T=STICK(0)
190 ON T GOSUB 280,320,290,320,300,320,310
200 IF C=U GOTO 180
210 GOSUB 330:S=S+1:GOTO 160
220 LOCATE 0,0,0
230 FOR Y=0 TO 3:FOR X=0 TO 3
240 N=VAL("&H"+MID$(I$,X+Y*4+1,1))
250 IF N=0 THEN PRINT ".. ";:GOTO 270
260 PRINT USING "## ";N;
270 NEXT X:PRINT:NEXT Y:RETURN
280 C=U+(U>4)*4:RETURN
290 C=U-(U MOD 4>0):RETURN
300 C=U-(U<13)*4:RETURN
310 C=U+(U MOD 4<>1):RETURN
320 RETURN
330 H$=MID$(I$,C,1):MID$(I$,C,1)="0"
340 MID$(I$,U,1)=H$:U=C:RETURN

WebMSX では起動してから乱数を発生するタイミング(TIME の値)が

毎回同じになってしまうので、現在時刻の秒から乱数を生成しています。

(MSX1 では CLOCK-ID がないので除外しています)

10 R=RND(-TIME)
20 IF PEEK(&H2D)=0 GOTO 100
30 GET TIME T$
40 R=VAL(RIGHT$(T$,2))
50 R=RND(-R)

120 U=INSTR(I$,"0"):R=RND(1)*4+1