10 REM ******************
20 REM *    PATIENCE    *
30 REM * By Robin Nixon *
40 REM ******************
50 REM (c) Computing with the Amstrad
55 REM CPC only
60 MODE 1:CALL &BC02:CALL &BB4E
70 INK 0,11:INK 1,1:INK 2,26:BORDER 0
80 DIM a$(52),b$(13),c$(7,18),d(7,2),e$(24),f$(4),g$(13),h$(4),j$(6)
90 SYMBOL AFTER 250
100 SYMBOL 250,90,165,90,165,165,90,165,90
110 SYMBOL 251,255,171,213,171,213,171,213,255
120 GOSUB 3370
130 WHILE INKEY$<>"":WEND
140 WHILE INKEY$="":rand=RND:WEND
150 BORDER 13:INK 0,9:INK 1,0:INK 2,26
160 MODE 1:PLOT 0,0,1:DRAW 638,0
170 DRAW 638,398:DRAW 0,398:DRAW 0,0
180 DEFINT a-z
190 DATA " A"," 2"," 3"," 4"
200 DATA " 5"," 6"," 7"," 8"
210 DATA " 9","10"," J"," Q"," K"
220 z$="A234567890JQK"
230 DATA Ace,Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten,Jack,Queen,King
240 DATA clubs,diamonds,hearts,spades
250 RESTORE 190
260 FOR j=1 TO 13:READ b$(j):NEXT
270 FOR j=1 TO 13:READ g$(j):NEXT
280 FOR j=1 TO 4:READ h$(j):NEXT
290 FOR j=1 TO 7:d(j,1)=j:d(j,2)=j:NEXT
300 FOR j=0 TO 39 STEP 13
310 FOR k=1 TO 13
320 a$(j+k)=b$(k)+CHR$(j/13+226)
330 NEXT:NEXT
340 FOR j=1 TO 156:r1=RND*51+1
350 r2=RND*51+1:c$=a$(r1)
360 a$(r1)=a$(r2):a$(r2)=c$
370 NEXT
380 FOR j=29 TO 52:e$(j-28)=a$(j)
390 NEXT
400 IF np=0 THEN GOSUB 3220
410 h=0:c=1
420 FOR k=0 TO 6:FOR j=h TO 6
430 IF h=j THEN PEN 2:PAPER 2 ELSE PEN 1:PAPER 2
440 FOR m=1 TO 5:LOCATE j*4+2,k+m+1
450 PRINT STRING$(4,250);:NEXT
460 np=24:np1=4:np2=0
470 IF h<>j THEN GOTO 540
480 PAPER 2
490 n=ASC(RIGHT$(a$(c),1))
500 IF n=226 OR n=229 THEN PEN 1 ELSE PEN 3
510 LOCATE j*4+2,k+2
520 PRINT MID$(a$(c),INSTR(a$(c)," ")+1)
530 LOCATE j*4+3,k+6:PRINT a$(c)
540 PLOT j*64+16,384-k*16,1
550 DRAW j*64+78,384-k*16
560 DRAW j*64+78,382-k*16-78
570 DRAW j*64+16,382-k*16-78
580 DRAW j*64+16,384-k*16
590 c$(j+1,k+1)=a$(c):c=c+1:NEXT
600 h=h+1:NEXT
610 PEN 1:PAPER 2:FOR j=1 TO 5
620 LOCATE 31,19+j
630 PRINT STRING$(4,250):NEXT
640 PLOT 480,96,1:DRAW 542,96
650 DRAW 542,16:DRAW 480,16
660 DRAW 480,96:PEN 2:PAPER 2
670 FOR j=1 TO 5:LOCATE 36,19+j
680 PRINT STRING$(4,250):NEXT:p=4
690 IF np=0 THEN pf=0:GOSUB 2790:GOTO 810
700 n=ASC(RIGHT$(e$(p),1)):pf=0
710 IF n=226 OR n=229 THEN PEN 1 ELSE PEN 3
720 LOCATE 36,20
730 PRINT MID$(e$(p),INSTR(e$(p)," ")+1);" "
740 LOCATE 37,24:PRINT e$(p)
750 PLOT 560,96,1:DRAW 622,96
760 DRAW 622,16:DRAW 560,16
770 DRAW 560,96
780 IF np=0 THEN GOSUB 3220
790 IF pf THEN GOTO 690
800 GOSUB 3170
810 GOSUB 2960
820 lc=14:GOSUB 1560
830 IF g$=CHR$(32) THEN GOTO 810
840 IF g$=CHR$(127) OR h$=CHR$(127) OR (j1a=0 AND j2=0 AND j3=0) OR j3 THEN GOSUB 2960:SOUND 2,600:GOTO 810
850 tj1a=j1a:tj1b=j1b:tj2=j2:f$=g$
860 IF j3 THEN GOTO 930
870 IF LEFT$(f$,1)="A" THEN GOSUB 1960:ct=0:GOTO 780
880 IF LEFT$(f$,1)="K" THEN GOSUB 2510
890 IF LEFT$(f$,1)="K" AND ee=0 THEN SOUND 2,600:GOTO 780
900 IF LEFT$(f$,1)="K" THEN ct=0:GOTO 1090
910 PEN 2:PAPER 0:LOCATE 34,16
920 PRINT"to":lc=17
930 GOSUB 1560
940 IF g$=CHR$(32) THEN GOTO 810
950 IF g$=CHR$(127) OR h$=CHR$(127) OR (j1a=0 AND j2=0 AND j3=0) THEN GOSUB 2960:SOUND 2,600:GOTO 810
960 IF tj1a>0 AND j1a>0 AND tj1a=j1a THEN SOUND 2,600:GOTO 810
970 IF j1a>0 AND j1b<d(j1a,2) THEN SOUND 2,600:GOTO 810
980 t$=g$
990 IF j3 THEN GOSUB 2420:GOTO 780
1000 IF j2 THEN SOUND 2,600:GOTO 780
1010 IF RIGHT$(f$,1)=CHR$(226) OR RIGHT$(f$,1)=CHR$(229) THEN GOTO 1050
1020 IF RIGHT$(t$,1)=CHR$(226) OR RIGHT$(t$,1)=CHR$(229) THEN GOTO 1080
1030 SOUND 2,600
1040 GOTO 780
1050 IF RIGHT$(t$,1)=CHR$(227) OR RIGHT$(t$,1)=CHR$(228) THEN GOTO 1080
1060 SOUND 2,600
1070 GOTO 780
1080 IF (INSTR(z$,LEFT$(t$,1))-INSTR(z$,LEFT$(f$,1)))<>1 THEN SOUND 2,600:GOTO 780
1090 ct=0
1100 IF tj2=0 THEN GOTO 1140
1110 tj1a=0:tj1b=0:c$(0,0)=e$(p)
1120 GOSUB 2920:GOSUB 2360
1130 pf=1:ct=0:GOTO 1350
1140 ORIGIN 0,0,(tj1a*4-3)*16,(tj1a*4)*16+10,398-tj1b*16+2,2
1150 ct=0:CLG 0
1160 ORIGIN 0,0,0,640,0,400
1170 jj=d(tj1a,2)-tj1b
1180 d(tj1a,2)=tj1b-1
1190 IF d(tj1a,2)<d(tj1a,1) THEN d(tj1a,1)=d(tj1a,2)
1200 IF d(tj1a,2)=0 THEN GOTO 1350
1210 PEN 2:PAPER 2:FOR j=1 TO 5
1220 LOCATE tj1a*4-2,tj1b+j-1
1230 PRINT STRING$(4,250):NEXT
1240 q=ASC(RIGHT$(c$(tj1a,tj1b-1),1))
1250 IF q=226 OR q=229 THEN PEN 1 ELSE PEN 3
1260 LOCATE tj1a*4-2,tj1b
1270 PRINT MID$(c$(tj1a,tj1b-1),INSTR(c$(tj1a,tj1b-1)," ")+1)
1280 LOCATE tj1a*4-1,tj1b+4
1290 PRINT c$(tj1a,tj1b-1)
1300 PLOT (tj1a*4+4)*16-112,398-tj1b*16+18,1
1310 DRAW (tj1a*4+4)*16-50,398-tj1b*16+18
1320 DRAW (tj1a*4+4)*16-50,318-tj1b*16+18
1330 DRAW (tj1a*4+4)*16-112,318-tj1b*16+18
1340 DRAW (tj1a*4+4)*16-112,398-tj1b*16+18
1350 kk=d(tj1a,2)+1
1360 IF pf=1 THEN kk=0:jj=0
1370 FOR j=j1b+1 TO j1b+jj+1
1380 c$(j1a,j)=c$(tj1a,kk)
1390 kk=kk+1:IF pf=1 THEN kk=0
1400 d(j1a,2)=d(j1a,2)+1
1410 PEN 2:PAPER 2:FOR k=1 TO 5
1420 LOCATE j1a*4-2,j+k
1430 PRINT STRING$(4,250):NEXT
1440 q=ASC(RIGHT$(c$(j1a,j),1))
1450 IF q=226 OR q=229 THEN PEN 1 ELSE PEN 3
1460 LOCATE j1a*4-2,j+1
1470 PRINT MID$(c$(j1a,j),INSTR(c$(j1a,j)," ")+1)
1480 LOCATE j1a*4-1,j+5
1490 PRINT c$(j1a,j)
1500 PLOT (j1a*4+4)*16-112,398-j*16+2,1
1510 DRAW (j1a*4+4)*16-50,398-j*16+2
1520 DRAW (j1a*4+4)*16-50,318-j*16+2
1530 DRAW (j1a*4+4)*16-112,318-j*16+2
1540 DRAW (j1a*4+4)*16-112,398-j*16+2
1550 NEXT:GOTO 780
1560 WHILE INKEY$<>"":WEND
1570 PEN 1:PAPER 0:LOCATE 31,lc
1580 j2=0:j3=0
1590 g$=UPPER$(INKEY$)
1600 IF g$="" THEN GOTO 1590
1610 SOUND 2,250,2
1620 IF g$="1" THEN g$="0"
1630 zz=INSTR(z$,g$)
1640 IF zz>0 THEN PRINT g$(zz);" of ";
1650 IF g$=CHR$(32) THEN GOSUB 2960:GOSUB 2560:RETURN
1660 IF g$=CHR$(127) THEN RETURN
1670 IF g$="E" THEN GOTO 3260
1680 IF INSTR(z$,g$)=0 THEN SOUND 2,600:GOTO 1590
1690 WHILE INKEY$<>"":WEND
1700 h$=UPPER$(INKEY$)
1710 IF h$="" THEN GOTO 1700
1720 SOUND 2,400,2
1730 IF h$=CHR$(32) THEN GOSUB 2960:GOSUB 2560:RETURN
1740 IF h$=CHR$(127) THEN RETURN
1750 IF h$="E" THEN GOTO 3260
1760 IF INSTR("CDHS",h$)=0 THEN SOUND 2,600:GOTO 1700
1770 n=INSTR("CDHS",h$)
1780 IF n=0 THEN GOTO 1700
1790 LOCATE 31,lc+1:PRINT h$(n)
1800 g$=g$+CHR$(n+225):j1a=1
1810 j1b=d(j1a,1)
1820 IF RIGHT$(c$(j1a,j1b),2)=g$ THEN GOTO 1950
1830 j1b=j1b+1
1840 IF j1b<=d(j1a,2) THEN GOTO 1820
1850 j1a=j1a+1
1860 IF j1a<8 THEN GOTO 1810
1870 j1a=0:j1b=0:j2=1
1880 IF RIGHT$(e$(p),2)=g$ THEN GOTO 1950
1890 j2=0:j3=1
1900 j3=1
1910 IF RIGHT$(f$(j3),2)=g$ THEN GOTO 1950
1920 j3=j3+1
1930 IF j3>4 THEN g$=CHR$(127):j3=0:RETURN
1940 GOTO 1910
1950 RETURN
1960 pf=0
1970 IF tj2 THEN GOSUB 2920:GOSUB 2360:pf=1:GOTO 2190
1980 ORIGIN 0,0,(j1a*4-3)*16,(j1a*4)*16+10,398-j1b*16+2,2
1990 CLG 0
2000 ORIGIN 0,0,0,640,0,400
2010 d(j1a,2)=d(j1a,2)-1
2020 IF d(j1a,2)<d(j1a,1) THEN d(j1a,1)=d(j1a,2)
2030 IF d(j1a,2)=0 THEN GOTO 2190
2040 PEN 2:PAPER 2
2050 FOR j=1 TO 5
2060 LOCATE j1a*4-2,j1b+j-1
2070 PRINT STRING$(4,250):NEXT
2080 q=ASC(RIGHT$(c$(j1a,j1b-1),1))
2090 IF q=226 OR q=229 THEN PEN 1 ELSE PEN 3
2100 LOCATE j1a*4-2,j1b
2110 PRINT MID$(c$(j1a,j1b-1),INSTR(c$(j1a,j1b-1)," ")+1)
2120 LOCATE j1a*4-1,j1b+4
2130 PRINT c$(j1a,j1b-1)
2140 PLOT (j1a*4+4)*16-112,398-j1b*16+18,1
2150 DRAW (j1a*4+4)*16-50,398-j1b*16+18
2160 DRAW (j1a*4+4)*16-50,318-j1b*16+18
2170 DRAW (j1a*4+4)*16-112,318-j1b*16+18
2180 DRAW (j1a*4+4)*16-112,398-j1b*16+18
2190 PEN 2:PAPER 2
2200 FOR j=5 TO 1 STEP -1
2210 LOCATE ((n-1) MOD 2)*5+31,15-(2-6*(n>2)+j)
2220 PRINT STRING$(4,250):NEXT
2230 q=ASC(RIGHT$(f$,1))
2240 IF q=226 OR q=229 THEN PEN 1 ELSE PEN 3
2250 LOCATE ((n-1) MOD 2)*5+31,10-(2-6*(n>2))
2260 IF LEFT$(f$,1)="0" OR LEFT$(f$,1)="1" THEN f$="10"+RIGHT$(f$,1) ELSE f$=" "+f$
2270 PRINT MID$(f$,INSTR(f$," ")+1)
2280 LOCATE ((n-1) MOD 2)*5+32,10-(2-6*(n>2))+4
2290 PRINT f$:f$=RIGHT$(f$,2)
2300 PLOT 480+((n-1) MOD 2)*80,288-96*(n>2),1
2310 DRAW 544+((n-1) MOD 2)*80,288-96*(n>2)
2320 DRAW 544+((n-1) MOD 2)*80,208-96*(n>2)
2330 DRAW 480+((n-1) MOD 2)*80,208-96*(n>2)
2340 DRAW 480+((n-1) MOD 2)*80,286-98*(n>2)
2350 f$(n)=f$:RETURN
2360 e$(p)=""
2370 np=np-1
2380 IF np<0 THEN np=0:RETURN
2390 p=p-1:IF p<1 THEN p=24
2400 IF e$(p)="" AND np>0 THEN GOTO 2390
2410 RETURN
2420 IF tj2 THEN GOTO 2460
2430 j1a=tj1a:j1b=tj1b
2440 IF tj1b<d(tj1a,2) THEN SOUND 2,600:RETURN
2450 IF tj2=0 THEN GOTO 2480
2460 IF RIGHT$(e$(p),1)<>RIGHT$(f$(n),1) THEN SOUND 2,600:RETURN
2470 IF(INSTR(z$,MID$(e$(p),2,1))-INSTR(z$,LEFT$(f$(n),1)))<>1 THEN SOUND 2,600:RETURN ELSE GOTO 2500
2480 IF RIGHT$(c$(j1a,j1b),1)<>RIGHT$(f$(n),1) THEN SOUND 2,600:RETURN
2490 IF (INSTR(z$,MID$(c$(j1a,j1b),2,1))-INSTR(z$,LEFT$(f$(n),1)))<>1 THEN SOUND 2,600:RETURN
2500 GOSUB 1960:RETURN
2510 ee=0:FOR j=1 TO 7
2520 IF d(j,2)=0 THEN ee=j:j=7
2530 NEXT
2540 IF ee=0 THEN RETURN
2550 ct=0:j1a=ee:j1b=0:RETURN
2560 IF np=0 THEN GOTO 3220
2570 PEN 1:PAPER 0:LOCATE 33,16
2580 PRINT"Twist":FOR xx=1 TO 3
2590 IF np1>np OR np<2 THEN GOSUB 2790
2600 IF np1>1 AND np2=1 THEN GOSUB 2850
2610 p=p+1
2620 IF ct>np THEN GOTO 3000
2630 IF p>24 THEN p=1
2640 IF e$(p)="" THEN GOTO 2610
2650 PEN 2:PAPER 2:FOR m=1 TO 5
2660 LOCATE 36,19+m
2670 PRINT STRING$(4,250):NEXT
2680 n=ASC(RIGHT$(e$(p),1))
2690 IF n=226 OR n=229 THEN PEN 1 ELSE PEN 3
2700 LOCATE 36,20
2710 PRINT MID$(e$(p),INSTR(e$(p)," ")+1)
2720 LOCATE 37,24:PRINT e$(p)
2730 PLOT 560,96,1:DRAW 622,96
2740 DRAW 622,16:DRAW 560,16
2750 DRAW 560,96
2760 FOR xx1=1 TO 100:NEXT
2770 np1=np1+1:NEXT
2780 ct=ct+1:RETURN
2790 np1=1:PLOT 480,96,0
2800 DRAW 542,96:PEN 0:PAPER 0
2810 np2=1:FOR zz=1 TO 5
2820 LOCATE 31,19+zz
2830 PRINT STRING$(4,250):NEXT
2840 RETURN
2850 PEN 1:PAPER 2:np2=0
2860 FOR zz=1 TO 5
2870 LOCATE 31,19+zz
2880 PRINT STRING$(4,250):NEXT
2890 PLOT 480,96,1:DRAW 542,96
2900 DRAW 542,16:DRAW 480,16
2910 DRAW 480,96:RETURN
2920 PEN 2:PAPER 2:FOR m=1 TO 5
2930 LOCATE 36,19+m
2940 PRINT STRING$(4,250):NEXT
2950 RETURN
2960 ORIGIN 0,0,480,620,112,192
2970 CLG 0
2980 ORIGIN 0,0,0,640,0,400
2990 SOUND 2,100,3:RETURN
3000 GOSUB 2960
3010 PEN 1:PAPER 0:LOCATE 31,14
3020 PRINT"You  lost"
3030 LOCATE 31,15:PRINT"this game"
3040 SOUND 2,2000,200
3050 LOCATE 33,17:PRINT "Press"
3060 LOCATE 33,18:PRINT "SPACE"
3070 WHILE INKEY$<>"":WEND
3080 WHILE INKEY(47)<0:WEND
3090 GOTO 150
3100 GOSUB 2960
3110 PEN 1:PAPER 0:LOCATE 31,14
3120 PRINT"Well done"
3130 LOCATE 32,15:PRINT"you win"
3140 FOR jj=100 TO 35 STEP -1
3150 SOUND 2,jj,5:NEXT
3160 GOTO 3050
3170 pp=0:FOR pp1=1 TO 7
3180 IF d(pp1,1)>1 THEN pp=1
3190 NEXT
3200 IF pp=0 AND np=0 THEN GOTO 3100
3210 RETURN
3220 PEN 0:PAPER 0:FOR pp=19 TO 24
3230 LOCATE 36,pp
3240 PRINT STRING$(4,250):NEXT
3250 RETURN
3260 GOSUB 2960
3270 PEN 1:PAPER 0
3280 LOCATE 31,14:PRINT"End game"
3290 LOCATE 31,16:PRINT"Are you"
3300 LOCATE 31,17:PRINT"sure?"
3310 WHILE INKEY$<>"":WEND
3320 i$=UPPER$(INKEY$)
3330 IF i$="" THEN GOTO 3320
3340 IF i$="N" THEN g$=CHR$(127):h$=CHR$(127):GOTO 2960
3350 IF i$<>"Y" THEN GOTO 3320
3360 GOTO 150
3370 CLS
3380 PLOT 1000,1000,3
3390 FOR jj=0 TO 638 STEP 6
3400 MOVE jj,0:DRAW jj,398:NEXT
3410 PLOT 1000,1000,2
3420 FOR jj=0 TO 398 STEP 6
3430 MOVE 0,jj:DRAW 638,jj:NEXT
3440 kk=0:FOR jj=0 TO 92
3450 PLOT jj*6+kk*3,jj*4,1
3460 DRAW 638-jj*6,jj*4+kk*2
3470 DRAW 638-jj*6-kk*3,398-jj*4
3480 DRAW jj*6,398-jj*4-kk*2
3490 DRAW jj*6+kk*3,jj*4
3500 kk=kk+1:NEXT:GOSUB 3990
3510 RESTORE 3890
3520 FOR n=1 TO 5:READ j$(n):NEXT
3530 FOR n=1 TO 5:READ z$
3540 j$(n)=j$(n)+z$:NEXT
3550 j$(0)=STRING$(34,32)
3560 j$(6)=j$(0):PEN 0:PAPER 3
3570 FOR n=0 TO 6:LOCATE 4,n+2
3580 FOR p=1 TO LEN(j$(n))
3590 IF MID$(j$(n),p,1)="*" THEN PRINT CHR$(251); ELSE PRINT " ";
3600 NEXT:NEXT
3610 PLOT 48,272,2:DRAW 590,272
3620 DRAW 590,382:DRAW 48,382
3630 DRAW 48,272:PEN 2:PAPER 0
3640 LOCATE 13,10
3650 PRINT" By Robin Nixon "
3660 PEN 1:PAPER 2:LOCATE 5,11
3670 PRINT" (c) Computing with the Amstrad "
3680 PEN 1:PAPER 0:FOR jj=13 TO 22
3690 LOCATE 2,jj
3700 PRINT STRING$(38,250);:NEXT
3710 PLOT 16,48,2:DRAW 622,48
3720 DRAW 622,208:DRAW 16,208
3730 DRAW 16,48:PEN 3:PAPER 2
3740 LOCATE 3,14
3750 PRINT" Press the following to pick a card "
3760 PEN 0:PAPER 3:LOCATE 8,16
3770 PRINT" A 2 3 4 5 6 7 8 9 1 J Q K "
3780 LOCATE 8,17
3790 PRINT"          C D H S          "
3800 PEN 3:PAPER 2:LOCATE 11,19
3810 PRINT" SPACE = Twist       "
3820 LOCATE 11,20
3830 PRINT"   DEL = Delete move "
3840 LOCATE 11,21
3850 PRINT"     E = End game    "
3860 PEN 2:PAPER 0:LOCATE 10,24
3870 PRINT" Press SPACE  to start "
3880 RETURN
3890 DATA " *** *** *** ***"
3900 DATA " * * * *  *   * "
3910 DATA " *** ***  *   * "
3920 DATA " *   * *  *   * "
3930 DATA " *   * *  *  ***"
3940 DATA " *** *  * *** *** "
3950 DATA " *   ** * *   *   "
3960 DATA " **  **** *   **  "
3970 DATA " *   * ** *   *   "
3980 DATA " *** *  * *** *** "
3990 FOR jj=1 TO 1000:NEXT
4000 FOR jj=0 TO 398 STEP 2
4010 PLOT 0,jj,2
4020 PLOT 638,jj,2
4030 IF jj=0 OR jj=398 THEN kk=2 ELSE kk=1
4040 PLOT 2,jj,kk:DRAW 636,jj
4050 NEXT
4060 RETURN