home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib34a.dsk
/
JULY.1988
/
PYRAMID.bas
< prev
next >
Wrap
BASIC Source File
|
2023-02-26
|
12KB
|
201 lines
10 REM **********************
20 REM * PYRAMID *
30 REM * BY JIM LAZAR *
40 REM * COPYRIGHT (C) 1988 *
50 REM * MICROSPARC, INC. *
60 REM * CONCORD, MA 01742 *
70 REM **********************
80 DIM D%(52),H%(52),T%(52),P%(8,8),U%(9),CN$(13)
90 PRINT CHR$(21): TEXT : HOME : PRINT "THE PYRAMID": PRINT : IF PEEK(104) = 64 THEN 110
100 PRINT "RELOADING PROGRAM": POKE 104,64: POKE 16384,0: PRINT CHR$(4)"RUN PYRAMID": PRINT
110 ONERR GOTO 1930
120 FL$ = "PYRAMID.ML": PRINT CHR$(4)"BLOAD "FL$:FL$ = "PYRAMID.SHAPES": PRINT CHR$(4)"BLOAD "FL$
130 HOME : INVERSE : FOR A = 1 TO 9: HTAB 21 -A: PRINT SPC( A +A -1)"": POKE 2060,1: POKE 2061,255 -A *2: CALL 2062: NEXT
140 VTAB 5: HTAB 19: PRINT "THE": VTAB 7: HTAB 17: PRINT "PYRAMID"
150 NORMAL : PRINT
160 VTAB 13: HTAB 14: PRINT "BY JIM LAZAR": HTAB 12: PRINT "COPYRIGHT (C) 1988": HTAB 13: PRINT "MICROSPARC, INC."
170 REM ** SET UP CARD DECK AND RANDONIZE **
180 C = 1: FOR A = 1 TO 13: FOR B = 1 TO 4:D%(C) = B *16 +A:C = C +1: NEXT : NEXT
190 VTAB 21: PRINT "USE JOYSTICK OR KEYBOARD? (J OR K) ";
200 INVERSE : PRINT " " CHR$(8);: NORMAL : FOR A = 1 TO 3:B = D%( RND(1) *52 +1)
210 D%( RND(0) *52 +1) = D%( RND(1) *52 +1):D%( RND(0) *52 +1) = B: NEXT
220 PRINT " " CHR$(8);: FOR A = 1 TO 3:B = D%( RND(1) *52 +1):D%( RND(0) *52 +1) = D%( RND(1) *52 +1):D%( RND(0) *52 +1) = B: NEXT
230 IF PEEK( -16384) <128 THEN 200
240 A = PEEK( -16384) -128: POKE -16368,0
250 A = A -32 *(A >95): IF A < >74 AND A < >75 THEN PRINT CHR$(7);: GOTO 200
260 JK = (A = 74): HOME
270 REM ** SHUFFLE CARDS **
280 HGR : CALL 2054: POKE 237,0: POKE 238,0: CALL 2057: POKE 237,4: POKE 238,0: CALL 2057: POKE 237,32: POKE 238,0: CALL 2057: POKE 237,36: POKE 238,0: CALL 2057
290 POKE 237,17: POKE 238,60: CALL 2051: FOR A = 1 TO 100:B = D%( RND(1) *52 +1):D%( RND(0) *52 +1) = D%( RND(1) *52 +1):D%( RND(0) *52 +1) = B: NEXT
300 HOME : VTAB 21: HTAB 12: PRINT "SHUFFLING CARDS"
310 FOR A = 1 TO 52: POKE 237,17: POKE 238,60 +(30 *( INT(A/2) = A/2)): CALL 2051
320 B = D%( RND(1) *52 +1):D%( RND(0) *52 +1) = D%( RND(1) *52 +1):D%( RND(0) *52 +1) = B
330 POKE 2060,1: POKE 2061,3: CALL 2062: NEXT : POKE 2060,1: POKE 2061,6: CALL 2062
340 FOR A = 90 TO 60 STEP -1: POKE 237,17: POKE 238,A: CALL 2051: NEXT
350 REM ** SHUFFLE MENU **
360 HOME : VTAB 21: PRINT "1. SHUFFLE CARDS AGAIN": PRINT "2. CUT AND DEAL CARDS": PRINT "3. DEAL CARDS": PRINT "ENTER 1,2, OR 3: ";:
370 GET A$: IF A$ <"1" OR A$ >"3" THEN PRINT CHR$(7);: GOTO 370
380 A = VAL(A$): HOME : ON A GOTO 390,400,600
390 FOR A = 60 TO 90 STEP 5: POKE 237,17: POKE 238,A: CALL 2051: POKE 237,17: POKE 238,60: CALL 2051: NEXT : GOTO 300
400 FOR A = 17 TO 5 STEP -1: POKE 237,A: POKE 238,60: CALL 2051: POKE 237,A +4: POKE 238,60: CALL 2057: NEXT
410 FOR A = 60 TO 120 STEP 5: POKE 237,5: POKE 238,A: CALL 2051: POKE 237,5: POKE 238,A -40: CALL 2057: NEXT
420 FOR A = 5 TO 31: POKE 237,A: POKE 238,120: CALL 2051: POKE 49200,0: NEXT
430 P = 1: HOME : VTAB 23: PRINT "POSITION POINTER (WITH ARROW KEYS) WHERE";: PRINT "CARDS SHOULD BE CUT AND PRESS RETURN";
440 VTAB 21: HTAB P +6: PRINT "^";: POKE -16368,0: POKE 2060,1: POKE 2061,220 +P: CALL 2062
450 IF PEEK( -16384) <128 THEN 450
460 B = PEEK( -16384) -128: POKE -16368,0: IF B = 13 THEN 500
470 IF B = 8 AND P >1 THEN PRINT CHR$(8)" ":P = P -1: GOTO 440
480 IF B = 21 AND P <26 THEN PRINT CHR$(8)" ":P = P +1: GOTO 440
490 PRINT CHR$(7);: GOTO 440
500 HOME :A = P *2:B = 1: FOR C = A TO 52:H%(B) = D%(C):B = B +1: NEXT : FOR C = 1 TO A -1:H%(B) = D%(C):B = B +1: NEXT
510 FOR A = 1 TO 52:D%(A) = H%(A): NEXT
520 FOR A = 31 TO P +5 STEP -1: POKE 237,A: POKE 238,120: CALL 2051: POKE 237,A +4: POKE 238,120: CALL 2057: POKE 49200,0: NEXT
530 FOR A = 110 TO 60 STEP -5: POKE 237,P +5: POKE 238,A +40: CALL 2057: POKE 237,P +4: POKE 238,120: CALL 2051: POKE 237,P +5: POKE 238,A: CALL 2051: NEXT
540 A = ( -1 *(P +5 >17)) +(P +5 <17): IF P +5 = 17 THEN 560
550 FOR B = P +5 TO 17 STEP A: POKE 237,B: POKE 238,60: CALL 2051: POKE 237,B +4: POKE 238,60: CALL 2057: POKE 237,B -4: POKE 238,60: CALL 2057: NEXT
560 FOR A = P +4 TO 5 STEP -1: POKE 237,A: POKE 238,120: CALL 2051: POKE 237,A +4: POKE 238,120: CALL 2057: POKE 49200,0: NEXT
570 FOR A = 5 TO 17: POKE 237,A: POKE 238,120: CALL 2051: POKE 237,A -4: POKE 238,120: CALL 2057: NEXT
580 FOR A = 110 TO 60 STEP -5: POKE 237,17: POKE 238,A: CALL 2051: POKE 237,17: POKE 238,A +40: CALL 2057: NEXT
590 REM ** BUILD PYRAMID **
600 FOR A = 17 TO 1 STEP -1: POKE 237,A: POKE 238,60: CALL 2051: POKE 237,A +4: POKE 238,60: CALL 2057: NEXT
610 FOR A = 60 TO 20 STEP -5: POKE 237,1: POKE 238,A: CALL 2051: POKE 237,1: POKE 238,A +40: CALL 2057: NEXT
620 CALL 2054: POKE 237,1: POKE 238,20: CALL 2051: HOME : VTAB 22: HTAB 12: PRINT "BUILDING PYRAMID":P = 52
630 FOR A = 1 TO 7: FOR B = 1 TO A:P%(B,A) = D%(P):P = P -1
640 POKE 237,1: POKE 238,20: CALL 2057: POKE 237,1: POKE 238,20: CALL 2051
650 POKE 237,21 -A *3 +(B -1) *6: POKE 238,5 +A *15: POKE 239,P%(B,A): CALL 2048: POKE 2060,1: POKE 2061,4: CALL 2062: NEXT : NEXT
660 POKE 237,1: POKE 238,20: POKE 239,D%(P): CALL 2048: FOR A = 1 TO 9: READ U%(A): NEXT
670 FOR A = 1 TO 13: READ CN$(A): NEXT
680 DATA 1,0,17,27,37,47,57,67,77
690 DATA "N ACE"," TWO"," THREE"," FOUR"," FIVE"," SIX"," SEVEN","N EIGHT"," NINE"," TEN"," JACK"," QUEEN"," KING"
700 CU = 1:TA = 0
710 REM ** PRINT SLECTION INSTRUCTIONS **
720 HOME : VTAB 21: PRINT "ARROW KEYS - MOVE CURSOR";: IF JK THEN HTAB 28: PRINT "(JOYSTICK)";
730 PRINT : PRINT "RETURN - MATCH CARD";: IF JK THEN HTAB 28: PRINT "(BUTTON 0)";
740 PRINT : IF P >1 THEN PRINT "N - NEXT CARD FROM HAND";: IF JK THEN HTAB 28: PRINT "(BUTTON 1)";
750 PRINT : PRINT "ESC - GIVE UP ";
760 REM ** SELECTION MODE **
770 POKE -16368,0: IF CU = 1 THEN X = 1:Y = 20:C = D%(P): GOTO 800
780 IF CU = 2 THEN X = 35:Y = 20:C = T%(TA): GOTO 800
790 B = INT(U%(CU)/10):A = U%(CU) -B *10:X = 21 -A *3 +(B -1) *6:Y = 5 +A *15:C = P%(B,A)
800 POKE 237,X: POKE 238,Y: CALL 2057: FOR D = 1 TO 15: NEXT : POKE 237,X: POKE 238,Y: POKE 239,C: CALL 2048: FOR D = 1 TO 15: NEXT
810 IF NOT JK THEN 860
820 IF PEEK( -16287) >127 THEN 1170
830 IF PEEK( -16286) >127 THEN 1090
840 IF PDL(0) <75 THEN 1060
850 IF PDL(0) >180 THEN 1020
860 IF PEEK( -16384) <128 THEN 800
870 K = PEEK( -16384) -128: POKE -16368,0
880 IF K = 13 THEN 1170
890 IF K = 78 OR K = 110 THEN 1090
900 IF K = 8 THEN 1060
910 IF K = 21 THEN 1020
920 IF K < >27 THEN PRINT CHR$(7);: GOTO 800
930 REM ** GIVE UP? **
940 HOME : VTAB 21: PRINT "1. WHOOPS! BACK TO GAME": PRINT "2. NEW GAME": PRINT "3. QUIT": PRINT "ENTER 1,2, OR 3: ";:
950 GET A$: IF A$ <"1" OR A$ >"3" THEN PRINT CHR$(7);: GOTO 950
960 A = VAL(A$): ON A GOTO 720,970,980
970 RUN
980 HOME : VTAB 23: PRINT "ARE YOU SURE YOU WANT TO QUIT (Y/N) ? ";: GET A$: IF A$ < >"Y" AND A$ < >"N" AND A$ < >"y" AND A$ < >"n" THEN 980
990 IF A$ = "Y" OR A$ = "y" THEN TEXT : HOME : VTAB 23: END
1000 GOTO 720
1010 REM ** CURSOR RIGHT **
1020 CU = CU +1: IF CU >9 THEN CU = 1
1030 IF U%(CU) = 0 THEN 1020
1040 GOTO 770
1050 REM ** CURSOR LEFT **
1060 CU = CU -1: IF CU <1 THEN CU = 9
1070 IF U%(CU) = 0 THEN 1060
1080 GOTO 770
1090 IF P >1 THEN 1130
1100 REM ** TURN UP NEXT CARD FROM HAND **
1110 HOME : VTAB 21: PRINT CHR$(7)"END OF HAND HAS BEEN REACHED"
1120 GOSUB 1990: GOTO 720
1130 TA = TA +1:T%(TA) = D%(P):U%(2) = 1: POKE 237,1: POKE 238,20: CALL 2051: POKE 237,35: POKE 238,20: POKE 239,T%(TA): CALL 2048
1140 P = P -1: POKE 237,1: POKE 238,20: POKE 239,D%(P): CALL 2048: POKE 2060,1: POKE 2061,4: CALL 2062
1150 GOTO 720
1160 REM ** MAKE FIRST CARD SELECTION **
1170 A = INT(C/16):C1 = C -A *16
1180 S1 = U%(CU):U%(CU) = 0:S2 = CU
1190 IF C1 = 13 THEN 1570
1200 REM ** SECOND CARD SELECTION MODE **
1210 HOME : VTAB 21: PRINT "POSITION CURSOR OVER CARD TO MATCH WITH": PRINT "A"CN$(C1)" AND PRESS RETURN";: IF JK THEN HTAB 28: PRINT "(BUTTON 0)";
1220 PRINT : PRINT "SPACE - ABORT SELECTION ";: IF JK THEN HTAB 28: PRINT "(BUTTON 1)";
1230 CU = CU +1: IF CU >9 THEN CU = 1
1240 IF U%(CU) = 0 THEN 1230
1250 POKE -16368,0: IF CU = 1 THEN X = 1:Y = 20:C = D%(P): GOTO 1280
1260 IF CU = 2 THEN X = 35:Y = 20:C = T%(TA): GOTO 1280
1270 B = INT(U%(CU)/10):A = U%(CU) -B *10:X = 21 -A *3 +(B -1) *6:Y = 5 +A *15:C = P%(B,A)
1280 POKE 237,X: POKE 238,Y: CALL 2057: FOR D = 1 TO 15: NEXT : POKE 237,X: POKE 238,Y: POKE 239,C: CALL 2048: FOR D = 1 TO 15: NEXT
1290 IF NOT JK THEN 1340
1300 IF PEEK( -16287) >127 THEN 1510
1310 IF PEEK( -16286) >127 THEN 1410
1320 IF PDL(0) <75 THEN 1470
1330 IF PDL(0) >180 THEN 1430
1340 IF PEEK( -16384) <128 THEN 1280
1350 K = PEEK( -16384) -128: POKE -16368,0
1360 IF K = 13 THEN 1510
1370 IF K = 8 THEN 1470
1380 IF K = 21 THEN 1430
1390 IF K < >32 THEN PRINT CHR$(7);: GOTO 1280
1400 REM ** ABORT SECOND SELECTION **
1410 CU = S2:U%(CU) = S1: GOTO 720
1420 REM ** CURSOR RIGHT **
1430 CU = CU +1: IF CU >9 THEN CU = 1
1440 IF U%(CU) = 0 THEN 1430
1450 GOTO 1250
1460 REM ** CURSOR LEFT **
1470 CU = CU -1: IF CU <1 THEN CU = 9
1480 IF U%(CU) = 0 THEN 1470
1490 GOTO 1250
1500 REM ** CHECK FOR LEGAL MATCH **
1510 A = INT(C/16):C2 = C -A *16
1520 IF C1 +C2 = 13 THEN 1600
1530 REM ** NO MATCH! **
1540 HOME : VTAB 21: PRINT CHR$(7) CHR$(7)"A"CN$(C1)" AND A"CN$(C2)" DOES NOT MATCH!": PRINT "("C1" + "C2" <> 13)"
1550 GOSUB 1990: GOTO 1410
1560 REM ** HANDLE KING REMOVAL **
1570 HOME : VTAB 21: PRINT "A KING TOTALS 13 BY ITSELF": PRINT : PRINT "REMOVING CARD..."
1580 GOTO 1620
1590 REM ** HANDLE TWO CARD REMOVAL **
1600 HOME : VTAB 21: PRINT "A"CN$(C1)" AND A"CN$(C2)" DO MATCH!": PRINT : PRINT "REMOVING CARDS..."
1610 ON CU GOSUB 1830,1870: IF CU >2 THEN GOSUB 1910
1620 ON S2 GOSUB 1830,1870: IF S2 >2 THEN CU = S2:U%(CU) = S1: GOSUB 1910
1630 FOR A = 1 TO 7: FOR B = 1 TO A: IF P%(B,A) >0 THEN POKE 237,21 -A *3 +(B -1) *6: POKE 238,5 +A *15: POKE 239,P%(B,A): CALL 2048
1640 NEXT : NEXT
1650 REM ** CHECK TO SEE WHICH CARDS ARE NOW AVAILABLE FOR MATCHING **
1660 U%(1) = (P >0):U%(2) = (TA >0): FOR A = 3 TO 9:U%(A) = 0: NEXT :A = 3
1670 FOR Y = 1 TO 7: FOR X = 1 TO Y: IF P%(X,Y) < >0 AND P%(X,Y +1) = 0 AND P%(X +1,Y +1) = 0 THEN U%(A) = X *10 +Y:A = A +1
1680 NEXT : NEXT
1690 CU = 0
1700 CU = CU +1: IF CU >9 THEN CU = 1
1710 IF U%(CU) = 0 THEN 1700
1720 IF P%(1,1) = 0 THEN 1750
1730 GOTO 720
1740 REM ** PYRAMID GONE **
1750 HOME : VTAB 21: PRINT "YOU HAVE REMOVED THE LAST CARD OF THE": PRINT "PYRAMID. CONGRATULATIONS!"
1760 FOR A = 1 TO 4: READ B,C: POKE 2060,B: POKE 2061,C: CALL 2062: FOR D = 1 TO 20: NEXT : NEXT : DATA 6,55,6,55,6,55,100,5
1770 GOSUB 1990
1780 HOME : VTAB 21: PRINT "1. NEW GAME": PRINT "2. QUIT": PRINT "ENTER 1 OR 2 ";:
1790 GET A$: IF A$ <"1" OR A$ >"2" THEN PRINT CHR$(7);: GOTO 1790
1800 IF A$ = "1" THEN RUN
1810 TEXT : HOME : VTAB 23: END
1820 REM ** REMOVE CARD FROM HAND **
1830 POKE 2060,1: POKE 2061,4: CALL 2062: POKE 237,1: POKE 238,20: IF P = 1 THEN CALL 2057:P = 0: RETURN
1840 CALL 2051:P = P -1
1850 POKE 237,1: POKE 238,20: POKE 239,D%(P): CALL 2048: RETURN
1860 REM ** REMOVE CARD FROM TALON **
1870 POKE 2060,1: POKE 2061,4: CALL 2062: POKE 237,35: POKE 238,20: IF TA = 1 THEN CALL 2057:TA = 0: RETURN
1880 CALL 2051:TA = TA -1
1890 POKE 237,35: POKE 238,20: POKE 239,T%(TA): CALL 2048: RETURN
1900 REM ** REMOVE CARD FROM PYRAMID **
1910 B = INT(U%(CU)/10):A = U%(CU) -B *10:X = 21 -A *3 +(B -1) *6:Y = 5 +A *15:P%(B,A) = 0
1920 POKE 237,X: POKE 238,Y: CALL 2057: POKE 2060,1: POKE 2061,4: CALL 2062: RETURN
1930 IF PEEK(222) = 6 OR PEEK(222) = 7 THEN 1960
1940 IF PEEK(222) = >254 THEN RESUME
1950 POKE 216,0: RESUME
1960 PRINT : PRINT CHR$(7)"PLEASE INSERT THE DISK WITH "FL$: PRINT "ON IT AND PRESS RETURN": PRINT
1970 POKE -16368,0: WAIT -16384,128: IF PEEK( -16384) < >141 THEN 1970
1980 GOTO 120
1990 PRINT : PRINT "PRESS RETURN TO CONTINUE";
2000 POKE -16368,0: WAIT -16384,128: IF PEEK( -16384) < >141 THEN 2000
2010 PRINT : RETURN