10 CLS 15 DIM DECK$(52),PRE(52),SUIT$(4),CARD$(13),CLR(4,2),ROW$(5,13),NDECK$(52) 20 DIM UP$(4) 25 DEF FNR(X)=INT((RND*X)+1) 26 RANDOMIZE(VAL(RIGHT$(TIME$,2))) 30 PRINT "Lucky 13 Solitaire":PRINT 31 PRINT "Do you want color? "; 32 A$=INKEY$:IF A$="" THEN 32 33 GOSUB 10000:IF A$<>"Y" AND A$<>"N" THEN 32 ELSE PRINT A$:COL$=A$ 34 PRINT "Do you need Instructions? "; 35 A$=INKEY$:IF A$="" THEN 35 36 GOSUB 10000:IF A$<>"Y" AND A$<>"N" THEN 35 ELSE PRINT A$ 37 IF A$="Y" THEN GOSUB 5000 40 PRINT "Initializing ... " 45 GOSUB 1000 50 PRINT "Shuffling ... " 60 GOSUB 1200 65 PRINT "Dealing ... " 70 GOSUB 1500 80 GOSUB 1700 90 TOP=3 91 COLOR 7,1:LOCATE 20,50:PRINT " C - More cards "; 92 LOCATE 21,50:PRINT " D - Move from deck, "; 93 LOCATE 22,50:PRINT " P - Move from pile "; 94 LOCATE 23,50:PRINT " Row Number - move from row "; 95 LOCATE 24,50:PRINT " Q - Quit ";:COLOR 7,0 100 LOCATE 19,1:PRINT "Next card in deck:"; 110 IF NDECK<1 THEN PRINT "None";:GOTO 140 120 C$=NDECK$(TOP):GOSUB 1300 130 LOCATE 21,1:PRINT USING "## cards left in pile";14-PILE 140 LOCATE 22,1:PRINT USING "Card ## of ## left in deck";TOP;NDECK; 150 LOCATE 24,1:PRINT " "; 151 IF SCORE>51 THEN 900 155 LOCATE 23,1:PRINT "What do you want to do? ";:LOCATE 23,23 160 A$=INKEY$:IF A$="" THEN 160 ELSE GOSUB 10000 165 IF A$="P" THEN PRINT A$;:GOSUB 4000:GOTO 100 170 IF A$="C" THEN PRINT A$;:GOSUB 300:GOTO 100 180 IF A$="D" THEN PRINT A$;:GOSUB 350:GOTO 100 190 IF A$>="1" AND A$<="4" THEN PRINT A$;:GOSUB 600:GOTO 100 200 IF A$="Q" THEN 900 210 GOTO 160 300 REM Get more cards from deck 310 IF TOP=NDECK THEN TOP=3 ELSE TOP=TOP+3 320 IF TOP>NDECK THEN TOP=NDECK 330 RETURN 350 REM Move from deck to a row 360 LOCATE 24,1:PRINT "From deck to row? "; 380 A$=INKEY$:GOSUB 10000:IF (A$>="1" AND A$<="4") OR A$="U" THEN 390 ELSE 380 390 IF A$="U" THEN PRINT "Up"; ELSE PRINT A$; 395 IF A$="U" THEN 540 400 TOROW=VAL(A$)+1 401 IF ROW$(TOROW,1)<>" " THEN 410 402 IN$=NDECK$(TOP):GOSUB 3000 403 IF NUM=START-1 OR (START=1 AND NUM=13) THEN PLACE=0:GOTO 500 410 FOR PLACE=13 TO 1 STEP -1 420 IF ROW$(TOROW,PLACE)<>" " THEN 460 430 NEXT PLACE 440 GOSUB 990 450 RETURN 460 BELOW$=ROW$(TOROW,PLACE) 470 ABOVE$=NDECK$(TOP) 480 GOSUB 2000 'check if match 490 IF OK$="NO" THEN 440 500 ROW$(TOROW,PLACE+1)=NDECK$(TOP) 520 ROW=TOROW:GOSUB 3100 525 GOSUB 2200 'repack deck 530 RETURN 540 REM Play Deck Up 550 ABOVE$=NDECK$(TOP) 560 GOSUB 2300 'play up 570 IF OK$="NO" THEN 440 580 GOTO 525 600 REM Move from one row to another 610 FROMROW=VAL(A$)+1 620 FROMPLACE=1 630 GOTO 660 660 LOCATE 24,1:PRINT "From row";FROMROW-1;"to row? "; 680 A$=INKEY$:GOSUB 10000:IF (A$>="1" AND A$<="4") OR A$="U" THEN 690 ELSE 680 690 IF A$="U" THEN PRINT "Up"; ELSE PRINT A$; 695 IF A$="U" THEN 830 700 TOROW=VAL(A$)+1 710 FOR TOPLACE=13 TO 1 STEP -1 720 IF ROW$(TOROW,TOPLACE)<>" " THEN 760 730 NEXT TOPLACE 740 GOSUB 990 750 RETURN 760 REM 770 ABOVE$=ROW$(FROMROW,1) 775 BELOW$=ROW$(TOROW,TOPLACE) 780 GOSUB 2000 'check if match 790 IF OK$="NO" THEN 740 800 GOSUB 3200 'move the stack 810 ROW=FROMROW:GOSUB 3100 'redraw a row 815 ROW=TOROW:GOSUB 3100 'redraw a row 816 IF ROW$(FROMROW,1)=" " THEN TOROW=FROMROW:GOTO 4300 820 RETURN 830 REM play from a row to up 832 FOR FROMPLACE=13 TO 1 STEP -1 834 IF ROW$(FROMROW,FROMPLACE)<>" " THEN 840 836 NEXT FROMPLACE 838 GOSUB 990:RETURN 840 ABOVE$=ROW$(FROMROW,FROMPLACE) 850 GOSUB 2300 'play to aces 851 IF OK$="NO" THEN 740 854 ROW$(FROMROW,FROMPLACE)=" " 856 ROW=FROMROW:GOSUB 3100 'redraw a row 857 IF ROW$(FROMROW,1)=" " THEN TOROW=FROMROW:GOTO 4300 860 RETURN 900 REM Exit game 901 LOCATE 19,1:PRINT " "; 902 LOCATE 21,1:PRINT " "; 903 LOCATE 22,1:PRINT " "; 904 LOCATE 23,1:PRINT " "; 905 LOCATE 24,1:PRINT " "; 910 GOSUB 1800 920 GOSUB 1900 925 FOR I=1 TO 20:A$=INKEY$:NEXT I 930 GOSUB 3400:PRINT "Play again? (Y or N) "; 940 A$=INKEY$:IF A$="" THEN 940 950 GOSUB 10000 960 IF A$="Y" THEN CLS:PRINT "Re-";:GOTO 40 962 IF A$="N" THEN 970 964 GO TO 940 970 CLS:PRINT "Bye":END 990 REM Bad Play 992 COLOR 0,7:LOCATE 3,50:PRINT " Can't do that! "; 994 LOCATE 4,50:PRINT " Press any key to continue ";:COLOR 7,0 996 IF INKEY$="" THEN 996 997 LOCATE 3,50:PRINT " "; 998 LOCATE 4,50:PRINT " "; 999 RETURN 1000 REM 1005 DOWN$=CHR$(178):DOWN$=DOWN$+DOWN$+DOWN$ 1009 IF COL$="N" THEN 1020 1010 FOR I=1 TO 2:CLR(I,1)=4:CLR(I,2)=7:NEXT 1015 FOR I=3 TO 4:CLR(I,1)=0:CLR(I,2)=7:NEXT 1019 GO TO 1030 1020 FOR I=1 TO 2:CLR(I,1)=0:CLR(I,2)=7:NEXT 1025 FOR I=3 TO 4:CLR(I,1)=7:CLR(I,2)=0:NEXT 1030 FOR I=1 TO 4:SUIT$(I)=CHR$(I+2):NEXT I 1035 FOR I=1 TO 4:UP$(I)=" ":NEXT I 1040 FOR I=2 TO 9:CARD$(I)=STR$(I):NEXT I 1050 CARD$(1)=" A":CARD$(10)="10":CARD$(11)=" J":CARD$(12)=" Q":CARD$(13)=" K" 1060 FOR I=1 TO 4 1070 FOR J=1 TO 13 1080 K=(I-1)*13+J 1090 DECK$(K)=CARD$(J)+SUIT$(I) 1100 NEXT J 1110 NEXT I 1120 FOR I=1 TO 5 1130 FOR J=1 TO 13 1140 ROW$(I,J)=" " 1150 NEXT J,I 1160 SCORE=1:PILE=1 1170 RETURN 1200 REM Shuffle 1210 FOR I=1 TO 52:NDECK$(I)="":NEXT I 1220 FOR I=1 TO 52 1230 R=FNR(52) 1240 IF NDECK$(R)="" THEN NDECK$(R)=DECK$(I) ELSE 1230 1250 NEXT I 1260 FOR I=1 TO 52 1270 DECK$(I)=NDECK$(I) 1280 NEXT I 1290 RETURN 1300 REM Display a card (C$) 1310 IF C$=DOWN$ THEN 1350 1320 IF C$=" " THEN 1350 1330 S=ASC(RIGHT$(C$,1))-2 1340 COLOR CLR(S,1),CLR(S,2) 1350 PRINT C$;:COLOR 7,0:PRINT " "; 1360 RETURN 1500 REM Deal the game 1510 UP$=DECK$(1) 1520 FOR I=1 TO 13 1530 ROW$(1,I)=DECK$(I+1) 1540 NEXT I 1550 FOR I=1 TO 4 1560 ROW$(I+1,1)=DECK$(14+I) 1570 NEXT I 1580 CLS:L=5:LOCATE 1,5:PRINT "Top:" 1585 LOCATE 2,50:PRINT "Top card was ";:C$=UP$:GOSUB 1300 1590 S=ASC(RIGHT$(UP$,1))-2 1600 UP$(S)=UP$ 1610 LOCATE 1,(5+(S*8)) 1620 C$=UP$(S):GOSUB 1300 1630 LOCATE 4,1 1640 PRINT "Pile 1 2 3 4" 1650 FOR ROW=1 TO 5 1660 C$=ROW$(ROW,1) 1670 GOSUB 1300 1680 NEXT ROW 1690 RETURN 1700 REM Prepare to play 1710 FOR I=1 TO 34 1720 J=I+18 1730 NDECK$(I)=DECK$(J) 1740 NEXT I 1750 FOR I=35 TO 52:NDECK$(I)="":NEXT I 1760 IN$=UP$:GOSUB 3000:START=NUM 1780 NDECK=34 1790 RETURN 1800 REM Show Deck 1810 LL=3 1815 LOCATE 3,50:PRINT "Cards left in deck:"; 1817 IF NDECK=0 THEN 1890 1820 FOR I=1 TO NDECK STEP 3 1830 LL=LL+1:LOCATE LL,50 1840 FOR J=0 TO 2 1845 IF I+J>NDECK THEN 1870 1850 C$=NDECK$(I+J) 1860 GOSUB 1300 1870 NEXT J:PRINT " ";:NEXT I 1880 RETURN 1890 LOCATE 4,50:PRINT "None. "; 1895 FOR I=2 TO 3:LOCATE LL+I,50:PRINT " ";:NEXT 1899 RETURN 1900 REM show pile 1910 LL=4 1920 FOR PLACE=PILE TO 13 1925 LL=LL+1:LOCATE LL,1 1935 C$=ROW$(1,PLACE) 1950 GOSUB 1300 1970 LOCATE LL,1 1980 NEXT PLACE 1990 RETURN 2000 REM Check if above$ can go on below$ 2010 IN$=ABOVE$:GOSUB 3000:ANUM=NUM:ASUIT=SUIT 2020 IN$=BELOW$:GOSUB 3000:BNUM=NUM:BSUIT=SUIT 2030 OK$="YES" 2040 IF BNUM=1 AND ANUM=13 THEN BNUM=14 2050 IF ANUM+1<>BNUM THEN OK$="NO" 2060 IF ASUIT<=2 AND BSUIT<=2 THEN OK$="NO" 2070 IF ASUIT>=3 AND BSUIT>=3 THEN OK$="NO" 2080 RETURN 2200 REM Repack Deck 2205 IF NDECK=1 THEN TOP=0:NDECK=0:RETURN 2210 FOR I=TOP+1 TO NDECK 2220 NDECK$(I-1)=NDECK$(I) 2230 NEXT I 2240 NDECK=NDECK-1 2250 TOP=TOP-1 2260 IF TOP<1 THEN TOP=3 2280 IF TOP>NDECK THEN TOP=NDECK 2290 RETURN 2300 REM Play ABOVE$ to aces 2310 IN$=ABOVE$:GOSUB 3000:ANUM=NUM:ASUIT=SUIT 2320 IN$=UP$(ASUIT):IF IN$=" " THEN BNUM=START-1:GOTO 2340 2330 GOSUB 3000:BNUM=NUM 2340 IF BNUM=13 AND ANUM=1 THEN ANUM=14 2350 IF ANUM=BNUM+1 THEN OK$="YES" ELSE OK$="NO":RETURN 2360 UP$(ASUIT)=ABOVE$ 2370 LOCATE 1,(5+(ASUIT*8)):C$=ABOVE$ 2380 GOSUB 1300 2390 SCORE=SCORE+1:LOCATE 1,50:PRINT "Score";SCORE;:RETURN 3000 REM change in$ to num and suit 3005 IF A$=" " THEN NUM=0:SUIT=0:RETURN 3010 A$=LEFT$(IN$,2) 3020 IF A$=" A" THEN A$=" 1" 3030 IF A$=" J" THEN A$="11" 3040 IF A$=" Q" THEN A$="12" 3050 IF A$=" K" THEN A$="13" 3060 NUM=VAL(A$) 3070 SUIT=ASC(RIGHT$(IN$,1))-2 3080 RETURN 3100 REM Redraw a row 3110 R=((ROW-1)*7)+1 3130 FOR PLACE=1 TO 13 3150 LOCATE 4+PLACE,R 3160 C$=ROW$(ROW,PLACE) 3170 GOSUB 1300 3180 NEXT PLACE 3190 RETURN 3200 REM Copy part of a row 3210 FP=1:TP=TOPLACE 3220 TP=TP+1 3230 ROW$(TOROW,TP)=ROW$(FROMROW,FP) 3240 ROW$(FROMROW,FP)=" " 3250 FP=FP+1 3260 IF ROW$(FROMROW,FP)<>" " THEN 3220 3270 FOR I=1 TO 13 3280 ROW$(FROMROW,I)=" " 3290 NEXT I:RETURN 3400 REM Evaluate game performance 3405 LOCATE 22,1:PRINT "You placed";SCORE;"cards on the Aces piles" 3410 SC=INT(SCORE/10)+1 3415 IF SCORE=52 THEN SC=7 3420 IF SCORE=0 THEN GOSUB 3520:RETURN 3430 ON SC GOSUB 3450,3460, 3470, 3480, 3490, 3500, 3510 3440 RETURN 'score 0-9 10-19 20-29 30-39 40-49 50+ 3450 PRINT "Too bad, better try again!":RETURN 3460 PRINT "Not too bad, still a lot of room for improvement":RETURN 3470 PRINT "Pretty good, keep trying.":RETURN 3480 PRINT "Good job. Keep up the good work!":RETURN 3490 PRINT "Very good. Now you have the idea!":RETURN 3500 PRINT "Almost got it. Bad break!":RETURN 3510 PRINT "YOU DID IT!! Congratulations!":RETURN 3520 PRINT "Oops! You must have had a bad shuffle!":RETURN 4000 REM move from pile to row 4010 FROMROW=1:FROMPLACE=PILE 4020 LOCATE 24,1:PRINT "From pile to row? "; 4030 A$=INKEY$:GOSUB 10000 4040 IF (A$>="1" AND A$<="4") OR A$="U" THEN 4050 ELSE 4030 4050 IF A$="U" THEN PRINT "Up"; ELSE PRINT A$; 4060 IF A$="U" THEN 4250 4070 TOROW=VAL(A$)+1 4075 IF ROW$(TOROW,1)=" " THEN 4300 4080 FOR TOPLACE=13 TO 1 STEP -1 4090 IF ROW$(TOROW,TOPLACE)<>" " THEN 4130 4100 NEXT TOPLACE 4110 GOSUB 990 4120 RETURN 4130 REM 4140 ABOVE$=ROW$(FROMROW,FROMPLACE) 4150 BELOW$=ROW$(TOROW,TOPLACE) 4160 GOSUB 2000 'check if match 4170 IF OK$="NO" THEN 4110 4180 ROW$(TOROW,TOPLACE+1)=ROW$(1,PILE) 4190 ROW=TOROW:GOSUB 3100 'redraw a row 4200 PILE=PILE+1:IF PILE>13 THEN LOCATE 5,1:PRINT " ":RETURN 4210 LOCATE 5,1 4220 C$=ROW$(1,PILE) 4230 GOSUB 1300 4240 RETURN 4250 REM Play Deck Up 4260 ABOVE$=ROW$(1,PILE) 4270 GOSUB 2300 'play up 4280 IF OK$="NO" THEN 4110 4290 GOTO 4200 4300 REM place pile to empty row 4305 IF PILE>13 THEN RETURN 4310 ROW$(TOROW,1)=ROW$(1,PILE) 4320 GOTO 4190 5000 REM Instructions 5010 CLS:PRINT "Lucky 13 Solitaire":PRINT 5020 PRINT "This program plays Lucky 13 solitaire. A deck of 52 cards is" 5030 PRINT "used. The first card is turned face up. Next, 13 cards are" 5040 PRINT "counted into a pile and are placed so that only the top card" 5050 PRINT "is shown. Then four cards are placed face up. On each of the" 5060 PRINT "four card,s or rows, you may build in descending sequence:" 5070 PRINT "red on black, such as the tenof hearts on the jack of clubs" 5080 PRINT "or spades.":PRINT 5090 PRINT "You can move the face up cards in a row as a unit. The top" 5100 PRINT "card being moved must fit in sequence and color with the" 5110 PRINT "top card in the other row.":PRINT 5120 PRINT "You are always entitled to have 4 rows, and if one is" 5130 PRINT "entirely open the top card of the pile is moved into the space." 5140 PRINT "If the Pile has been exhausted, then any card of one value lower" 5150 PRINT "than the first card played up may be moved to the empty row." 5160 PRINT "For example, if the first card played up was the Four of Diamonds," 5170 PRINT "then after the pile has been exhausted and a row emptied, any" 5180 PRINT "Three could be played to the empty spot to start a new row.":PRINT 5190 PRINT " ** Press any key to continue **" 5200 IF INKEY$="" THEN 5200 ELSE CLS 5210 PRINT "The top card on the pile is availabe to be played, but not to be" 5220 PRINT "played on. Instead of starting the top piles with Aces, these" 5230 PRINT "piles are started with cards matching the first card turned up." 5240 PRINT "If that card was the Four of Diamonds, then the piles would all" 5250 PRINT "begin with Fours.":PRINT 5280 PRINT "A card must be the top card of a row to be played up to" 5290 PRINT "the foundations. Once played on the foundations, a" 5300 PRINT "card can NOT be removed to help elsewhere.":PRINT 5310 PRINT "The remaining cards in the deck are used as the stock." 5320 PRINT "Every third card may be turned up and the deck may be gone" 5330 PRINT "through any number of times. The top card is available for" 5340 PRINT "play to any row or the foundations. When the top card" 5350 PRINT "is played, the next card will then be available.":PRINT 5360 PRINT "You win if you can build all 4 foundations up to the end of the" 5370 PRINT "suit. You lose when you can not make any further plays from the" 5380 PRINT "deck, or rows.":PRINT 5390 PRINT " ** Press any key to continue **" 5400 IF INKEY$="" THEN 5400 ELSE CLS 5410 PRINT "Plays are controlled by keyboard commands as follows:":PRINT 5420 PRINT "D = Play top card of the Deck Up (U) or to row (#1-7)." 5430 PRINT " Answer 'U' or row number 1-7 to next question to" 5440 PRINT " indicate where the card is to be moved." 5450 PRINT "C = Get next Card in the deck and wait for next play command." 5460 PRINT "Q = Quit game and turn over all face-down cards." 5470 PRINT "#1-7 = Play cards from row# Up (U) or to another row (#1-7)" 5480 PRINT 5490 PRINT "An error message will be displayed if an invalid response is" 5500 PRINT "given to any question or any invalid plays attempted." 5510 PRINT " ** Press any key to continue **" 5520 IF INKEY$="" THEN 5520 ELSE CLS:RETURN 10000 REM Shift A$ to upper case 10020 L=LEN(A$) 'get length of a$ 10030 FOR I=1 TO L 'look at each char 10040 TEST=ASC(MID$(A$,I,1)) 'get acsii value 10050 IF TEST<97 OR TEST>122 THEN 10080 'skip if not lower case 10060 TEST=TEST-32 'bump down to upper case 10070 MID$(A$,I,1)=CHR$(TEST) 'insert upper case back 10080 NEXT I 'move on to next char 10090 RETURN