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