115 lines
3.1 KiB
Text
115 lines
3.1 KiB
Text
10 REM 15-PUZZLE GAME
|
|
20 REM COMMODORE BASIC 2.0
|
|
30 REM ********************************
|
|
40 GOSUB 400 : REM INTRO AND LEVEL
|
|
50 GOSUB 510 : REM SETUP BOARD
|
|
60 GOSUB 210 : REM PRINT PUZZLE
|
|
70 PRINT "TO MOVE A PIECE, ENTER ITS NUMBER:"
|
|
80 INPUT X
|
|
90 GOSUB 760 : REM CHECK IF MOVE IS VALID
|
|
100 IF MV=0 THEN PRINT "WRONG MOVE" : GOSUB 1130 : GOTO 60
|
|
110 D(Z)=X : D(Y)=0
|
|
120 GOSUB 210 : REM PRINT PUZZLE
|
|
130 GOSUB 1030: REM CHECK IF PUZZLE COMPLETE
|
|
140 IF PC THEN 160
|
|
150 GOTO 70
|
|
160 PRINT"YOU WON!"
|
|
170 END
|
|
180 REM
|
|
190 REM *******************************
|
|
200 REM PRINT/DRAW THE PUZZLE
|
|
210 FOR P=1 TO 16
|
|
220 IF D(P)=0 THEN D$(P)=" " : GOTO 260
|
|
230 S$=STR$(D(P))
|
|
240 N=LEN(S$)
|
|
250 D$(P) = LEFT$(" ",3-N)+S$+" "
|
|
260 NEXT
|
|
270 PRINT "+-----+-----+-----+-----+"
|
|
280 PRINT "!"D$(1)"!"D$(2)"!"D$(3)"!"D$(4)"!"
|
|
290 PRINT "+-----+-----+-----+-----+"
|
|
300 PRINT "!"D$(5)"!"D$(6)"!"D$(7)"!"D$(8)"!"
|
|
310 PRINT "+-----+-----+-----+-----+"
|
|
320 PRINT "!"D$(9)"!"D$(10)"!"D$(11)"!"D$(12)"!"
|
|
330 PRINT "+-----+-----+-----+-----+"
|
|
340 PRINT "!"D$(13)"!"D$(14)"!"D$(15)"!"D$(16)"!"
|
|
350 PRINT "+-----+-----+-----+-----+"
|
|
360 RETURN
|
|
370 REM
|
|
380 REM *******************************
|
|
390 REM INTRO AND LEVEL OF DIFFICULTY
|
|
400 PRINT CHR$(147)
|
|
410 DIM SH(3) : SH(1)=10 : SH(2)=50 : SH(3)=100
|
|
420 PRINT "15 PUZZLE GAME FOR COMMODORE BASIC 2.0" : PRINT : PRINT
|
|
430 PRINT "PLEASE ENTER LEVEL OF DIFFICULTY,"
|
|
440 PRINT "1(EASY), 2(MEDIUM) OR 3(HARD):";
|
|
450 INPUT V
|
|
460 IF V<1 OR V>3 THEN 440
|
|
470 RETURN
|
|
480 REM
|
|
490 REM *******************************
|
|
500 REM BUILD THE BOARD
|
|
510 DIM D(16) : DIM D$(16) : REM BOARD PIECES
|
|
520 REM SET PIECES IN CORRECT ORDER FIRST
|
|
530 FOR P=1 TO 15
|
|
540 D(P) = P
|
|
550 NEXT
|
|
560 D(16) = 0 : REM 0 = EMPTY PIECE/SLOT
|
|
570 Z=16 : REM Z = EMPTY POSITION
|
|
580 PRINT: PRINT "SHUFFLING PIECES";
|
|
590 FOR N=1 TO SH(V)
|
|
600 PRINT".";
|
|
610 X = INT(RND(0)*4)+1
|
|
620 IF X=1 THEN R=Z-4
|
|
630 IF X=2 THEN R=Z+4
|
|
640 IF (X=3) AND (INT((Z-1)/4)<>(Z-1)/4) THEN R=Z-1
|
|
650 IF (X=4) AND (INT(Z/4)<>Z/4) THEN R=Z+1
|
|
660 IF R<1 OR R>16 THEN 610
|
|
670 D(Z)=D(R)
|
|
680 Z=R
|
|
690 D(Z)=0
|
|
700 NEXT
|
|
710 PRINT CHR$(147)
|
|
720 RETURN
|
|
730 REM
|
|
740 REM *******************************
|
|
750 REM CHECK IF MOVE IS VALID
|
|
760 MV = 0
|
|
770 IF X<1 OR X>15 THEN RETURN
|
|
780 REM FIND POSITION OF PIECE X AND OF EMPTY PIECE
|
|
790 AX=X
|
|
800 GOSUB 940 : REM FIND POSITION OF PIECE AX
|
|
810 Y=P
|
|
820 AX=0
|
|
830 GOSUB 940 : REM FIND POSITION OF PIECE AX
|
|
840 Z=P
|
|
850 REM CHECK IF EMPTY PIECE IS ABOVE, BELOW, LEFT OR RIGHT TO PIECE X
|
|
860 IF Y-4=Z THEN MV=1 : RETURN
|
|
870 IF Y+4=Z THEN MV=1 : RETURN
|
|
880 IF (Y-1=Z) AND (INT(Z/4)<>Z/4) THEN MV=1 : RETURN
|
|
890 IF (Y+1=Z) AND (INT(Y/4)<>Y/4) THEN MV=1 : RETURN
|
|
900 RETURN
|
|
910 REM
|
|
920 REM *******************************
|
|
930 REM FIND POSITION OF PIECE AX
|
|
940 P=1
|
|
950 IF D(P)=AX THEN 990
|
|
960 P=P+1
|
|
970 IF P>16 THEN PRINT "UH OH!" : STOP
|
|
980 GOTO 950
|
|
990 RETURN
|
|
1000 REM
|
|
1010 REM *******************************
|
|
1020 REM CHECK IF PUZZLE IS COMPLETE / GAME OVER
|
|
1030 PC = 0
|
|
1040 P=1
|
|
1050 IF (P>=16) OR (D(P)<>P) THEN 1080
|
|
1060 P=P+1
|
|
1070 GOTO 1050
|
|
1080 IF P=16 THEN PC=1
|
|
1090 RETURN
|
|
1100 REM
|
|
1110 REM ******************************
|
|
1120 REM A SMALL DELAY
|
|
1130 FOR T=0 TO 400
|
|
1140 NEXT
|
|
1150 RETURN
|