1 REM TINY BASIC PORT OF MAN1C PUZZLE, A 15-PUZZLE 2 REM (A.K.A MAGIC 15, GAME OF FIFTEEN, MYSTIC SQUARE) 3 REM 20-LINER BASIC GAME FOR THE SINCLAIR ZX SPECTRUM. 4 REM ***** BY MARCO VARESIO 2020 ***** 5 REM HTTPS://RETROBITS.ALTERVISTA.ORG 6 REM HTTPS://RETROBITS.ITCH.IO 10 REM VARIABLES: 11 REM Z: COLD START ADDRESS; TEMP 12 REM G: PEEK ROUTINE ADDRESS (SEE TICTACTOE BY T.PITTMAN) 14 REM P: POKE ROUTINE ADDRESS (SEE TICTACTOE BY T.PITTMAN) 16 REM M: GRID ROWS NUMBER 18 REM N: GRID COLS NUMBER 20 REM V: MOVES COUNT 22 REM X: MISSING TILE ROW 24 REM Y: MISSING TILE COL 26 REM K: MOVE (8: UP; 2: DOWN; 4: LEFT; 6: RIGHT) 28 REM T: TEMP; USED TO DETERMINE WHETHER GAME IS SOLVED 30 REM I,J: GRID ITERATORS 80 PRINT "**************************" 85 PRINT "* TINY MAN1C PUZZLE *" 90 PRINT "* MARCO'S RETROBITS 2020 *" 95 PRINT "**************************" 100 PRINT 110 PRINT "MOVES:" 120 PRINT " 8: UP" 130 PRINT " 2: DOWN" 140 PRINT " 4: LEFT" 150 PRINT " 6: RIGHT" 160 PRINT 200 PRINT "ENTER COLD START ADDRESS (DECIMAL)"; 210 INPUT Z 215 LET P=Z+24 217 LET G=Z+20 220 PRINT "ENTER ROWS NUMBER 3<=M<=5"; 230 INPUT M 240 IF M<3 THEN GO TO 220 250 IF M>5 THEN GO TO 220 260 PRINT "ENTER COLS NUMBER 3<=N<=5"; 270 INPUT N 280 IF N<3 THEN GO TO 260 290 IF N>5 THEN GO TO 260 300 PRINT "ENTER (MIN) SHUFFLING MOVES COUNT"; 310 INPUT S 320 PRINT 1000 REM **************************************** 1001 REM GAME START 1002 REM **************************************** 1010 REM INIT GRID 1020 LET I=0 1030 LET J=0 1040 LET T=USR(P,I*M+J,I*M+J+1) 1050 LET J=J+1 1060 IF J 0 THEN GO TO 1300 1260 GO TO 1180 1300 PRINT "100%" 1310 LET V = 0 1320 GO SUB 3000 1400 REM **************************************** 1401 REM GAME LOOP 1402 REM **************************************** 1410 PRINT "ENTER YOUR MOVE"; 1420 INPUT K 1430 IF K = 2 THEN GO TO 1500 1440 IF K = 4 THEN GO TO 1500 1450 IF K = 6 THEN GO TO 1500 1460 IF K = 8 THEN GO TO 1500 1470 PRINT "VALID MOVES ARE: 8 (UP), 2 (DOWN), 4 (LEFT), 6 (RIGHT)." 1480 GO TO 1400 1500 PRINT "MOVING..." 1510 GO SUB 4000 1520 GO SUB 3000 1530 PRINT "MOVES: ";V 1600 REM CHECK IF GAME IS SOLVED 1610 LET T=0 1620 LET I=0 1630 LET J=0 1640 IF USR(G, I*M+J) = I*M+J+1 THEN LET T = T + 1 1650 LET J=J+1 1660 IF J M*N-1 THEN GO TO 1400 1700 REM GAME SOLVED 1710 PRINT "CONGRATULATIONS! YOU SOLVED THE PUZZLE IN "; V; " MOVES!" 1720 PRINT "TYPE 0 TO EXIT, ANY OTHER NUMBER TO PLAY AGAIN" 1730 INPUT K 1740 IF K <> 0 THEN GO TO 1000 1750 PRINT "BYE BYE!" 1760 END 3000 REM **************************************** 3001 REM PRINT TILES GRID ROUTINE 3002 REM **************************************** 3010 LET I=0 3020 GO SUB 3500 3030 LET J=0 3040 PRINT "| "; 3050 IF USR(G,I*M+J)<10 THEN PRINT " "; 3055 IF USR(G,I*M+J)=0 THEN PRINT " "; 3060 IF USR(G,I*M+J)>0 THEN PRINT USR(G,I*M+J); " "; 3070 LET J=J+1 3080 IF J 4 THEN GO TO 4200 4120 IF Y = N-1 THEN GO TO 4200 4130 LET T=USR(G, X*M+Y+1) 4140 LET T=USR(P, X*M+Y, T) 4150 LET T=USR(P, X*M+Y+1, 0) 4160 LET Y=Y+1 4170 GO TO 4500 4200 REM CHECK RIGHT 4210 IF K <> 6 THEN GO TO 4300 4220 IF Y = 0 THEN GO TO 4300 4230 LET T=USR(G, X*M+Y-1) 4240 LET T=USR(P, X*M+Y, T) 4250 LET T=USR(P, X*M+Y-1, 0) 4260 LET Y=Y-1 4270 GO TO 4500 4300 REM CHECK DOWN 4310 IF K <> 2 THEN GO TO 4400 4320 IF X = 0 THEN GO TO 4400 4330 LET T=USR(G, (X-1)*M+Y) 4340 LET T=USR(P, X*M+Y, T) 4350 LET T=USR(P, (X-1)*M+Y, 0) 4360 LET X = X - 1 4370 GO TO 4500 4400 REM CHECK UP 4410 IF K <> 8 THEN GO TO 4600 4420 IF X = M-1 THEN GO TO 4600 4430 LET T=USR(G, (X+1)*M+Y) 4440 LET T=USR(P, X*M+Y, T) 4450 LET T=USR(P, (X+1)*M+Y, 0) 4460 LET X = X + 1 4500 REM VALID MOVE 4510 REM PRINT "VALID MOVE" 4520 LET V=V+1 4550 RETURN 4600 REM INVALID MOVE 4610 REM PRINT "INVALID MOVE" 4620 RETURN