SHIROのIchigoJam日記

IchigoJamの電子工作とプログラミングをメインに

15パズル×3本

FacebookIchigoJam-FANグループで、15パズルのプログラムが話題に出たので、3本作ってみました。

15PuzzleHex

16進数表示(0〜9、A〜F)の15パズルです。

  • 最初にパズルをシャッフルします。進行状況が%表示されます。
  • パズルが表示されるので、空白「.」をカーソルキーで移動して、パズルを揃えてください。
  • パズルが全て揃うと終了します。

子ども達が16進数に初めて触れる教材にいいかもしれません。配列で盤面を記憶する、乱数によるシャッフル、矢印キーで移動、はみ出しチェックなど、ゲームの基本もいろいろ入っています。

10 '*15PuzzleHex
20 CLV:CLS
30 '@SETPUZZLE
40 FOR N=0 TO 15:[N]=N+1:NEXT
50 P=15:X=3:Y=3
60 FOR I=1 TO 200
70 K=RND(4):GOSUB 270
80 LOCATE 0,0:PRINT I/2;"%"
90 NEXT
100 GOSUB 360
110 '@GAMELOOP
120 K=INKEY()-28
130 IF K<0 OR K>3 GOTO 110
140 GOSUB 270
150 IF M=0 GOTO 110
160 BEEP 20:S=S+1
170 GOSUB 360
180 '@CHKPUZZLE
190 G=0
200 FOR N=0 TO 15
210 IF [N]<>N+1 THEN G=1
220 NEXT
230 IF G=1 GOTO 110
240 BEEP 9,5:WAIT 9:BEEP 9,5
250 PRINT "*Completed!*"
260 END
270 '@MOVE
280 Q=P
290 IF K=0 AND X>0 THEN X=X-1:Q=P-1
300 IF K=1 AND X<3 THEN X=X+1:Q=P+1
310 IF K=2 AND Y>0 THEN Y=Y-1:Q=P-4
320 IF K=3 AND Y<3 THEN Y=Y+1:Q=P+4
330 IF Q=P THEN M=0:RETURN
340 [P]=[Q]:[Q]=16:P=Q
350 M=1:RETURN
360 '@PRTPUZZLE
370 CLS
380 FOR J=0 TO 3:FOR I=0 TO 3
390 Z=I+J*4:N=[Z]
400 IF N<16 THEN PRINT HEX$(N); ELSE PRINT ".";
410 NEXT:PRINT:NEXT
420 PRINT:PRINT "STEP=";S
430 RETURN

15Puzzle15

15パズルのイラスト版です。15枚のパズルを揃えると、イチゴイラストになります。

イチゴマークをカーソルキーで移動させてピースを入れ替えます。右側の見本と見比べながらパズルを揃えてください。
90行の配列のデータを変えると、イラストが変わります。

10 '*15Puzzle15
20 CLV:CLS
30 '@PCG
40 A=#778:FOR C=1 TO 15:FOR B=0 TO 7
50 D=(B>3)*2:E=C&(1<0:F=C&(2<0
60 POKE A+C*8+B,(#70*E+#E*F)*(B%7>0)
70 NEXT:NEXT
80 '@SETPUZZLE
90 LET [0],8,12,14,4,10,9,11,7,13,9,9,5,13,13,3,16
100 FOR N=0 TO 15:[N+16]=[N]:NEXT:P=15
110 FOR I=1 TO 200
120 K=RND(4):GOSUB 270
130 LC 0,0:?I/2;"%":
140 NEXT:GOSUB 340
150 '@GAMELOOP
160 K=INKEY()-28:IF K<0 OR K>3 GOTO 150
170 GOSUB 300:IF !M GOTO 150
180 BEEP 20:GOSUB 270
190 S=S+1:GOSUB 340
200 G=0:FOR N=0 TO 15
210 IF[N]<>[N+16]G=1
220 NEXT
230 IF G GOTO 150
240 BEEP 9,5:WAIT 9:BEEP 9,5
250 ?"*Completed!*"
260 END
270 '@MOVE
280 GOSUB 300:IF M=0 THEN RETURN
290 [P]=[Q]:[Q]=16:P=Q:RETURN
300 '@CHK
310 Q=P-(K=0)*(P%4>0)+(K=1)*(P%4<3)-4*(K=2)*(P/4>0)+4*(K=3)*(P/4<3)
320 IF Q=P THEN M=0 ELSE M=1
330 RETURN
340 '@PRTPUZZLE
350 CLS:FOR J=0 TO 3
360 FOR I=0 TO 3
370 Z=I+J*4:N=[Z]:?CHR$(#EF+N);
380 NEXT:?" ";
390 FOR I=0 TO 3
400 Z=I+J*4:N=[Z+16]:?CHR$(#EF+N);
410 NEXT:?
420 NEXT
430 ?:?"STEP=";S
440 RETURN

15Puzzle64

15パズルのイラスト版を、Ichigo64環境(IchigoJam+IchigoDot)用に移植しました。

  • 実行するとタイトル画面の後、パズルのシャッフル進行状況がドットで表示され、バラバラになったパズルが表示されます。
  • ボタンを長押しすると、空白ピースの隣接ピースが上・右・下・左の時計回りの順に点滅します。希望するピースでボタンを離すと、空白ピースとそのピースが入れ替わります。
  • 15枚のパズルが揃うと、イチゴイラストが完成します。ボタンを押すと、終了までにかかったステップ数がドットで表示されます(64ステップまで)。ボタンを離すとリプレイします。

1 '15Puzzle64
2 IFBTN()GOTO2
3 WAIT60:UART1:CLS:?
4 CLV:?"MATLED SHOW 805F20003755BD60":PLAY"R8L8CGECG":WAIT99:GSB29:W=60:SRNDANA(2)+TICK()
5 LET[0],8,12,11,11,10,9,9,11,14,13,9,5,2,7,3,0:FORN=0TO15:[N+16]=[N]:NEXT:P=15
6 FORI=0TO127:K=RND(4):GSB25:IFI%2GSB32
7 NEXT:GSB29:BEEP
8 IF!BTN()GOTO8
9 K=0
10 GSB27:IF!MGOTO17
11 R=[Q]:[Q]=0:GSB29:CLT
12 IF!BTN()GOTO18
13 IFTICK()<30GOTO12
14 [Q]=R:GSB29:CLT
15 IF!BTN()GOTO18
16 IFTICK()<30GOTO15
17 K=(K+1)*(K<3):GOTO10
18 BEEP:[Q]=R:GSB25:S=S+(S<64):GSB29
19 G=0:FORN=0TO15:IF[N]<>[N+16]G=1
20 NEXT:IFGGOTO8
21 BEEP9,30
22 IF!BTN()GOTO22
23 U=0:V=0:FORI=1TOS:GSB32:NEXT
24 IFBTN()GOTO24 ELSEGOTO4
25 GSB27:IFM=0RTN
26 [P]=[Q]:[Q]=0:P=Q:RTN
27 M=1:Q=P-(K=0)*(P%4>0)+(K=2)*(P%4<3)-4*(K=3)*(P/4>0)+4*(K=1)*(P/4<3):IFQ=PM=0
28 RTN
29 ?"MATLED SHOW ";:FORY=0TO7STEP2:D=0:E=0:FORL=0TO3:C=[Y*2+L]:D=D+)((C&3)<<(L*2))(:E=E+)((C/4)<<(L*2))(:NEXT:IFD<16?0;
30 ?HEX$(D);:IFE<16?0;
31 ?HEX$(E);:NEXT:?:RTN
32 U=U+1:W=(U-1)/8:V=V|(1<