1 REM Ins{nd av Lennart Einarsson <6554> 1986-06-01 19.15.21 10 REM +++++++++++++++++++++++++++++++++ 20 REM ! Program GOMOKU 30 REM ! Utg}va 3.3 1980-11-01 40 REM ! av (c) Bernt Nilsson 50 REM ! L Y S A T O R 60 REM ! Link|pings Tekniska H|gskola 70 REM ! Minne 16 Kbytes ABC80 & 40tkn 80 REM +++++++++++++++++++++++++++++++++ 90 H$="GOMOKU 3(3) 801101 " 100 REM (0)=>SPELAREN (1)=>DATORN 110 DATA 5,10,15,30,100,200,1000,10000 120 RANDOMIZE 130 M%=18% : M2%=M%/2% : C=1%/10% 140 K0%=0% : R0%=1% : ]9%=15% 150 DIM B%(M%,M%),L%(12%) 160 DIM D$=1%,P$=1%,B$=1% 170 DIM ]%(]9%),X%(]9%),Y%(]9%) 180 P$='X' : D$='O' 190 DIM V%(4%,1%) 200 FOR I%=1% TO 4% 210 READ V%(I%,0%),V%(I%,1%) : NEXT I% 220 GOSUB 1900 : GOSUB 1130 : W%=0% 230 GOSUB 1830 240 IF X1%<>0% OR Y1%<>0% 330 250 X9%=9% : Y9%=9% 260 ; CUR(20%,0%); 270 ; "Ingen fr|jdepinne - "; 280 ; "tangentbordet:" 290 ; "QWE-upp,ZXC-ner,QAZ-"; 300 ; "v{nster,EDC-h|ger" 310 ; "S eller 'ret'-drar,'<-'-}ngrar" 320 K9%=-1% 330 W%=0% : ]%=0% : ]1%=0% 340 GOSUB 1260 : REM get move 350 S%=-2% : GOSUB 580 360 IF NOT W% 400 370 ; CUR(22%,0%)'Du vinner!!'; 380 REM modify prior ???? 390 GOTO 450 400 GOSUB 1070 : REM plausibel move(1) 410 ; CUR(Y%+R0%,X%*2%+K0%)D$; 420 S%=-1% : GOSUB 580 430 IF NOT W% 340 440 ; CUR(22%,0%)'Jag vinner!!'; 450 REM restart 460 ; ' Nytt spel (J/N)? '; 470 GOTO 490 480 GOSUB 1830 490 GET F$ : IF F$="N" END 500 IF NOT (F$="J") GOTO 480 510 GOTO 220 520 IF J1% ; 'ok'; : GOTO 220 530 IF NOT N1% 480 540 ; CUR(22%,0%)TAB(39%); 550 IF S%=-1% GOSUB 640 560 GOSUB 640 570 W%=0% : GOTO 340 580 REM udat push x%,y%,b%(y%,x%) 590 ]%=(]%+1%) AND ]9% 600 ]1%=]1%-(]1%<=]9%) 610 X%(]%)=X% : Y%(]%)=Y% 620 ]%(]%)=B%(Y%,X%) 630 GOSUB 720 : RETURN 640 REM undo -}%,}1% 650 IF ]1%=0% RETURN 660 X%=X%(]%) : Y%=Y%(]%) 670 S%=]%(]%) : GOSUB 720 680 B%(Y%,X%)=]%(]%) 690 ]%=(]%-1%) AND ]9% 700 ]1%=]1%+(]1%>0%) 710 RETURN 720 REM udat (x%,y%),s% 730 G%=B%(Y%,X%) 740 R%=Y%+R0% : K%=X%*2%+K0% 750 A%=31744%+K%+R%/8%*40%+(R%-R%/8%*8%)*128% 760 POKE A%,PEEK(A%) XOR 128% 770 FOR D%=-1% TO 2% : REM riktning 780 X1%=SGN(D%) : Y1%=ABS(SGN(D%-1%)) 790 FOR I%=-6% TO 6% : REM h{mta linje 800 X2%=X%+X1%*I% : Y2%=Y%+Y1%*I% 810 IF (X2%>M%) OR (Y2%>M%) OR (X2%<0%) OR (Y2%<0%) L%(I%+6%)=-3% ELSE L%(I%+6%)=B%(Y2%,X2%) 820 NEXT I% 830 FOR P%=-2% TO -1% 840 L%(6%)=G% : U%=-1% : GOSUB 910 850 L%(6%)=S% : U%=1% : GOSUB 910 860 NEXT P% 870 FOR I%=-6% TO 6% : REM spara linje 880 IF L%(I%+6%)<>-3% B%(Y%+Y1%*I%,X%+X1%*I%)=L%(I%+6%) 890 NEXT I% : NEXT D% 900 GOSUB 1200 : RETURN 910 REM udatlinje l%(),p%,u% 920 FOR I%=1% TO 7% 930 IF (L%(I%)=-3%) OR (L%(I%-1%)=P%) OR (L%(I%+5%)=P%) 1060 940 N%=0% 950 FOR J%=I% TO I%+4% : L%=L%(J%) 960 IF (L%=-3%) OR (L%=-3%-P%) 1060 970 IF L%=P% N%=N%+1% 980 NEXT J% : REM obruten 5 sekvens 990 IF N%=0% 1060 1000 IF N%=5% W%=-1% : GOTO 1060 1010 REM modifiera prior 1020 V%=V%(N%,2%+P%)*U% 1030 FOR J%=I% TO I%+4% : L%=L%(J%) 1040 IF L%>-1% L%(J%)=L%+V% 1050 NEXT J% 1060 NEXT I% : RETURN 1070 REM plausibel move (1) 1080 V%=-1% 1090 FOR I%=0% TO M% 1100 FOR J%=0% TO M% 1110 IF B%(I%,J%)>V% X%=J% : Y%=I% : V%=B%(I%,J%) 1120 NEXT J% : NEXT I% : RETURN 1130 IF PEEK(590%)<>40% ; INP(3%) 1140 ; CHR$(12%)H$; 1150 FOR Y%=0% TO M% 1160 FOR X%=0% TO M% 1170 B%(Y%,X%)=(M%-ABS(X%-M2%)-ABS(Y%-M2%))*RND*C 1180 GOSUB 1200 : NEXT X% 1190 NEXT Y% : RETURN 1200 REM put x%,y% 1210 B$='.' : B%=B%(Y%,X%) 1220 IF B%=-1% B$=D$ 1230 IF B%=-2% B$=P$ 1240 ; CUR(Y%+R0%,X%*2%+K0%)B$; 1250 RETURN 1260 REM get move 1270 IF K9% 1500 1280 X%=0% : Y%=0% 1290 GOSUB 1830 1300 IF NOT J1% 1350 1310 GOSUB 1830 : IF J1% 1310 1320 IF B%(Y%,X%)>-1% RETURN 1330 ; CUR(23%,0%)'Illegalt drag'; 1340 T%=100% 1350 IF T%>0% T%=T%-1% 1360 IF T%=1% ; CUR(23%,0%)TAB(39%); 1370 IF NOT N1% 1430 1380 GOSUB 1830 : IF N1% 1380 1390 GOSUB 1200 1400 REM undo 1410 GOSUB 640 : GOSUB 640 1420 GOTO 1260 1430 X2%=X1%*.24 : Y2%=Y1%*.24 1440 IF (X2%=X%) AND (Y2%=Y%) 1290 1450 GOSUB 1200 : X%=X2% : Y%=Y2% 1460 R%=Y%+R0% : K%=X%*2%+K0% 1470 A%=31744%+K%+R%/8%*40%+(R%-R%/8%*8%)*128% 1480 POKE A%,PEEK(A%) OR 128% 1490 GOTO 1290 1500 REM get key bord 1510 \%=1% 1520 X%=X9% : Y%=Y9% : GOSUB 1200 1530 ; CUR(R0%+Y9%,K0%+X9%*2%); 1540 GET C$ : C%=ASC(C$) 1550 C1%=INSTR(1%,"QWE",C$) 1560 X9%=X9%-\%*(C1%>0%)*(C1%-2%) 1570 C1%=INSTR(1%,"ASD",C$) 1580 X9%=X9%-\%*(C1%>0%)*(C1%-2%) 1590 C1%=INSTR(1%,"ZXC",C$) 1600 X9%=X9%-\%*(C1%>0%)*(C1%-2%) 1610 C1%=INSTR(1%,"QAZ",C$) 1620 Y9%=Y9%-\%*(C1%>0%)*(C1%-2%) 1630 C1%=INSTR(1%,"WSX",C$) 1640 Y9%=Y9%-\%*(C1%>0%)*(C1%-2%) 1650 C1%=INSTR(1%,"EDC",C$) 1660 Y9%=Y9%-\%*(C1%>0%)*(C1%-2%) 1670 IF X9%<0% X9%=0% 1680 IF X9%>M% X9%=M% 1690 IF Y9%<0% Y9%=0% 1700 IF Y9%>M% Y9%=M% 1710 IF C$="S" OR C%=13% 1770 1720 IF C$>"9" OR C$<"1" 1740 1730 \%=C%-48% : GOTO 1540 1740 IF C%<>8% 1500 1750 GOSUB 640 : GOSUB 640 1760 GOTO 1500 1770 IF B%(Y9%,X9%)<0% 1790 1780 X%=X9% : Y%=Y9% : RETURN 1790 ; CUR(23%,0%)"Illegalt drag"; 1800 IF PEEK(65013%)=0% 1800 1810 ; CUR(23%,0%)" "; 1820 GOTO 1540 1830 REM * Read Joystick * 1840 Z%=CALL(65408%,1%) 1850 Y1%=SWAP%(Z%) AND 255% 1860 X1%=Z% AND 255% 1870 J1%=(INP(58%) AND 4%)=0% 1880 N1%=(INP(58%) AND 2%)=0% 1890 RETURN 1900 REM * pokedriver-seq * 1910 POKE 65408,123,230,3,40,57,95,33 1920 POKE 65415,240,253,126,190,40,253,22 1930 POKE 65422,8,205,155,255,77,22,16 1940 POKE 65429,205,155,255,97,251,201,175 1950 POKE 65436,211,58,122,211,58,6,10 1960 POKE 65443,16,254,33,233,255,35,219 1970 POKE 65450,58,163,40,250,203,36,48 1980 POKE 65457,4,46,0,24,7,62,79 1990 POKE 65464,189,48,2,46,79,201,215 2000 POKE 65471,141 2010 RETURN 2020 REM * pokedriver-end *