10 REM KALAH ===================C64 20 REM (P) COMMODORE DISC 30 REM ============================ 40 REM (C) R. RUDERT 50 REM 60 REM 70 REM BASIC 2.0 80 REM C64 90 REM ============================ 100 REM VERSION 2.1.87 110 DIM FR(13,2),F(5,2,7) 120 SG=0:CL$=CHR$(147) 130 RF=15:BF=13:POKE 53280,RF:POKE 53281,BF:C=0:POKE 646,C 140 GOSUB 2090:REM MENUE 150 GOSUB 1540:REM INITIALISIERUNG 160 REM *************************** 170 IF S1=1 AND R=-1 OR S2=1 AND R=1 THEN GOSUB 1400:REM ZUGEINGABE 180 IF S1=-1 AND R=-1 OR S2=-1 AND R=1 THEN GOSUB 870:REM COMPUTERZUG 190 IF SG=1 THEN GOSUB 2570:GOTO 120 200 R=-R:GOTO 170 210 END 220 REM************************** 230 REM PROC:KOPIEREN SPIELFELD 240 REM AUF HOEHERE EBENE + 250 REM ZUGUNTERSUCHUNG 260 T1=T-1:FOR I=1 TO 7:F(T,0,I)=F(T1,0,I):F(T,2,I)=F(T1,2,I):NEXT 270 REM************************** 280 Z2=0:RP=1+R:RM=1-R 290 FD=F(T,RP,Z):F(T,RP,Z)=0 300 IE=7:IF FD<7-Z THEN IE=Z+FD:FD=0:GOTO 320 310 FD=FD-7+Z 320 FOR Z=Z+1 TO IE 330 F(T,RP,Z)=F(T,RP,Z)+1:NEXT 340 IF F(T,RP,7)>=Z6 THEN D(T)=999:RETURN 350 IF FD<1 AND Z<>8 THEN 460 360 Z2=1:IE=6:IF FD<6 THEN IE=FD:FD=0:GOTO 380 370 FD=FD-6 380 FOR Z=1 TO IE 390 F(T,RM,Z)=F(T,RM,Z)+1:NEXT 400 IF FD>0 THEN Z=0:GOTO 300 410 IF F(T,RM,Z-1)<>2 AND F(T,RM,Z-1)<>3 THEN 470 420 F(T,RP,7)=F(T,RP,7)+F(T,RM,Z-1):F(T,RM,Z-1)=0 430 IF F(T,RP,7)>=Z6 THEN D(T)=999:RETURN 440 Z=Z-1:IF Z>0 GOTO 410 450 GOTO 470 460 IF Z2=1 AND F(T,RP,Z-1)>0 THEN Z=Z-1:Z2=0:GOTO 290 470 SU=0:FOR I=1 TO 6:SU=SU+F(T,RP,I):IF SU<>0 THEN 520 480 NEXT 490 SU=0:FOR I=1 TO 6:SU=SU+F(T,RM,I):F(T,RM,I)=0 500 NEXT 510 F(T,RP,7)=F(T,RP,7)+SU:IF F(T,RP,7)>=Z6 THEN D(T)=999:RETURN 520 D(T)=F(T,RP,7)-F(T,RM,7):RETURN 530 REM*************************** 540 REM PROC:ZUGDURCHFUEHRUNG 550 Z2=0:RP=1+R:RM=1-R 560 FD=F(0,RP,Z):F(0,RP,Z)=0:O=R:GOSUB 2360 570 IE=7:IF FD<7-Z THEN IE=Z+FD:FD=0:GOTO 590 580 FD=FD-7+Z 590 FOR Z=Z+1 TO IE 600 F(0,RP,Z)=F(0,RP,Z)+1:O=R:GOSUB 2360:NEXT 610 IF F(0,RP,7)>=Z6 THEN SG=1 620 IF FD<1 AND Z<>8 THEN 750 630 IF FD<1 THEN 760 640 Z2=1:IE=6:IF FD<6 THEN IE=FD:FD=0:GOTO 660 650 FD=FD-6 660 FOR Z=1 TO IE 670 F(0,RM,Z)=F(0,RM,Z)+1:O=-R:GOSUB 2360:NEXT 680 IF FD>0 THEN Z=0:GOTO 570 690 IF F(0,RM,Z-1)<>2 AND F(0,RM,Z-1)<>3 THEN 760 700 F(0,RP,7)=F(0,RP,7)+F(0,RM,Z-1):I=Z:Z=7:O=R:GOSUB 2360:Z=I 710 IF F(0,RP,7)>=Z6 THEN SG=1 720 Z=Z-1:F(0,RM,Z)=0:O=-R:GOSUB 2360:Z=Z+1 730 Z=Z-1:IF Z>0 GOTO 690 740 RETURN 750 IF Z2=1 AND F(0,RP,Z-1)>0 THEN Z=Z-1:Z2=0:GOTO 560 760 SU=0:FOR I=1 TO 6:SU=SU+F(0,RP,I):IF SU<>0 GOTO 800 770 NEXT 780 SU=0:FOR Z=1 TO 6:SU=SU+F(0,RM,Z):F(0,RM,Z)=0:O=-R:GOSUB 2360:NEXT 790 GOTO 830 800 SU=0:FOR I=1 TO 6:SU=SU+F(0,RM,I):IF SU<>0 GOTO 840 810 NEXT 820 SG=1:RETURN 830 F(0,RP,7)=F(0,RP,7)+SU:Z=7:O=R:GOSUB 2360:SG=1 840 RETURN 850 REM************************** 860 REM PROC:COMPUTERZUG 870 IF SD>0 GOTO 910 880 Z=INT(RND(1)*6+1) 890 IF F(T,1+R,Z)=0 GOTO 880 900 ZM=Z:GOTO 1340 910 T=1:D(0)=-999 920 FOR I1=1 TO 6 930 :IF F(0,1+R,I1)=0 GOTO 1330 940 :Z=I1:GOSUB 260 950 :IF SD=1 GOTO 1310 960 :T=2:R=-R:D(1)=-999 970 FOR I2=1 TO 6 980 :IF F(1,1+R,I2)=0 GOTO 1290 990 :Z=I2:GOSUB 260 1000 :IF SD=2 GOTO 1270 1010 :T=3:R=-R:D(2)=-999 1020 FOR I3=1 TO 6 1030 :IF F(2,1+R,I3)=0 GOTO 1250 1040 :Z=I3:GOSUB 260 1050 :IF SD=3 GOTO 1230 1060 :T=4:R=-R:D(3)=-999 1070 FOR I4=1 TO 6 1080 :IF F(3,1+R,I4)=0 GOTO 1210 1090 :Z=I4:GOSUB 260 1100 :IF SD=4 GOTO 1190 1110 :T=5:R=-R:D(4)=-999 1120 FOR I5=1 TO 6 1130 :IF F(4,1+R,I5)=0 GOTO 1170 1140 :Z=I5:GOSUB 260 1150 :IF -D(5)>D(4) THEN D(4)=D(5) 1160 :IF D(5)>-D(3) THEN I5=6 1170 NEXT 1180 :T=4:R=-R:D(4)=-D(4) 1190 :IF D(4)>D(3) THEN D(3)=D(4) 1200 :IF D(4)>-D(2) THEN I4=6 1210 NEXT 1220 :T=3:R=-R:D(3)=-D(3) 1230 :IF D(3)>D(2) THEN D(2)=D(3) 1240 :IF D(3)>-D(1) THEN I3=6 1250 NEXT 1260 :T=2:R=-R:D(2)=-D(2) 1270 :IF D(2)>D(1) THEN D(1)=D(2) 1280 :IF D(2)>-D(0) THEN I2=6 1290 NEXT 1300 :T=1:R=-R:D(1)=-D(1) 1310 :IF D(1)>D(0) THEN D(0)=D(1):ZM=I1 1320 :IF D(1)=D(0) AND INT(I1*RND(1))>3 THEN D(0)=D(1):ZM=I1 1330 NEXT:T=0 1340 X=1968+R*15:POKE X,ZM+3+R*3:FOR I=X-9TOX-2:POKEI,PEEK(I)-128:NEXT 1350 Z=ZM:GOSUB 550 1360 X=X-R*30:POKE X,32:FOR I=X-9TOX-2:POKEI,PEEK(I)+128:NEXT:GET K$ 1370 RETURN 1380 REM************************** 1390 REM PROC:ZUGEINGABE 1400 IH=1:GOSUB 2700 1410 GET IZ$:IF LEN(IZ$)=0 GOTO 1410 1420 Z=ASC(IZ$)-64 1430 IF Z<4+3*R GOTO 1400 1440 IF Z>68 AND Z<73 THEN GOSUB 2790:GOTO 1400 1450 IF Z>9+3*R GOTO 1400 1460 IF R>0 THEN Z=Z-6 1470 IF F(0,1+R,Z)=0 GOTO 1400 1480 X=1968+R*15:POKE X,ASC(IZ$)-64:FOR I=X-9TOX-2:POKEI,PEEK(I)-128:NEXT 1490 GOSUB 550 1500 X=X-R*30:POKE X,32:FOR I=X-9TOX-2:POKEI,PEEK(I)+128:NEXT 1510 RETURN 1520 REM************************** 1530 REM PROC:INITIALISIERUNG 1540 A=53281:B=PEEK(646):C=PEEK(A):POKEA,B:PRINTCL$;:POKEA,C 1550 FOR I=0 TO 2 STEP 2:FOR J=1 TO 6 1560 F(0,I,J)=Z 1570 NEXT:NEXT 1580 Z6=Z*6:R=-1 1590 REM MASCHINENPROGRAMM FUER FARBWECHSEL 1600 FOR I=1 TO 25:READ X:POKE 49151+I,X:NEXT 1610 DATA 169,0,133,250,168,169,216,133 1620 DATA 251,162,4,173,134,2,145,250 1630 DATA 200,208,251,230,251,202,208 1640 DATA 246,96 1650 F(0,0,7)=0:F(0,2,7)=0 1660 FOR I=0 TO 35 STEP 5 1670 POKE 1064+I,236:POKE 1068+I,116 1680 POKE 1824+I,119:POKE 1828+I,96 1690 FOR J=0 TO 680 STEP 40 1700 POKE 1104+I+J,97:POKE 1108+I+J,116 1710 NEXT 1720 FOR J=0 TO 2 1730 POKE 1065+J+I,226 1740 IF I=0 OR I=35 GOTO 1800 1750 POKE 1425+J+I,119 1760 POKE 1465+J+I,226 1770 POKE 1464+I,236:POKE 1468+I,116 1780 POKE 1424+I,119:POKE 1428+I,96 1790 POKE 1866+I,I/5:POKE 1026+I,13-I/5 1800 POKE 1825+J+I,119 1810 NEXT:NEXT 1820 POKE 1963,148 1830 POKE 211,20:POKE 214,23:SYS 58640 1840 PRINT RIGHT$(STR$(SD),1) 1850 SI=54272:FL=SI:FH=SI+1:W=SI+4:A=SI+5:H=SI+6 1860 POKE SI+24,15:POKE SI+3,7 1870 REM FREQUENZEN EINLESEN 1880 FOR I=1 TO 13:READ FR(I,1),FR(I,2):NEXT 1890 DATA 8,180,9,196,10,247,11,158 1900 DATA 13,10,14,162,16,109,17,103 1910 DATA 19,137,21,237,23,59,26,20 1920 DATA 52,39 1930 FOR I=1 TO 6 1940 :Z=I 1950 :O=-1:GOSUB 2360 1960 :O=+1:GOSUB 2360 1970 NEXT 1980 POKE 211,0:POKE 214,23:SYS 58640 1990 PRINTCHR$(18);"SPIELER1";CHR$(146);":" 2000 POKE 211,30:POKE 214,23:SYS 58640 2010 PRINT"SPIELER2:"; 2020 IF S1=-1 THEN POKE 1988,131:GOTO 2040 2030 POKE 1988,141 2040 IF S2=-1 THEN POKE 2018,131:GOTO 2060 2050 POKE 2018,141 2060 RETURN 2070 REM************************** 2080 REM PROC:MENUE 2090 PRINT CL$;SPC(13);"K A H L A H" 2100 PRINT:PRINT:PRINT 2110 PRINT "ZAHL DER STEINE PRO FELD (1..9)"; 2120 GET Z$:IF LEN(Z$)=0 GOTO 2120 2130 Z=ASC(Z$)-48 2140 IF Z<1 OR Z>9 GOTO 2120 2150 PRINT Z 2160 PRINT:PRINT "ERSTER SPIELER (M.ENSCH/C.OMPUTER) "; 2170 GET S1$:IF LEN(S1$)=0 GOTO 2170 2180 IF S1$="M" THEN S1=1 2190 IF S1$="C" THEN S1=-1 2200 IF S1$<>"M" AND S1$<>"C" GOTO 2170 2210 PRINT S1$ 2220 PRINT:PRINT "ZWEITER SPIELER (M.ENSCH/C.OMPUTER) "; 2230 GET S2$:IF LEN(S2$)=0 GOTO 2230 2240 IF S2$="M" THEN S2=1 2250 IF S2$="C" THEN S2=-1 2260 IF S2$<>"M" AND S2$<>"C" GOTO 2230 2270 PRINT S2$ 2280 PRINT:PRINT"SPIELSTAERKE (0..5) "; 2290 GET SD$:IF LEN(SD$)=0 GOTO 2290 2300 IF SD$<"0" OR SD$>"5" GOTO 2290 2310 PRINT SD$ 2320 SD=ASC(SD$)-48 2330 RETURN 2340 REM************************** 2350 REM PROC:NEUE STELLUNG 2360 IH=Z+3*(1+O) 2370 FZ=INT(F(0,1+O,Z)/10) 2380 FE=F(0,1+O,Z)-FZ*10 2390 IF O<0 THEN IA=Z*5+1:IB=480:IU=800 2400 IF O>0 THEN IA=36-Z*5:IB=80:IU=400 2410 IF Z=7 THEN IB=80:IU=800:IH=13 2420 FOR J=1 TO 24 2430 IF FZ=0 GOTO 2470 2440 POKE 1024+IB+IA,81:FZ=FZ-1:IB=IB+40:IFIB=IU THENIB=280-O*200:IA=IA+1 2450 NEXT 2460 FOR J=1 TO 24 2470 IF FE=0 GOTO 2500 2480 POKE 1024+IB+IA,87:FE=FE-1:IB=IB+40:IFIB=IU THENIB=280-O*200:IA=IA+1 2490 NEXT 2500 IF IA=Z*5+4 AND O=-1 THEN GOSUB 2700:RETURN 2510 IF IA=39-Z*5 AND O=1 THEN GOSUB 2700:RETURN 2520 SC=1024+IB+IA:IF PEEK(SC)=32 THEN GOSUB 2700:RETURN 2530 POKE SC,32:IB=IB+40:IF IB=IU THEN IB=280-O*200:IA=IA+1 2540 GOTO 2500 2550 REM************************** 2560 REM PROC:GEWINNNANZEIGE 2570 POKE 211,15:POKE 214,24:SYS 58640 2580 PRINT "SPIELENDE";CHR$(145); 2590 IH=6:POKE 53280,3:POKE 53280,4 2600 GET K$:IF LEN(K$)=0 GOTO 2590 2610 X$="2":IF F(0,0,7)>F(0,2,7) THEN X$="1" 2620 PRINT CL$;"GEWONNEN HAT SPIELER ";X$ 2630 PRINT:PRINT "NOCH EIN SPIEL? (J/N)"; 2640 GET K$:IF K$="" THEN 2640 2650 IF K$="N" THEN END 2660 IF K$="J" THEN PRINT K$:RESTORE:RETURN 2670 GOTO 2640 2680 REM************************* 2690 REM PROC:SIGNAL 2700 POKE A,16+5 2710 POKE H,8*16 2720 POKE FH,FR(IH,1):POKE FL,FR(IH,2) 2730 POKE W,33 2740 FOR J=1 TO 100:NEXT 2750 POKE W,0:POKE A,0:POKE H,0 2760 RETURN 2770 REM************************** 2780 REM PROC:SCREENFARBE AENDERN 2790 ON Z-68 GOTO 2800,2820,2840,2850 2800 RF=RF+1:IF RF>15 THEN RF=0 2810 POKE 53280,RF:RETURN 2820 BF=BF+1:IF BF>15 THEN BF=0 2830 POKE 53281,BF:RETURN 2840 C=C+1:POKE 646,C:SYS 49152:RETURN 2850 SD=SD+1:IF SD=6 THEN SD=0 2860 POKE 1964,SD+48 2870 RETURN 2880 REM KALAH ==================64 2890 REM 38911 BYTES MEMORY == 2900 REM 07601 BYTES PROGRAM == 2910 REM 01340 BYTES VARIABLES == 2920 REM 00000 BYTES STRINGS == 2930 REM 29970 BYTES FREE == 2940 REM ==========================