2000 REM *****************
2010 REM ** SOLITAIRE **
2020 REM *****************
2025 REM COPYRIGHT JAN 1983, BOB FOWLER
2030
2040 MAP1 TAKEN(52),B,1
2050
2060 MAP1 DECK1'CARD(52)
2070 MAP2 DECK1'KIND,B,1
2080 MAP2 DECK1'SUIT,B,1
2090 MAP2 DECK1'COLOR,B,1
2100 MAP2 DECK1'CODE$,S,3
2110
2120 MAP1 DECK2'CARD(52)
2130 MAP2 DECK2'KIND,B,1
2140 MAP2 DECK2'SUIT,B,1
2150 MAP2 DECK2'COLOR,B,1
2160 MAP2 DECK2'CODE$,S,3
2170
2180 MAP1 STACK'CARD(10,19)
2190 MAP2 STACK'KIND,B,1
2200 MAP2 STACK'SUIT,B,1
2210 MAP2 STACK'COLOR,B,1
2220 MAP2 STACK'CODE$,S,3
2230 MAP1 IN'STACK(10),B,1
2240 MAP1 CARDS'DOWN(10),B,1
2250 MAP1 EMPTY'STACKS,B,1
2260
2270 MAP1 SUIT'STACK(4),B,1
2280
2290 MAP1 SUIT'CODE$(4),S,1
2300 MAP1 SUIT'CODES$,S,4,"HDCS" ! FIRST 2 SUITS WILL BE LOW CRT INTENSITY
2310 MAP1 KIND'CODE$(13),S,2
2320 MAP1 KIND'CODES$,S,26," A 2 3 4 5 6 7 8 910 J Q K"
2330
2340 REM ...... OTHER STRING DEFINITIONS
2350 MAP1 CARD'WIDTH,F,6,4
2360 MAP1 STACK'BASE'COLUMN,F,6,1
2370 MAP1 BLANK$,S,3," **"
2380 MAP1 COMD$,S,15
2390
2400 REM ...... MAPS RELATING TO HOW CARDS ARE DEALT
2410 MAP1 LC'USED$,S,1
2420 MAP1 FCARD1,B,1
2430 MAP1 LCARD2,B,1
2440 MAP1 LAST'LCARD2,B,1
2450 MAP1 LAST'LAST'LCARD2,B,1
2460
2470 REM ...... WIN/LOSS FILE OUTPUT MAPS
2480 MAP1 WINDATA
2490 MAP2 WIN$ ,S,1
2500 MAP2 NDECK ,B,1
2510 MAP2 NDOWN ,B,1
2520 MAP2 NUP ,B,1
2530 MAP2 NACES ,B,1
2540 MAP2 NSTACK2,B,1
2550 MAP1 FBLOX ,F,6,20 ! SIZE OF WIN/LOSS FILE IN BLOCKS
2560 MAP1 RECORDS,F,6
2570 MAP1 IMAGE1$,S,36," #### #### #### #### ####"
2580 MAP1 FNAME$,S,15,"SOLIT.DAT"
2590 MAP1 TITLE1$,S,55," ---- ---- ---- ---- ---- ---- ----"
2600 MAP1 TITLE2$,S,55," #### WIN DECK DOWN -UP- SUIT ACES"
2610
2620
2630
2640 !---------------------------!
2650 ! ONE-TIME INITIALIZATION !
2660 !---------------------------!
2670
2680 INITIALIZE:
2690 FOR I=1 TO 04 : SUIT'CODE$(I)=SUIT'CODES$[I,I] : NEXT I
2700 FOR I=1 TO 13 : KIND'CODE$(I)=KIND'CODES$[2*I-1;2] : NEXT I
2710 STACK'BASE=STACK'BASE'COLUMN - CARD'WIDTH
2720 ACE'BASE=STACK'BASE + 10*CARD'WIDTH
2730 NOTE'BASE=ACE'BASE+CARD'WIDTH
2740 SEVEN=7 ! CONTROLS # OF CARD COLUMNS IN GAME
2750 PRINT TAB(-1,0);
2760
2770
2780
2790 !------------------------------------!
2800 ! BEGINNING OF MAIN EXECUTION LOOP !
2810 !------------------------------------!
2820
2830 MAIN'LOOP:
2840 GOSUB OPEN'FILE
2850 CLOSE #1
2860 GAME=NEXT'GAME
2870 EMPTY'STACKS=0
2880 KINGS'WAITING=0
2890 FCARD1=1
2900 LCARD2=0
2910 FOR I=1 TO 4 : SUIT'STACK(I)=0 : NEXT I
2920 LC'USED$="N"
2930 LAST'LAST'LCARD2=54
2940 LAST'LCARD2=53
2950 START'TIME=TIME
2960
2970 REM ...... DISPLAY BEGINNING NOTES
2980 PRINT TAB(-1,0);
2990 PRINT TAB(-1,12);
3000 PRINT TAB(15,NOTE'BASE); TAB(-1,9);
3010 PRINT "--- WELCOME TO AM-100 SOLITAIRE ! ---";
3020 PRINT TAB(16,NOTE'BASE); TAB(-1,9);
3030 PRINT "SO FAR,"; RECORDS; "GAMES HAVE BEEN PLAYED !";
3040 REM ...... ENTER COMMAND
3050 PRINT TAB(17,NOTE'BASE); TAB(-1,9);
3060 PRINT "ENTER SPEED (SEC/MOVE) : 0.1";
3070 FOR I=1 TO 3 : PRINT CHR(8); : NEXT I
3080 COMD$="0.1"
3090 INPUT "" COMD$
3100 PRINT TAB(17,NOTE'BASE+25); TAB(-1,9);
3110 REM ...... CHECK FOR VARIOUS COMMANDS
3120 IF(INSTR(1,"END" ,COMD$)=1) THEN PRINT "END" ; : GOTO END
3130 IF(INSTR(1,"WINS",COMD$)=1) THEN PRINT "WINS"; : GOTO OUTPUT'WINS
3140 IF(INSTR(1,"GAME",COMD$)=1) THEN PRINT "GAME"; : GOTO SELECT'GAME
3150 IF(INSTR(1,"HOG" ,COMD$)=1) THEN PRINT "HOG" ; : GOSUB HOG : GOTO END
3160 RATE=VAL(COMD$)
3170 PRINT COMD$;
3180 GOTO BEGIN'GAME
3190
3200
3210
3220 !------------------------------!
3230 ! REPLAY GAME BY GAME NUMBER !
3240 !------------------------------!
3250
3260 SELECT'GAME:
3270 GOSUB OPEN'FILE
3280 CLOSE #1
3290 GAME=NEXT'GAME
3300 PRINT GAME;
3310 PRINT TAB(17,NOTE'BASE+30);
3320 INPUT "" GAME ! DEFAULTS TO NEXT GAME IN SEQUENCE
3330 PRINT TAB(17,NOTE'BASE+29); TAB(-1,9); GAME;
3340 DRAW=RND( SIN(GAME)-1 ) ! SEED FOR RANDOM # SEQUENCE IS SIN(I)-1
3350 RATE=0.1
3360 GOTO BEGIN'GAME
3370
3380
3390
3400 !-------------------------------------------!
3410 ! OUTPUT WIN/LOSS DATA FROM WIN/LOSS FILE !
3420 !-------------------------------------------!
3430
3440 OUTPUT'WINS:
3450 PRINT TAB(18,NOTE'BASE);
3460 INPUT LINE "ENTER DEVICE NAME : ", COMD$
3470 REM ...... CHECK FOR DEFAULT OUTPUT TO CRT
3480 IF(COMD$ <> "") THEN GOTO OPEN'PRINTER
3490 P=0
3500 PRINT #P, TAB(-1,0);
3510 GOTO CHECK'RECORDS
3520 OPEN'PRINTER:
3530 P=99
3540 OPEN #99, "TRM:"+COMD$, OUTPUT
3560 CHECK'RECORDS:
3570 GOSUB OPEN'FILE
3580 IF(RECORDS=0) THEN ? #P, " ["; FNAME$; " EMPTY]" : GOTO END'PRINT
3590 WINS=0
3600 LOSSES=0
3610 REM ...... OUTPUT LOOP
3620 FOR REC1=1 TO RECORDS
3630 REM ...... CHECK FOR NEW PAGE
3640 IF( (REC1-1)/50 <> INT( (REC1-1)/50 ) ) THEN GOTO CHECK'SUB'PAGE
3645 PRINT #P, CHR(12);
3650 PRINT #P, TITLE1$
3660 PRINT #P, TITLE2$
3670 PRINT #P, TITLE1$
3680 CHECK'SUB'PAGE:
3690 IF( (REC1-1)/10 = INT( (REC1-1)/10 ) ) THEN PRINT #P
3700 READ #1, WINDATA
3710 PRINT #P, USING " #####", REC1;
3720 IF(WIN$="W") THEN PRINT #P, " WIN"; ELSE PRINT #P, " LOSE";
3730 IF(WIN$="W") THEN WINS=WINS+1 ELSE LOSSES=LOSSES+1
3740 PRINT #P, USING IMAGE1$, NDECK, NDOWN, NUP, NSTACK2, NACES
3750 NEXT REC1
3760
3770 REM ...... FINAL COMMENTS
3780 PRINT #P
3790 PRINT #P, TAB(21); STR$(WINS); " WINS , "; STR$(LOSSES); " LOSSES"
3800 IF(P=99) THEN CLOSE #P
3810 END'PRINT:
3820 CLOSE #1
3830
3840 END'DATA:
3850 PRINT
3860 COMD$="Y"
3870 PRINT
3880 PRINT " GO ON TO NEXT GAME ? ('Y' OR 'N' OR DEFAULT 'Y') : ";
3890 INPUT "" COMD$
3900 IF(COMD$="Y") THEN GOTO MAIN'LOOP ELSE GOTO END
3910
3920
3930
3940 !--------------!
3950 ! BEGIN GAME !
3960 !--------------!
3970
3980 BEGIN'GAME:
3990
4000 REM ...... SHUFFLE CARD DECK
4010 PRINT TAB(18,NOTE'BASE); "NOW SHUFFLING CARD DECK .... ";
4020 REM ...... CLEAR DECK
4030 FOR I=1 TO 52 : TAKEN(I)=0 : NEXT I
4040 REM ...... FOLLOWING ALGORITHM REQUIRES AVERAGE OF 235.98 RANDOM #'S
4050 FOR I=1 TO 52
4060 DRAW:
4070 DRAW=INT(51.9999*RND(1))+1
4080 IF(TAKEN(DRAW)=1) THEN GOTO DRAW
4090 TAKEN(DRAW)=1
4100 DECK1'KIND(I)=INT( (DRAW-1)/4 )+1
4110 DECK1'SUIT(I)=DRAW-4*(DECK1'KIND(I)-1)
4120 DECK1'COLOR(I)=11+INT(DECK1'SUIT(I)/3)
4130 DECK1'CODE$(I)=KIND'CODE$(DECK1'KIND(I)) + SUIT'CODE$(DECK1'SUIT(I))
4140 NEXT I
4150 PRINT "DONE !";
4160 GOSUB WAIT
4170 GOSUB WAIT
4180 PRINT TAB(18,NOTE'BASE); TAB(-1,9);
4190
4200 REM ...... SET UP STACKS AND DISPLAY
4210 FOR ROW=1 TO SEVEN
4220 FOR COLUMN=ROW TO SEVEN
4230 STACK'CARD(COLUMN,ROW)=DECK1'CARD(FCARD1)
4240 FCARD1=FCARD1+1
4250
4260 REM ...... FACE-UP CARD CHECK
4270 IF(ROW <> COLUMN) THEN GOTO FACE'DOWN
4280 PRINT TAB(ROW,COLUMN*CARD'WIDTH+STACK'BASE);
4290 PRINT TAB(-1,STACK'COLOR(COLUMN,ROW));
4300 PRINT STACK'CODE$(COLUMN,ROW);
4310 GOTO NEXT'COLUMN
4320
4330 FACE'DOWN:
4340 IF(COLUMN=ROW+1) THEN PRINT TAB(-1,12);
4350 PRINT SPACE(CARD'WIDTH-3); BLANK$;
4360 NEXT'COLUMN:
4370 NEXT COLUMN
4380 NEXT ROW
4390
4400 FOR COLUMN=1 TO SEVEN
4410 IN'STACK(COLUMN)=COLUMN
4420 CARDS'DOWN(COLUMN)=COLUMN-1
4430 NEXT COLUMN
4440
4450 PRINT TAB(-1,12);
4460 PRINT TAB(20,1); "# OF CARDS IN LEFT DECK (FACE DOWN) : "; 53-FCARD1;
4470 PRINT TAB(21,1); "# OF CARDS IN RIGHT DECK (FACE UP) : "; LCARD2;
4480 LAST'TIME=TIME
4490
4500 CARD'MOVE'CHECK:
4510 MOVES=0
4520 FOR COLUMN=1 TO SEVEN
4530 R=IN'STACK(COLUMN)
4540 IF(R=0) THEN GOTO NO'CARD'MOVE
4550 S=STACK'SUIT(COLUMN,R)
4560 IF(STACK'KIND(COLUMN,R) <> SUIT'STACK(S)+1) THEN GOTO NO'CARD'MOVE
4570 REM ...... A MOVE FOUND IN THIS STACK
4580 GOSUB WAIT
4590 MOVES=MOVES+1
4600 REM ...... PICK CARD OFF OF STACK 1
4610 PRINT TAB(R,COLUMN*CARD'WIDTH+STACK'BASE); " ";
4620 REM ...... MOVE CARD TO ACE STACKS
4630 SUIT'STACK(S)=SUIT'STACK(S)+1
4640 PRINT TAB(STACK'KIND(COLUMN,R),ACE'BASE+CARD'WIDTH*S);
4650 PRINT TAB(-1,STACK'COLOR(COLUMN,R));
4660 PRINT STACK'CODE$(COLUMN,R);
4670 REM ...... CHECK NEXT EXPOSED CARD IN STACK 1
4680 IN'STACK(COLUMN)=R-1
4690 IF(R=1) THEN EMPTY'STACKS=EMPTY'STACKS+1 : GOTO NO'CARD'MOVE
4700 REM ...... CHECK FOR LAST FACE-UP CARD GONE
4710 IF(CARDS'DOWN(COLUMN) < R-1) THEN GOTO NO'CARD'MOVE
4720 REM ...... NEW CARD TURNED OVER IN STACK
4730 CARDS'DOWN(COLUMN)=CARDS'DOWN(COLUMN)-1
4740 PRINT TAB(R-1,COLUMN*CARD'WIDTH+STACK'BASE);
4750 PRINT TAB(-1,STACK'COLOR(COLUMN,R-1));
4760 PRINT STACK'CODE$(COLUMN,R-1);
4770
4780 NO'CARD'MOVE:
4790 NEXT COLUMN
4800 IF(MOVES > 0) THEN GOTO CARD'MOVE'CHECK
4810
4820
4830
4840 REM ...... KING MOVE CHECK
4850 MOVES=0
4860 REM ...... CHECK FOR NO EMPTY STACKS AVAILABLE TO MOVE KINGS TO
4870 IF(EMPTY'STACKS=0) THEN GOTO STACK'MOVE'CHECK
4880
4890 FOR COLUMN=1 TO SEVEN
4900 CD=CARDS'DOWN(COLUMN)
4910 REM ...... CHECK FOR ANY CARDS FACE-DOWN IN THIS STACK
4920 IF(CD=0) THEN GOTO NO'KINGS'MOVED
4930 REM ...... CHECK FOR KING PRESENT
4940 IF(STACK'KIND(COLUMN,CD+1) <> 13) THEN GOTO NO'KINGS'MOVED
4950
4960 REM ...... AN EMPTY STACK & A KING-AT-TOP STACK BOTH FOUND
4970 MOVES=MOVES+1
4980 FOR I=1 TO SEVEN
4990 IF(IN'STACK(I)=0) THEN EMPTY=I
5000 NEXT I
5010
5020 REM ...... MOVE KING & OTHER CARDS TO EMPTY STACK
5030 GOSUB WAIT
5040 CARDS=IN'STACK(COLUMN)-CD
5050 FOR I=1 TO CARDS
5060 REM ....... REMOVE KING FROM OLD SPOT
5070 PRINT TAB(CD+I,STACK'BASE+CARD'WIDTH*COLUMN); " ";
5080 REM ....... MOVE KING (& ANY OTHERS) TO EMPTY STACK
5090 STACK'CARD(EMPTY,I)=STACK'CARD(COLUMN,CD+I)
5100 PRINT TAB(I,STACK'BASE+CARD'WIDTH*EMPTY);
5110 PRINT TAB(-1,STACK'COLOR(EMPTY,I));
5120 PRINT STACK'CODE$(EMPTY,I);
5130 NEXT I
5140 IN'STACK(EMPTY)=CARDS
5150 IN'STACK(COLUMN)=CD
5160 CARDS'DOWN(COLUMN)=CD-1
5170
5180 REM ...... NEW CARD TURNED OVER IN STACK
5190 PRINT TAB(CD,STACK'BASE+CARD'WIDTH*COLUMN);
5200 PRINT TAB(-1,STACK'COLOR(COLUMN,CD));
5210 PRINT STACK'CODE$(COLUMN,CD);
5220
5230 REM ...... 1 LESS EMPTY STACK
5240 EMPTY'STACKS=EMPTY'STACKS-1
5250 COLUMN=SEVEN
5260
5270 NO'KINGS'MOVED:
5280 NEXT COLUMN
5290 IF(MOVES > 0) THEN GOTO CARD'MOVE'CHECK
5300
5310
5320
5330 STACK'MOVE'CHECK:
5340 MOVES=0
5350
5360 FOR COLUMN=1 TO SEVEN
5370 REM ...... CHECK FOR EMPTY STACK
5380 S=IN'STACK(COLUMN)
5390 IF(S=0) THEN GOTO NO'STACKS'MOVED
5400
5410 REM ...... CHECK FOR MOVING TO EACH OTHER STACK
5420 REM ***** NOTE : IF >1 MOVE POSSIBLE, CHOOSES THE LEFTMOST MOVE *****
5430 DEST=0
5440 CD=CARDS'DOWN(COLUMN)
5450 K=STACK'KIND(COLUMN,CD+1)
5460 C=STACK'COLOR(COLUMN,CD+1)
5470 FOR I=SEVEN TO 1 STEP -1
5480 IF(IN'STACK(I)=0) THEN GOTO TRY'NEXT'STACK
5490 IF(STACK'KIND(I,IN'STACK(I)) <> K+1) THEN GOTO TRY'NEXT'STACK
5500 IF(STACK'COLOR(I,IN'STACK(I)) = C) THEN GOTO TRY'NEXT'STACK
5510 DEST=I
5520 TRY'NEXT'STACK:
5530 NEXT I
5540 IF(DEST=0) THEN GOTO NO'STACKS'MOVED
5550
5560 REM ..... 2 STACKS FOUND WHICH CAN BE JOINED TOGETHER
5570 GOSUB WAIT
5580 MOVES=MOVES+1
5590 CARDS=IN'STACK(COLUMN)-CD
5600 FOR I=1 TO CARDS
5610 PRINT TAB(CD+I,STACK'BASE+CARD'WIDTH*COLUMN); " ";
5620 IS=IN'STACK(DEST)
5630 STACK'CARD(DEST,IS+I)=STACK'CARD(COLUMN,CD+I)
5640 PRINT TAB(IS+I,STACK'BASE+CARD'WIDTH*DEST);
5650 PRINT TAB(-1,STACK'COLOR(DEST,IS+I));
5660 PRINT STACK'CODE$(DEST,IS+I);
5670 NEXT I
5680 IN'STACK(DEST)=IS+CARDS
5690 IN'STACK(COLUMN)=CD
5700
5710 REM ...... CHECK FOR NO FACE-DOWN CARDS UNDER MOVED STACK
5720 IF(CD=0) THEN EMPTY'STACKS=EMPTY'STACKS+1 : GOTO NO'STACKS'MOVED
5730
5740 REM ...... NEW CARD TURNED OVER IN STACK
5750 CARDS'DOWN(COLUMN)=CD-1
5760 PRINT TAB(CD,STACK'BASE+CARD'WIDTH*COLUMN);
5770 PRINT TAB(-1,STACK'COLOR(COLUMN,CD));
5780 PRINT STACK'CODE$(COLUMN,CD);
5790
5800 NO'STACKS'MOVED:
5810 NEXT COLUMN
5820 IF(MOVES > 0) THEN GOTO CARD'MOVE'CHECK
5830
5840
5850
5860 NEXT'CARD'FROM'DECK:
5870
5880 REM ...... CHECK FOR WHETHER TO TAKE NEXT CARD FROM DECK 2 NOW
5890 IF(LC'USED$="Y" AND LCARD2 <> 0) THEN GOTO NEXT'CARD
5900 GOSUB WAIT
5910
5920 REM ...... CHECK FOR FACE-DOWN DECK USED UP
5930 IF(FCARD1 < 53) THEN GOTO NEXT'TRIPLET
5940 REM ...... CHECK FOR NO CARDS USED DURING LAST DEAL
5950 IF(LCARD2=LAST'LAST'LCARD2) THEN GOTO LOSER
5960
5970 REM ...... CHECK FOR NO CARDS LEFT IN DECK
5980 IF(LCARD2 <> 0) THEN GOTO DECK2'TO'DECK1
5990 CARDS=0
6000 FOR COLUMN=1 TO SEVEN
6010 CARDS=CARDS+IN'STACK(COLUMN)
6020 NEXT COLUMN
6030 IF(CARDS=0) THEN GOTO WINNER ELSE GOTO LOSER
6040
6050 DECK2'TO'DECK1:
6060 FOR I=1 TO LCARD2
6070 DECK1'CARD(I+52-LCARD2)=DECK2'CARD(I)
6080 NEXT I
6090 LAST'LAST'LCARD2=LAST'LCARD2
6100 LAST'LCARD2=LCARD2
6110 FCARD1=53-LCARD2
6120 LCARD2=0
6130
6140 REM ...... UPDATE SCREEN
6150 PRINT TAB(-1,12);
6160 PRINT TAB(20,38); 53-FCARD1;
6170 PRINT TAB(21,38); 0;
6180 PRINT TAB(22,1); TAB(-1,10);
6190 GOSUB WAIT
6200
6210 NEXT'TRIPLET:
6220 REM ...... TAKE THE LESSER OF 3 CARDS OR THE NUMBER LEFT IN DECK
6230 CARDS=3 MIN 53-FCARD1
6240 FOR I=1 TO CARDS
6250 DECK2'CARD(LCARD2+I)=DECK1'CARD(FCARD1-1 + (CARDS+1-I) )
6260 ROW=22
6270 COLUMN=(LCARD2+I-1)*CARD'WIDTH+1
6280 WRAP: IF(COLUMN > 77) THEN ROW=ROW+1 : COLUMN=COLUMN-80 : GOTO WRAP
6290 PRINT TAB(ROW,COLUMN);
6300 PRINT TAB(-1,DECK2'COLOR(LCARD2+I));
6310 PRINT DECK2'CODE$(LCARD2+I);
6320 NEXT I
6330 FCARD1=FCARD1+CARDS
6340 LCARD2=LCARD2+CARDS
6350 PRINT TAB(-1,12);
6360 PRINT TAB(20,38); 53-FCARD1;
6370 PRINT TAB(21,38); LCARD2;
6380
6390 NEXT'CARD:
6400
6410 LC'USED$="Y"
6420 S=DECK2'SUIT(LCARD2)
6430 K=DECK2'KIND(LCARD2)
6440 ROW=22
6450 COLUMN=(LCARD2-1)*CARD'WIDTH+1
6460 WRP2: IF(COLUMN > 77) THEN ROW=ROW+1 : COLUMN=COLUMN-80 : GOTO WRP2
6470
6480 CHECK'SUITS:
6490 IF(SUIT'STACK(S)+1 <> K) THEN GOTO CHECK'STACKS
6500 REM ...... CARD FROM DECK PUT INTO SUIT STACKS
6510 GOSUB WAIT
6520 REM ...... PICK CARD OFF OF DECK 2
6530 PRINT TAB(ROW,COLUMN); " ";
6540 REM ...... PUT ONTO SUIT STACKS
6550 SUIT'STACK(S)=SUIT'STACK(S)+1
6560 PRINT TAB(K,ACE'BASE+CARD'WIDTH*S);
6570 PRINT TAB(-1,DECK2'COLOR(LCARD2));
6580 PRINT DECK2'CODE$(LCARD2);
6590 REM ...... DECREASE DECK 2 COUNTER
6600 LCARD2=LCARD2-1
6610 PRINT TAB(-1,12);
6620 PRINT TAB(21,38); LCARD2;
6630 GOTO CARD'MOVE'CHECK
6640
6650
6660
6670 CHECK'STACKS:
6680 DEST=0
6690 CHECK'NEXT'STACK:
6700 DEST=DEST+1
6710 IF(DEST=SEVEN+1) THEN GOTO CARD'NOT'USED
6720
6730 REM ...... CHECK FOR EMPTY STACK & A KING FROM DECK
6740 IS=IN'STACK(DEST)
6750 IF(IS=0 AND K=13) THEN EMPTY'STACKS=EMPTY'STACKS-1 :GOTO DECK2'TO'STACK
6760
6770 REM ...... CHECK FOR DECK CARD GOING TO STACK
6780 IF(IS=0) THEN GOTO CHECK'NEXT'STACK
6790 REM ****** NOTE : IF >1 POSSIBLE, LEFTMOST IS CHOSEN *****
6800 IF(STACK'KIND(DEST,IS)-1 <> K) THEN GOTO CHECK'NEXT'STACK
6810 IF(STACK'COLOR(DEST,IS)=DECK2'COLOR(LCARD2)) THEN GOTO CHECK'NEXT'STACK
6820 GOTO DECK2'TO'STACK
6830
6840 DECK2'TO'STACK:
6850 GOSUB WAIT
6860 REM ...... PICK CARD OFF OF DECK 2
6870 PRINT TAB(ROW,COLUMN); " ";
6
880 REM ...... PUT CARD ONTO STACKS
6890 IN'STACK(DEST)=IS+1
6900 STACK'CARD(DEST,IS+1)=DECK2'CARD(LCARD2)
6910 PRINT TAB(IS+1,STACK'BASE+CARD'WIDTH*DEST);
6920 PRINT TAB(-1,DECK2'COLOR(LCARD2));
6930 PRINT DECK2'CODE$(LCARD2);
6940
6950 REM ...... TAKE CARD OFF DECK
6960 LCARD2=LCARD2-1
6970 PRINT TAB(-1,12); TAB(21,38); LCARD2;
6980 GOTO STACK'MOVE'CHECK
6990
7000
7010
7020 CARD'NOT'USED:
7030 LC'USED$="N"
7040 GOTO NEXT'CARD'FROM'DECK
7050
7060
7070
7080 WINNER:
7090 PRINT TAB(-1,12);
7100 PRINT TAB(15,NOTE'BASE);
7110 PRINT TAB(-1,9);
7120 PRINT "CONGRATULATIONS, YOU WON !";
7130 GOSUB HOG
7140 WIN$="W"
7150
7160 GOTO TEST'END
7170
7180
7190
7200 LOSER:
7210 PRINT TAB(-1,12);
7220 PRINT TAB(15,NOTE'BASE);
7230 PRINT TAB(-1,9);
7240 PRINT "SORRY CHARLIE, YOU LOST !";
7250 WIN$="L"
7260
7270 GOTO TEST'END
7280
7290
7300
7310 TEST'END:
7320 NDECK=LCARD2
7330 NUP=0
7340 NDOWN=0
7350 FOR COLUMN=1 TO SEVEN
7360 NDOWN=NDOWN+CARDS'DOWN(COLUMN)
7370 NUP=NUP+IN'STACK(COLUMN)-CARDS'DOWN(COLUMN)
7380 NEXT COLUMN
7390 NACES=0
7400 NSTACK2=0
7410 FOR I=1 TO 4
7420 IF(SUIT'STACK(I) > 0) THEN NACES=NACES+1
7430 NSTACK2=NSTACK2+SUIT'STACK(I)
7440 NEXT I
7450
7460
7470 REM ...... WRITE WIN/LOSS DATA
7480 GOSUB OPEN'FILE
7490 PRINT TAB(16,NOTE'BASE); TAB(-1,9);
7500 IF(GAME > LASTREC) THEN ? "[SOLIT.DAT FILE IS FULL]" : GOTO END'OUTPUT
7510 IF(GAME<RECORDS+1)THEN ? "[GAME #";GAME;"PLAYED BEFORE]":GOTO END'OUTPUT
7520 IF(GAME>RECORDS+1)THEN ? "[GAME #";GAME;"OUT OF ORDER]":GOTO END'OUTPUT
7530 REC1=GAME
7540 WRITE #1, WINDATA
7550 REC1=0
7560 WRITE #1, GAME
7570 PRINT "THIS WAS GAME #"; GAME;
7580 END'OUTPUT:
7590 CLOSE #1
7600
7610 END'QUERY:
7620 PRINT TAB(17,NOTE'BASE);
7630 PRINT TAB(-1,9);
7640 PRINT "ANOTHER GAME ? ('Y' OR 'N') : ";
7650 INPUT "" COMD$
7660 IF(COMD$ <> "N") THEN GOTO MAIN'LOOP
7670
7680 GOTO END
7690
7700
7710
7720 WAIT:
7730 REM ...... WAITS UNTIL "RATE" SECONDS HAVE PASSED SINCE LAST WAIT CALL
7740 IF( (TIME-LAST'TIME)/60 < RATE) THEN GOTO WAIT
7750 LAST'TIME=TIME
7760 PRINT TAB(1,74); TAB(-1,12);
7770 PRINT USING "####.#", (TIME-START'TIME)/60
7780 RETURN
7790
7800
7810
7820 OPEN'FILE:
7830 RECORDS=0
7840 LOOKUP FNAME$, THERE
7850 IF(THERE=0) THEN ALLOCATE FNAME$, FBLOX
7860 OPEN #1, FNAME$, RANDOM, 6, REC1
7870 LASTREC=INT(512/6)*FBLOX-1
7880 REC1=0
7890 IF(THERE=0) THEN WRITE #1, RECORDS ELSE READ #1, RECORDS
7900 NEXT'GAME=RECORDS+1
7910 IF(NEXT'GAME>LASTREC) THEN RANDOMIZE ELSE DRAW=RND( SIN(NEXT'GAME)-1 )
7920 RETURN
7930
7940
7950
7960 HOG:
7970 PRINT TAB(-1,1);
7980
7990 PRINT " .... .... "
8000 PRINT " / \ / \ "
8010 PRINT " / \................/ \ "
8020 PRINT "/ / / \ \ \"
8030 PRINT "| | / \ | |"
8040 PRINT "| / \/ \/ \ |"
8050 PRINT "\/ / [o] [o] \ \/"
8060 PRINT " / ...... \ "
8070 PRINT " | / \ | "
8080 PRINT " | | O O | | "
8090 PRINT " \ \....../ / "
8100 PRINT " \ / "
8110 PRINT " \ \....../ / "
8120 PRINT " \ / "
8130 PRINT " \ / "
8140 PRINT " ------------------ "
8150 PRINT
8160 PRINT " IT'S THE AMOS HOG ! "
8170
8180 REM ...... OINK !
8190 NWAIT=600
8200 OINKS=6
8210 FOR OINK=1 TO OINKS
8220 PRINT TAB(13,16); "OINK";
8230 PRINT TAB(23,1);
8240 PRINT CHR(7);
8250 FOR I=1 TO NWAIT : NEXT I
8260 PRINT TAB(13,16); "....";
8270 PRINT TAB(23,1);
8280 FOR I=1 TO NWAIT : NEXT I
8290 NEXT OINK
8300
8310 RETURN
8320
8330
8340
8350 END:
8360 PRINT TAB(23,1);
8370 END