jsbasic/samples/sample.puzzler.txt

91 lines
4.9 KiB
Plaintext
Raw Normal View History

0 PR#0
10 DEF FN R(X) = INT ( RND (1) * X) + 1: DEF FN M4(Y) = Y - INT (Y / 4) * 4: DIM NU(16)
15 R$ = "4567RTYUFGHJVBNM":P$ = "ABCD..........N...IJK.L..PO...E.FHM..G"
20 POKE - 16368,0
30 TEXT : HOME : VTAB 4: HTAB 14: PRINT "THE PUZZLER"
40 VTAB 15: HTAB 12: PRINT "by Gregg Buntin"
50 FOR I = 1 TO 2000: NEXT I
60 VTAB 20: PRINT "Do you wish instructions";: INPUT I$
70 IF LEFT$ (I$,1) < > "Y" THEN 190
80 HOME : VTAB 2: HTAB 14: PRINT "THE PUZZLER"
90 VTAB 4: PRINT "The object of this game is to get all ofthe numbers in order from 1 to 15."
100 PRINT : PRINT "The basic command keys are:";: HTAB 36: INVERSE : PRINT "A": NORMAL : HTAB 36: PRINT ":": HTAB 36: PRINT ":"
110 HTAB 33: INVERSE : PRINT "<-";: NORMAL : PRINT " + ";: INVERSE : PRINT "->";: NORMAL : PRINT
120 PRINT "By means of these keys you" TAB( 36) ":": PRINT "will exchange the blank" TAB( 36) ":"
130 PRINT "space with the number in the";: INVERSE : HTAB 36: PRINT "Z": NORMAL
140 PRINT "up,down,left or right positions."
145 PRINT : PRINT : PRINT "Alternatively, use the [mouse] and [END]key, or any highlighted key in the"
148 PRINT "displayed diagram, to move up to ALL thetiles in a row or column at once!"
150 VTAB 24: PRINT SPC( 7)"Press <ESC> to start game";
160 K = PEEK ( - 16384): IF K < > 155 THEN 160
190 POKE - 16368,0: HOME : VTAB 4: HTAB 14: PRINT "THE PUZZLER": VTAB 12
200 PRINT "Type N to start a (N)EW GAME"
220 K = PEEK ( - 16384): IF K = 155 GOTO 480
230 ON K < > 206 GOTO 220: POKE - 16368,0
260 HOME : PRINT "SCRAMBLING PUZZLE.............."
262 I = RND ( - PEEK (79) * 999 - PEEK (78)): REM RANDOM SEED
265 FOR I = 1 TO 16:NU(I) = I: NEXT
270 FOR I = 1 TO 40:Q = FN R(15)
280 K = FN R(14):K = (K > = Q) + K
290 X = NU(Q):NU(Q) = NU(K):NU(K) = X: NEXT
292 A = FN R(16):Y = 16: X = 4: ON A < 13 GOSUB 580
295 X = 1: ON A < Y GOSUB 580
300 TEXT : HOME : GR : COLOR= 12
310 FOR I = 0 TO 18: Q = 38 - I: HLIN I,Q AT I: HLIN I,Q AT Q
320 VLIN I,Q AT I: VLIN I,Q AT Q: NEXT : PLOT 19,19
330 COLOR= 1: FOR I = 9 TO 29 STEP 10: HLIN 0,38 AT I: VLIN 0,38 AT I: NEXT
350 FOR PL = 1 TO 16: GOSUB 380: REM DISPLAY WHOLE GRID
360 NEXT :PL = A: PRINT "At any time,": PRINT "press <ESC>": PRINT "to exit.": GOTO 440
365 REM 370-430, 840-930 - ROUTINE TO DISPLAY NUMBERS
370 COLOR= 12: GOTO 390
380 COLOR= 2
390 IF NU(PL) = 16 THEN RETURN
400 Q = PL - 1: GOSUB 600
410 Q = NU(PL) > 9: ON Q GOSUB 870
420 X = Q * 2 + X + 2
430 Q = NU(PL) - Q * 10: ON Q + 1 GOTO 840,870,880,850,890,900,910,920,840,930
435 REM DISPLAY ACTIVE-KEY GRID
440 VTAB 21: GOSUB 825: I = I + 1: FOR Y = 0 TO 3: IF Y THEN PRINT
450 HTAB 17: FOR X = 1 TO 4: K = (X = I) + (Y = Q): IF K THEN INVERSE
460 PRINT MID$ (R$,Y * 4 + X,K < 2);: NORMAL : PRINT TAB( X * 2 + 17): NEXT : NEXT
465 REM GET KEY, MOVE TILE TO EMPTY SPACE
470 K = ( PEEK (49250) > 127) * 301 + PEEK ( - 16384): IF K < 128 THEN 470
480 POKE - 16368,0
490 IF K = 155 THEN TEXT : HOME : PRINT "BYE-BYE": END
500 IF K > 300 GOTO 610: REM "BUTTON" ([END] KEY) PRESSED
510 IF K > 179 AND K < 218 THEN Q = ASC ( MID$ (P$,K - 179,1)) - 65: IF Q > = O THEN GOSUB 600: GOTO 630
520 K = INT ((K = 193 OR K = 218 OR K = 136 OR K = 149) * K / 7)
530 IF NOT K GOTO 470
540 I = K < 22:A = (K - 29) * 2
550 IF K < 20 = FN M4(PL) AND I OR (A + 8.5 - PL) * A * NOT I < 0 GOTO 470
560 IF I THEN A = K - 20
570 GOSUB 770: GOTO 810
580 FOR Y = Y TO A + X STEP -X:NU(Y) = NU(Y - X): NEXT : NU(Y) = 16: RETURN
600 GOSUB 830:X = I * 10 + 1:Y = Q * 10 + 2: RETURN
605 REM HANDLE "JOYSTICK" (MOUSE) AND MULTIPLE TILES
606 REM INTERPRET TRUE MOUSE POSITION (PC) BASED ON ITS CURSOR
610 X = PDL (0) / 6.4: Y = PDL(1) * .1875: K = SCRN (X,Y)
620 IF K < > 2 AND K < > 12 OR Y > 38 GOTO 470
630 GOSUB 825: X = INT (X / 10) - I
640 Y = INT (Y / 10) - Q
650 IF NOT X = NOT Y GOTO 470
660 A = SGN(Y) * 4 + SGN (X): FOR K = 1 TO ABS (X + Y): GOSUB 770: NEXT
670 ON PEEK (49250) > 127 GOTO 670: GOTO 810
770 PL = PL + A: GOSUB 370
780 NU(PL - A) = NU(PL):NU(PL) = 16:PL = PL - A
790 GOSUB 380:PL = PL + A: RETURN
800 REM TEST FOR SOLVED PUZZLE
810 Q = 0: FOR I = 1 TO 16: Q = NU(I) < > I OR Q: NEXT : IF Q GOTO 440
820 HOME : PRINT "CONGRATULATIONS!": PRINT : GOTO 200
825 Q = PL - 1
830 I = FN M4(Q):Q = INT (Q / 4): RETURN
840 VLIN Y,Y + 4 AT X
850 IF Q THEN PLOT X + 1,Y + 2
860 HLIN X,X + 1 AT Y: HLIN X,X + 2 AT Y + 5: VLIN Y,Y + 4 AT X + 2: RETURN
870 VLIN Y,Y + 5 AT X + 1: PLOT X,Y + 1: HLIN X,X + 2 AT Y + 5: RETURN
880 HLIN X,X + 2 AT Y: VLIN Y,Y + 2 AT X + 2: PLOT X + 1,Y + 2: VLIN Y + 3,Y + 5 AT X: HLIN X,X + 2 AT Y + 5: RETURN
890 VLIN Y,Y + 5 AT X + 2: VLIN Y,Y + 3 AT X: PLOT X + 1,Y + 3: RETURN
900 HLIN X,X + 2 AT Y: VLIN Y,Y + 2 AT X: PLOT X + 1,Y + 2: VLIN Y + 3,Y + 4 AT X + 2: HLIN X,X + 1 AT Y + 5: RETURN
910 VLIN Y + 1,Y + 5 AT X: HLIN X + 1,X + 2 AT Y: VLIN Y + 2,Y + 5 AT X + 2: PLOT X + 1,Y + 2: PLOT X + 1,Y + 5: RETURN
920 HLIN X,X + 2 AT Y: VLIN Y,Y + 5 AT X + 2: RETURN
930 VLIN Y,Y + 5 AT X + 2: VLIN Y,Y + 2 AT X: PLOT X + 1,Y: PLOT X + 1,Y + 2: HLIN X,X + 1 AT Y + 5: RETURN