Hoppa över logotypen.

Othello för Commodore 64


[ Download D64 ]

Historien om min Commodore 64-anpassning

Innan jag fick råd att köpa en egen Commodore 64 lekte jag en del med en ABC 80 som min far hade på sin arbetsplats. De använde den för inventeringsrutiner och elektriska beräkningar, men det fanns också några demodisketter med spel på, bland annat ett Othello-spel som jag gillade. När jag fick min Commodore 64 ville jag ha Othello på den. Eftersom spelet var skrivet i BASIC passade jag på att skriva ut det på jobbets skrivare och ta med hem, för att så översätta till Commodore-BASIC.

Ett stort problem med Commodore 64:s Microsoft-BASIC är att den är så extremt långsam, i alla fall jämfört med ABC 80 (i en jämförelse citerad på Wikipedia är ABC 80-BASIC mellan två och sex gånger snabbare, beroende på test). Eftersom jag hade fått tag på en BASIC-kompilator för Commodore 64 så gick det att lösa.

Jag gjorde översättningen 1991, och publicerade det i mitt lilla PD-bibliotek. Jag hade glömt allting till helt nyligen (detta skrivs i 2025) när snubblade över Lemon64:s speldatabas, där det finns en liten sida som beskriver spelet (jag har också hittat det på Internet Archive, där det var bundlat med en annan Othello-variant jag inte skrivit).

Eftersom programmet är kompilerat har inte källkoden varit tillgänglig; den hittade jag på en diskett från 1991 som jag har fått kopierat över till PC, och D64-filen som länkas överst på sidan innehåller BASIC-koden i filen OTHELLO.BAS. Jag har ännu (2025) inte hittat originalet till grafiken som visas vid inläsning.

När jag väl hade hittat källkoden var nyfiken på om jag kunde hitta ABC 80-originalet att jämföra med. Återigen var Internet Archive räddningen. Jag är inte helt säker på att den versionen är 100% identisk med den jag en gång porterade, eftersom radnumren avviker en del, men den ser i alla fall väldigt lik ut.

En oväntad släkting och ett gemensamt ursprung?

Programmet verkar dock komma någon annanstans ifrån tidigare. När jag letade efter spelprogram för min VIC-20 kom jag över en disk med en VIC-20-emulator for Commodore 64, tillsammans med några enkla BASIC-spel som gick att köra i den. Bland dem fanns en VIC-20-implementation av Othello, som också ser väldigt mycket ut som det här spelet, med samma variabelnamn och algoritm. Även om ABC 80 är äldre än VIC-20 så tvivlar jag på att den sistnämnda är en portering av den förstnämnda, så det verkar finnas en gemensam anfader någonstans.

Om någon känner till var den här implementationen kommer från ursprungligen, tveka inte att höra av dig!

Hämta

Filerna på disken är som följer:

OTHELLO
Det här programmet läser in startskärmen.
X
Lägger in svenska tecken och läser in huvudprogrammet.
" (ja, filnamnet är ett ensamt cittattecken)
Det kompilerade programmet. Spelet kan startas direkt med LOADCHR$(34),8:RUN men då läses inte de svenska tecknen in (så det passar bäst på en svensk Commodore 64).
OTHELLO.BAS
Okompilerad version av programmet.
SV TECKEN.SC och SV TECKEN.MC
Rutin för att skapa svensk teckenuppsättning; används av "X". SC är källkod i Mega Assembler-format.
VIEW ART.SC och VIEW ART.MC
Rutin för att visa Art Studio-grafik; används i huvudprogrammet. SC är källkod i Mega Assembler-format.
VIC BOOT och VIC EMULATOR
VIC-20 emulator för Commodore 64.
OTHELLO.VIC
VIC-20-version av Othello, se texten ovanför för information om släktskap med Commodore 64-programmet.

Du kan även hämta hem källkoden här och se en jämförelse mellan min Commodore 64-version och ABC 80-versionen:

Othello för ABC 80 (lagrad som textfil, kan läsas in i en ABC 80-emulator om man klarar att kopiera filen dit på något vis; om du vet hur man gör tar jag gärna emot tips!

Othello för C64 lagrad som en läsbar bastext-fil, som kan konverteras till en binärfil med bastext (tok64 kan också fungera); du kan också se och manipulera källkoden i Stig Christensens BASIC converter.

Othello för VIC-20 lagrad som en läsbar bastext-fil.

Jämförelse av källkod

Min Commodore 64-anpassning är en direkt översättning av ABC 80-versionen (med några små ändringar), som kan ses i den jämförelsen nedan.

Sida-vid-sida-jämförelse
Startskärm
1 POKE53280,.:POKE53281,.:PRINT"{CLEAR}{DOWN*5}{RIGHT*3}{WHITE}(C){LIGHT BLUE} 1979 {YELLOW}LUXOR {GREEN}(ABC-80)
2 PRINT"{DOWN*4}{RIGHT*3}{WHITE}(C) {LIGHT BLUE}1991 {YELLOW}SOFTWOLVES SOFTWARE/MR.P.
3 PRINT,,"{LEFT*2}{BLUE}FÖR C-64 VERSIONEN
4 PRINT"{HOME}{DOWN*24}{SPACE*3}{WHITE}{REVERSE ON} TRYCK MELLANSLAG {REVERSE OFF}{HOME}
7 PRINT"{HOME}{RIGHT*5}--O--T--H--E--L--L--O--6--4--
8 IFPEEK(198)=.THENPOKE646,(PEEK(646)+1)AND15:GOTO7
9 GETB$
10 REM (C) 1979 LUXOR
20 REM (C) 1991 SOFTWOLVES SOFTWARE
30 REM /MR.P.
Initiering
39 D$="{HOME}{DOWN*24}":DIMA(9,9) 50 DIM A%(9,9),I4%(8),J4%(8),C$(8),D$(2)
40 POKE53280,5:POKE53281,5 60 ; CHR$(12);"- O T H E L L O -"
50 GOSUB 2730:REM BRÄDET 70 ; CUR(5,0);
60 REM
Instruktioner
70 PRINTLEFT$(D$,23)"{LIGHT GREEN}BEHÖVER DU INSTRUKTIONER?{HOME} 80 PRINT "Behöver du instruktioner : ";
80 GET X$ 90 INPUT X$
90 IF X$="N" THEN 270 100 IF LEFT$(X$,1)="N" THEN 280
100 IF X$<>"J" THEN 80 110 IF LEFT$(X$,1)<>"J" THEN 90
110PRINT"{CLEAR}{WHITE}"TAB(16)"OTHELLO"TAB(56)"‾‾‾‾‾‾‾ 120 PRINT CHR$(12);
115 PRINT"{CLEAR}{LIGHT GREEN}OTHELLO SPELAS PÅ EN PLAN MED 8X8 RUTOR,"; 130 PRINT "OTHELLO SPELAS PÅ EN PLAN MED 8X8 RUTOR,";
120 PRINT"RAD {WHITE}1{LIGHT GREEN}-{WHITE}8 {LIGHT GREEN}OCH KOLUMN {WHITE}A{LIGHT GREEN}-{WHITE}H{LIGHT GREEN}. MAN STARTAR ALL- 140 PRINT "RAD 1 TILL 8 OCH KOLUMN A TILL H."
130 PRINT"TID MED DETTA MÖNSTER:{DOWN} 150 PRINT "MAN STARTAR ALLTID MED FÖLJANDE MÖNSTER:"
140 PRINTTAB(19)"{BLACK}●{WHITE}●" 160 PRINT " O X"
150 PRINTTAB(19)"{WHITE}●{BLACK}●" 170 PRINT " X O"
160 PRINT"{DOWN}{RIGHT}{LIGHT GREEN}VI TURAS OM ATT LÄGGA EN PJÄS VAR. NÄR 180 ;
170 PRINT"AN LAGT UT EN PJÄS FÅR MAN ALLA MOTSPE- 190 ; "VI TURAS OM ATT LÄGGA 1 PJÄS VAR."
180 PRINT"LARENS PJÄSER MELLAN ENS EGNA OCH DEN 200 ; "NÄR MAN LAGT UT EN PJÄS, FÅR MAN"
190 PRINT"UTLAGDA PJÄSEN.{DOWN} 210 ; "ALLA MOTSPELARENS PJÄSER MELLAN ENS"
200 PRINT"{RIGHT}OBS! MAN MÅSTE 'TA' MINST EN AV MOT- 220 ; "EGNA PJÄSER OCH DEN UTLAGDA PJÄSEN."
210 PRINT"SPELARENS PJÄSER VARJE GÅNG, ANNARS MÅS-"; 230 ; "OBS! MAN MÅSTE 'TA' MINST EN AV"
220 PRINT"TE MAN STÅ ÖVER DRAGET. (DET GÖR MAN 240 ; "MOTSPELARENS PJÄSER VARJE GÅNG, ANNARS"
230 PRINT"{RIGHT}GENOM ATT SVARA '{WHITE}A0{LIGHT GREEN}')" 250 ; "MÅSTE MAN STÅ ÖVER DET DRAGET."
232 PRINT"{DOWN}{RIGHT}MAN KAN, OM MAN VILL, MITT I SPELET 260 ; " DETTA GÖR MAN GENOM ATT SVARA 'A0' ."
233 PRINT"BYTA FÄRGER PÅ PLANEN. SKRIV DÅ: '{WHITE}BF{LIGHT GREEN}' 270 ;
234 PRINT"(STÅR FÖR {WHITE}B{LIGHT GREEN}YTA {WHITE}F{LIGHT GREEN}ÄRG{.*3}) 280 PRINT : ;
240 PRINTLEFT$(D$,23)"{WHITE}TRYCK NÄR DU LÄST KLART{HOME} 290 F2%=0
250 GET A$:IF A$="" THEN 250
Välj nivå
260 GOSUB 2730
270 RESTORE :PRINTLEFT$(D$,23)"{BLACK}SKA JAG SPELA EFTER BÄSTA FÖRMÅGA? {LEFT}"; 300 RESTORE : ; : ; "SKA JAG SPELA EFTER BÄSTA FÖRMÅGA ";
290 S2=0 310 S2%=0
300 GET X$:PRINTX$; 320 INPUT X$
310 IF X$="N" THEN 340 330 IF LEFT$(X$,1)="N" THEN 360
320 IF X$<>"J" THEN 270 340 IF LEFT$(X$,1)<>"J" THEN 320
330 S2=2 350 S2%=2
340 B=-1 360 B%=-1
350 W=1 370 W%=1
Initiering av spelet
360 D$(B+1)="{WHITE}●" 380 D$(B%+1)="X"
370 D$(1)=" " 390 D$(0%+1)=" "
380 D$(W+1)="{BLACK}●" 400 D$(W%+1)="O"
390 FOR K=1 TO 8 410 FOR K%=1 TO 8
400 READ I4(K) 420 READ I4%(K%)
410 NEXT K 430 NEXT K%
420 DATA 0,-1,-1,-1,0,1,1,1 440 DATA 0,-1,-1,-1,0,1,1,1
430 FOR K=1 TO 8 450 FOR K%=1 TO 8
440 READ J4(K) 460 READ J4%(K%)
450 NEXT K 470 NEXT K%
460 DATA 1,1,0,-1,-1,-1,0,1 480 DATA 1,1,0,-1,-1,-1,0,1
470 FOR K=1 TO 8 490 FOR K%=1 TO 8
480 READ C$(K) 500 READ C$(K%)
490 NEXT K 510 NEXT K%
500 DATA A,B,C,D,E,F,G,H 520 DATA "A","B","C","D","E","F","G","H"
510 PRINT 530 PRINT
520 FOR I=0 TO 9 540 FOR I%=0 TO 9
530 FOR J=0 TO 9 550 FOR J%=0 TO 9
540 A(I,J)=0 560 A%(I%,J%)=0
550 NEXT J,I 570 NEXT J%
580 NEXT I%
560 A(4,4)=W 590 A%(4,4)=W%
570 A(5,5)=W 600 A%(5,5)=W%
580 A(4,5)=B 610 A%(4,5)=B%
590 A(5,4)=B 620 A%(5,4)=B%
600 C1=2 630 C1%=2
610 H1=2 640 H1%=2
620 N1=4 650 N1%=4
Välj färg
630 Z=0:PRINTLEFT$(D$,23)"{SPACE*39}{HOME} 660 Z%=0
640 PRINTLEFT$(D$,23)"{LIGHT GREEN}VILL DU HA {WHITE}(V)IT {LIGHT GREEN}ELLER {BLACK}(S)VART?{HOME} 670 PRINT "VILL DU HA X ELLER O";
650 C=W:CC$="{BLACK}" 680 C%=W%
660 H=B:HH$="{WHITE}" 690 H%=B%
670 GET X$ 700 INPUT X$
680 IF X$="V"THEN 720 710 IF X$="X" THEN 750
690 IF X$<>"S" THEN 670 720 IF X$<>"O" THEN 700
700 C=B:CC$="{WHITE}" 730 C%=B%
710 H=W:HH$="{BLACK}" 740 H%=W%
Välj startspelare
720 PRINTLEFT$(D$,23)"{LIGHT GREEN}VILL DU DRA FÖRST?{SPACE*21}{HOME} 750 PRINT "VILL DU DRA FÖRST";
730 GETX$ 760 INPUT X$
731 IFX$<>""THENPRINTLEFT$(D$,23)"{SPACE*39}{HOME} 770 IF LEFT$(X$,1)="N" THEN 820
740 IF X$="N" THEN GOSUB 2660:GOTO 790 780 IF LEFT$(X$,1)<>"J" THEN 760
750 IF X$<>"J" THEN 720 790 GOSUB 2860
760 GOSUB 2660 800 GOSUB 2790
770 GOTO 1270 810 GOTO 1320
Datorns drag
790 PRINTCC$"{HOME}JAG TÄNKER{.*3} " 820 GOSUB 2860 : GOTO 850
830 IF F2%=0 THEN 850
840 INPUT X$
810 B1=-1 850 B1%=-1
820 I3=0:J3=0 860 I3%=0 : J3%=0
830 T1=C 870 T1%=C%
840 T2=H 880 T2%=H%
850 FORI9=1TO8:FORJ9=1TO8:I=I9:J=J9 890 FOR I%=1 TO 8
900 FOR J%=1 TO 8
870 IF A(I9,J9)<>0 THEN 1040 910 IF A%(I%,J%)<>0 THEN 1080
880 GOSUB 2330 920 GOSUB 2450
890 IF F1=0 THEN 1040 930 IF F1%=0 THEN 1080
900 U=-1 940 U%=-1
910 GOSUB 2410 950 GOSUB 2540
920 IF S1=0 THEN 1040 960 IF S1%=0 THEN 1080
930 IF (I9-1)*(I9-8)<>0 THEN 950 970 IF (I%-1)*(I%-8)<>0 THEN 990
940 S1=S1+S2 980 S1%=S1%+S2%
950 IF (J-1)*(J-8)<>0 THEN 970 990 IF (J%-1)*(J%-8)<>0 THEN 1010
960 S1=S1+S2 1000 S1%=S1%+S2%
970 IF S1<B1 THEN 1040 1010 IF S1%<B1% THEN 1080
980 IF S1>B1 THEN 1010 1020 IF S1%>B1% THEN 1050
990 R=RND(.):IF (I=1 OR I=8) AND (J=1 OR J=8) THEN I3=I:J3=J:B1=S1:GOTO 1060 1030 R=RND
1000 IF R>.5 THEN 1040 1040 IF R>.5 THEN 1080
1010 B1=S1 1050 B1%=S1%
1020 I3=I 1060 I3%=I%
1030 J3=J 1070 J3%=J%
1040 NEXTJ9,I9 1080 NEXT J%
1090 NEXT I%
1060 IF B1>0 THEN 1120 1100 IF B1%>0 THEN 1150
Datorn hittar inget giltigt drag
1070 PRINTCC$LEFT$(D$,23)"{SPACE*39}{HOME} 1110 ; CUR(22,0);"JAG MÅSTE AVSTÅ MITT DRAG";
1080 PRINT"{HOME}JAG STÅR ÖVER."
1090 IF Z=1 THEN 1860 1120 IF Z%=1 THEN 1930
1100 Z=1 1130 Z%=1
1110 GOTO 1270 1140 GOTO 1320
Datorn hittar ett giltigt drag
1120 Z=0 1150 Z=0
1130 PRINTCC$"{HOME}MITT DRAG:{SPACE*2}"; 1160 ; CUR(0%,0%);"MITT DRAG: ";
1140 PRINTC$(J3); 1170 PRINT C$(J3%);
1150 PRINTCHR$(I3+48) 1180 PRINT CHR$(I3%+48%);
1160 I=I3 1190 I%=I3%
1170 J=J3 1200 J%=J3%
1180 U=1 1210 U%=1
1190 GOSUB 2410 1220 GOSUB 2540
1200 C1=C1+S1+1 1230 C1%=C1%+S1%+1
1210 H1=H1-S1 1240 H1%=H1%-S1%
1220 N1=N1+1 1250 N1%=N1%+1
1230 PRINTLEFT$(D$,23)"JAG TOG"S1"{LEFT} AV DINA PJÄSER!!{SPACE*15}"; 1260 ; CUR(22%,0%);"JAG TOG";
1270 PRINT S1%;
1280 PRINT " AV DINA PJÄSER";SPACE$(15%);
1240 GOSUB2660:Q9=-1:GOSUB1880 1290 GOSUB 2790
1250 IF H1=0 THEN GOTO1860 1300 IF H1%=0 THEN 1930
1260 IF N1=64 THEN GOTO1860 1310 IF N1%=64 THEN 1930
Spelarens drag
1270 T1=H 1320 T1%=H%
1280 T2=C 1330 T2%=C%
1290 PRINTHH$"{HOME}{DOWN}{SPACE*22}" 1340 ; CUR(1%,0%);"DITT DRAG:";SPACE$(12%);
1310 INPUT"{HOME}{DOWN}DITT DRAG ";Z$ 1350 ; CUR(1%,12%);
1311 IFZ$<>"BF"THEN1320 1360 INPUTLINE Z$ : Z$=LEFT$(Z$,LEN(Z$)-2%)
1312 FORX=1TO8:FORY=1TO8
1313 IFA(X,Y)=BTHENA(X,Y)=W:GOTO1315
1314 IFA(X,Y)=WTHENA(X,Y)=B
1315 NEXT:NEXT:X=C1:C1=H1:H1=X:GOSUB2660:Q9=-1:GOSUB1880:GOTO790
1320 IF LEN(Z$)<>2 THEN 1350 1370 IF LEN(Z$)=2 THEN 1380 ELSE 1400
1330 Z1=ASC(Z$):Z2=ASC(RIGHT$(Z$,1)) 1380 Z1=ASC(LEFT$(Z$,1)) : Z2=ASC(MID$(Z$,2,1))
1340 IF(Z1>47ANDZ1<57ANDZ2>64ANDZ2<73)OR(Z1>64ORZ1<73ORZ2>47ORZ2<57)THEN1360 1390 IF Z1>47 AND Z1<57 AND Z2>64 AND Z2<73 OR Z1>64 AND Z1<73 AND Z2>47 AND Z2<57 THEN 1410
1350 PRINT"{HOME}{DOWN*2}{LIGHT GREEN}FEL - FÖRSÖK IGEN.{SPACE*4}":PRINT"{SPACE*15}":GOTO1290 1400 ; CHR$(7%);CUR(2%,0%);"FEL. FÖRSÖK IGEN. ";CUR(3%,0%);SPACE$(15%); : GOTO 1340
1360 IF Z1>57 THENI=Z2-48:X$=CHR$(Z1):GOTO1390 1410 IF Z1>57 THEN 1430
1370 I=Z1-48 : X$=CHR$(Z2) 1420 I%=Z1-48% : X$=CHR$(Z2) : GOTO 1440
1430 I%=Z2-48% : X$=CHR$(Z1)
1390 IF I<0ORI>8 THEN 1310 1440 IF I%<0 THEN 1360
1450 IF I%>8 THEN 1360
1410 IF I<>0 THEN 1520 1460 IF I%<>0 THEN 1570
Spelaren står över
1420 PRINT"{HOME}{DOWN*3}{SPACE*15}" 1470 ; CUR(3,0);SPACE$(14);
1430 PRINT"{HOME}{DOWN*2}{LIGHT GREEN}{SPACE*22}" 1480 ; CUR(2%,0%);"AVSTÅR DU ?";
1450 INPUT"{HOME}{DOWN*2}AVSTÅR DU? J{LEFT*3}";X$:X$=LEFT$(X$,1) 1490 ; SPACE$(11);CUR(2%,12%);
1460 PRINT"{HOME}{DOWN*2}{SPACE*14}" 1500 INPUTLINE X$ : X$=LEFT$(X$,LEN(X$)-2%)
1461 PRINTHH$"{HOME}{DOWN} DU STÅR ÖVER.
1462 PRINTLEFT$(D$,24)"{SPACE*39}{HOME} 1510 ; CUR(2%,0%);SPACE$(22%);
1470 IF X$="" THEN 1430 1520 IF LEN(X$)=0 THEN 1480
1480 IF X$<>"J" THEN 1290 1530 IF LEFT$(X$,1)<>"J" THEN 1340
1490 IF Z=1 THEN 1860 1540 IF Z%=1 THEN 1930
1500 Z=1 1550 Z%=1
1510 GOTO 790 1560 GOTO 830
Kontrollera spelarens drag
1520 PRINT"{HOME}{DOWN*2}{SPACE*22}" 1570 ; CUR(2%,0%);SPACE$(22%);
1530 FOR J=1 TO 8 1580 FOR J%=1 TO 8
1540 IF C$(J)=X$ THEN 1570 1590 IF C$(J%)=LEFT$(X$,1) THEN 1620
1550 NEXT J 1600 NEXT J%
1560 GOTO 1310 1610 GOTO 1360
1570 IF A(I,J)=0 THEN 1610 1620 IF A%(I%,J%)=0 THEN 1660
1580 PRINT"{HOME}{DOWN*2}{LIGHT GREEN}UPPTAGEN RUTA" 1630 ; CUR(2%,0%);"UPPTAGEN RUTA"
1590 PRINT"-FÖRSÖK IGEN." 1640 ; CUR(3%,0%);"-FÖRSÖK IGEN."
1600 GOTO 1290 1650 GOTO 1340
1610 GOSUB 2330 1660 GOSUB 2450
1620 IF F1=1 THEN 1660 1670 IF F1%=1 THEN 1710
1630 PRINT"{HOME}{DOWN*2}{LIGHT GREEN}EJ BREDVID MINA PJÄSER" 1680 ; CUR(2%,0%);"EJ BREDVID MINA PJÄSER"
1640 PRINT"{HOME}{DOWN*3}-FÖRSÖK IGEN." 1690 ; CUR(3%,0%);"-FÖRSÖK IGEN."
1650 GOTO 1290 1700 GOTO 1340
1660 U=-1 1710 U%=-1
1670 GOSUB 2410 1720 GOSUB 2540
1680 IF S1>0 THEN 1730 1730 IF S1%>0 THEN 1780
1690 PRINT"{HOME}{DOWN*2}{LIGHT GREEN}DU KAN EJ VÄNDA NÅGRA" 1740 ; CUR(2%,0%);"DU KAN EJ VÄNDA NÅGRA"
1700 PRINT"-FÖRSÖK IGEN." 1750 ; CUR(3%,0%);"FÖRSÖK IGEN.";
1710 GOTO 1290 1760 GOTO 1340
Spelarens drag är OK
1730 Z=. 1770 REM Hans drag OK.
1780 Z%=0
1740 PRINT"{HOME}{DOWN*2}{SPACE*22}" 1790 ; CUR(2%,0%);SPACE$(22%);
1750 PRINT"{HOME}{DOWN*3}{SPACE*22}" 1800 ; CUR(3%,0%);SPACE$(15%);
1760 PRINTHH$LEFT$(D$,24)" DU TOG"S1"{LEFT} AV MINA PJÄSER{SPACE*14}{HOME} 1810 ; CUR(23%,0%);" DU TOG";
1820 PRINT S1%;
1830 PRINT " AV MINA PJÄSER";SPACE$(14%);
1770 U=1 1840 U%=1
1780 GOSUB 2410 1850 GOSUB 2540
1790 H1=H1+S1+1 1860 H1%=H1%+S1%+1
1800 C1=C1-S1 1870 C1%=C1%-S1%
1810 N1=N1+1 1880 N1%=N1%+1
1820 GOSUB 2660:Q9=-1:GOSUB1880 1890 GOSUB 2790
1830 IF C1=0 THEN GOTO1860 1900 IF C1%=0 THEN 1930
1840 IF N1=64 THEN GOTO1860 1910 IF N1%=64 THEN 1930
1850 GOTO 790 1920 GOTO 830
1860 PRINTLEFT$(D$,23)"{SPACE*39}" 1930 FOR I%=0% TO 10% : ; CHR$(7); : NEXT I%
1870 PRINT"{UP}{SPACE*39}{HOME}":Q9=. 1940 ; CUR(3%,0%);
Visa ställningenVisa slutresultatet
1880 PRINT"{HOME}{DOWN*4}{LIGHT GREEN}DU :"HH$H1"{LEFT} ST " 1950 PRINT "DU HAR";
1960 PRINT H1%
1970 PRINT "PJÄSER"
1900 PRINT"{LIGHT GREEN}JAG:"CC$C1"{LEFT} ST {LIGHT GREEN} 1980 ; "OCH JAG"
1921 IFQ9=-1THENRETURN 1990 ; "HAR";
2000 PRINT C1%
2010 PRINT "PJÄSER"
Avgör vinnare och avsluta spelet
1930 IF H1=C1 THEN 1970 2020 IF H1%=C1% THEN 2060
1940 IF H1>C1 THEN 1990 2030 IF H1%>C1% THEN 2080
1950 PRINT "JAG VANN!" 2040 ; : ; "JAG VANN!" : ;
1960 GOTO 2000 2050 GOTO 2090
1970 PRINT "OAVGJORT!!" 2060 PRINT "OAVGJORT!!"
1980 GOTO 2190 2070 GOTO 2280
1990 PRINT "DU VANN." 2080 PRINT "DU VANN !"
2000 C1=C1-H1 2090 C1%=C1%-H1%
2010 IF C1>0 THEN 2030 2100 IF C1%>0 THEN 2120
2020 C1=-C1:PRINT"{WHITE} 2110 C1%=-C1%
2030 C1=(64*C1)/N1 2120 C1%=(64*C1%)/N1%
2040 IF C1<11 THEN 2180 2130 IF C1%<11 THEN 2270
2050 IF C1<25 THEN 2160 2140 IF C1%<25 THEN 2250
2060 IF C1<39 THEN 2140 2150 IF C1%<39 THEN 2230
2070 IF C1<53 THEN 2110 2160 IF C1%<53 THEN 2200
2080 PRINT "PERFEKT PARTI !"; 2170 PRINT "PERFEKT"
2180 ; "PARTI !"
2100 GOTO 2190 2190 GOTO 2280
2110 PRINT "SKAPLIGT SPELAT !"; 2200 PRINT "SKAPLIGT"
2210 ; "SPELAT !"
2130 GOTO 2190 2220 GOTO 2280
2140 PRINT "BRA FIGHT"; 2230 PRINT "BRA FIGHT"
2150 GOTO 2190 2240 GOTO 2280
2160 PRINT "SKICKLIGT!"; 2250 PRINT "SKICKLIGT!"
2170 GOTO 2190 2260 GOTO 2280
2180 PRINT "FUSK !!"; 2270 PRINT "FUSK !"
2190 PRINTLEFT$(D$,23)"ETT SPEL TILL ?{HOME} 2280 PRINT CUR(22,0);SPACE$(39%);
2290 ; CUR(22,0);"ETT SPEL TILL ";
2210 GET X$:IF X$="N" THEN 2320 2300 INPUT X$
2220 IF X$<>"J" THEN 2210 2310 IF LEFT$(X$,1)<>"J" THEN 2410
2310 RUN10 2320 ; CUR(0,0);SPACE$(22)
2330 ; SPACE$(22)
2340 ; SPACE$(15)
2350 FOR I%=4% TO 21%
2360 ; SPACE$(11)
2370 NEXT I%
2380 ; SPACE$(15)
2390 ; SPACE$(39)
2400 GOTO 300
2320 SYS64738 2410 ; CUR(22,0);SPACE$(39);
2420 ; CUR(23,0);SPACE$(39);
2430 ; CUR(21,0);"TACK FÖR IDAG.";
2440 GOTO 3140
Kontrollera intilligande
2330 FOR I1=-1 TO 1 2450 FOR I1%=-1 TO 1
2340 FOR J1=-1 TO 1 2460 FOR J1%=-1 TO 1
2350 IF A(I+I1,J+J1)=T2 THEN 2390 2470 IF A%(I%+I1%,J%+J1%)=T2% THEN 2520
2360 NEXT J1,I1 2480 NEXT J1%
2490 NEXT I1%
2370 F1=0 2500 F1%=0
2380 RETURN 2510 RETURN
2390 F1=1 2520 F1%=1
2400 RETURN 2530 RETURN
Utför ett drag och uppdatera spelplanen
2410 S1=0 2540 S1%=0
2420 FOR K=1 TO 8 2550 FOR K%=1 TO 8
2430 I5=I4(K) 2560 I5%=I4%(K%)
2440 J5=J4(K) 2570 J5%=J4%(K%)
2450 I6=I+I5 2580 I6%=I%+I5%
2460 J6=J+J5 2590 J6%=J%+J5%
2470 S3=0 2600 S3%=0
2480 IF A(I6,J6)<>T2 THEN 2640 2610 IF A%(I6%,J6%)<>T2% THEN 2770
2490 S3=S3+1 2620 S3%=S3%+1
2500 I6=I6+I5 2630 I6%=I6%+I5%
2510 J6=J6+J5 2640 J6%=J6%+J5%
2520 IF A(I6,J6)=T1 THEN 2550 2650 IF A%(I6%,J6%)=T1% THEN 2680
2530 IF A(I6,J6)=0 THEN 2640 2660 IF A%(I6%,J6%)=0 THEN 2770
2540 GOTO 2490 2670 GOTO 2620
2550 S1=S1+S3 2680 S1%=S1%+S3%
2560 IF U<>1 THEN 2640 2690 IF U%<>1 THEN 2770
2570 I6=I 2700 I6%=I%
2580 J6=J 2710 J6%=J%
2590 FOR K1=0 TO S3 2720 FOR K1%=0 TO S3%
2600 A(I6,J6)=T1 2730 A%(I6%,J6%)=T1%
2610 I6=I6+I5 2740 I6%=I6%+I5%
2620 J6=J6+J5 2750 J6%=J6%+J5%
2630 NEXT K1 2760 NEXT K1%
2640 NEXT K 2770 NEXT K%
2650 RETURN 2780 RETURN
Rita spelpjäser
2660 PRINTLEFT$(D$,5):FORI=1TO8:PRINTTAB(22):FORJ=1TO8 2790 FOR I%=1% TO 8%
2800 FOR J%=1% TO 8%
2670 PRINTD$(A(I,J)+1)"{RIGHT}";:NEXT:PRINT:PRINT:NEXT:RETURN 2810 ; CUR(2%*I%+3%,3%*J%+12%);
2820 ; D$(A%(I%,J%)+1%);
2830 NEXT J%
2840 NEXT I%
2850 RETURN
Visa spelplanen
2730 PRINT "{LIGHT GREEN}{CLEAR}"; 2860 ; CHR$(12); : REM Init brädet
2740 PRINTLEFT$(D$,21)TAB(21)"└─┴─┴─┴─┴─┴─┴─┴─┘ 2870 FOR I%=0% TO 2% : ; CUR(I%,22%);CHR$(151) : NEXT I%
2741 PRINTTAB(22)"{WHITE}A B C D E F G H{LIGHT GREEN} 2880 FOR I%=1% TO 6%
2742 PRINTLEFT$(D$,5)TAB(21)"┌─┬─┬─┬─┬─┬─┬─┬─┐ 2890 SETDOT I%,46% : SETDOT I%,75%
2750 FORR=5TO19STEP2:A$=CHR$(48+(R/2)-1) 2900 NEXT I%
2751 PRINTTAB(20)"{WHITE}"A$"{LIGHT GREEN}│ │ │ │ │ │ │ │ │{WHITE}"A$:IFR>18THEN2770 2910 FOR I%=47% TO 75%
2760 PRINTTAB(21)"{LIGHT GREEN}├─┼─┼─┼─┼─┼─┼─┼─┤ 2920 SETDOT 1%,I% : SETDOT 6%,I%
2770 NEXT 2930 NEXT I%
2785 PRINT"{HOME}"TAB(21)"{DOWN*3}{REVERSE ON}▍OTHELLO (C)MR.P🮈 2940 ; CUR(1%,24%);"O T H E L L O"
2820 RETURN 2950 FOR I%=4% TO 20%
2960 ; CUR(I%,12%);CHR$(151);
2970 ; CUR(I%,38%);CHR$(135);
2980 NEXT I%
2990 FOR I%=13% TO 61% STEP 6%
3000 FOR J%=27% TO 75%
3010 SETDOT I%,J%
3020 NEXT J% : NEXT I%
3030 FOR I%=27% TO 75% STEP 6% : FOR J%=13% TO 61%
3040 SETDOT J%,I%
3050 NEXT J% : NEXT I%
3060 FOR I%=1% TO 8%
3070 ; CUR(3%+I%*2%,10%);I%;CUR(3%+I%*2%,39%);CHR$(I%+48%);
3080 NEXT I%
3090 FOR I%=1% TO 8%
3100 ; CUR(3%,12%+I%*3%);CHR$(64+I%);
3110 ; CUR(21%,12%+I%*3%);CHR$(64+I%);
3120 NEXT I%
3130 RETURN
2830 REM *** END *** 3140 END

VIC 20-versionen är något mer kondenserad, antagligen för att få plats i lite minne och visas i en egen listning här (jag har lagt in extra blanktecken för läsbarhet, som inte finns i versionen som länkas ovan):

VIC-20-version
Startskärm
2 REM S&J KRUUV
3 POKE 36879,234
5 PRINT "{CLEAR}{DOWN*2}{BLACK} WELCOME TO OTHELLO !!"
6 PRINT "{DOWN*2}WOULD YOU LIKE{SPACE*8}INSTRUCTIONS? ( Y-N )
7 GET U$ : IF U$="" THEN 7
8 IF U$="N" THEN 10
9 GOSUB 2000
Initiering
10 DN$="{HOME}{DOWN*18}" : FOR I=1 TO 21 : E$=E$+" " : NEXT
12 FOR I=1 TO 21 : E$=E$+"{LEFT}" : NEXT : R$="{RIGHT*20}" : F2=0 : S2=0
14 DIMA(9,9),I4(8),J4(8),D$(2)
Välj nivå
   : PRINT "{CLEAR}SHOULD I PLAY MY BEST" : INPUT X$
15 PRINT "FORFEIT={REVERSE ON}I0{REVERSE OFF}"
16 IF LEFT$(X$,1)="N" THEN 20
18 S2=2
Initiering av spelet
20 B=-1 : W=1 : D$(B+1)="○" : D$(0+1)=" " : D$(W+1)="●" : FOR K=1 TO 8 : READ I4(K),J4(K) : NEXT
22 FOR I=0 TO 9 : FOR J=0 TO 9 : A(I,J)=0 : NEXT J,I : A(4,4)=W : A(5,5)=W : A(4,5)=B : A(5,4)=B
24 C1=2 : H1=C1 : N1=4 : Z=0
Välj färg
   : PRINT "{DOWN}DO YOU WANT BLACK OR WHITE" : H=W : INPUT X$ : C=B
26 IF LEFT$(X$,1)="B" THEN 30
28 C=W : H=B
Välj startspelare
30 PRINT "DO YOU WANT TO GO FIRST" : INPUT X$ : PRINT "{CLEAR}" : GOSUB 144
32 IF LEFT$(X$,1)="Y" THEN 76
Datorns drag
34 PRINT DN$;E$"I AM THINKING !"
36 B1=-1 : I3=0 : J3=0 : T1=C : T2=H : FOR I=1 TO 8 : FOR J=1 TO 8 : IF A(I,J)<>0 THEN 58
38 GOSUB 122 : IF F1=0 THEN 58
40 U=-1 : GOSUB 128 : IF S1=0 THEN 58
42 IF (I-1)*(I-8)<>0 THEN 46
44 S1=S1+S2
46 IF (J-1)*(J-8)<>0 THEN 50
48 S1=S1+S2
50 IF S1<B1 THEN 58
52 IF S1>B1 THEN 56
54 IF RND(1)>0.5 THEN 58
56 B1=S1 : I3=I : J3=J
58 NEXT J,I
60 IF B1>0 THEN 68
Datorn hittar inget giltigt drag
62 PRINT DN$"{DOWN}"E$"{DOWN}"E$"{DOWN}"E$"{UP*2}I FORFEIT MY MOVE"
64 IF Z=1 THEN 110
66 Z=1 : GOTO 76
Datorn hittar ett giltigt drag
68 PRINT "{SPACE*21}"
69 Z=0 : PRINT DN$"{DOWN}"E$"{DOWN}"E$"{DOWN}"E$"{UP*2}I WILL MOVE TO {REVERSE ON}"RIGHT$(STR$(I3),1)"{REVERSE OFF} {REVERSE ON}"CHR$(J3+64)
70 GOSUB 186 : I=I3 : J=J3 : U=1 : GOSUB 128 : C1=C1+S1+1 : H1=H1-S1 : N1=N1+1
72 PRINT DN$"{DOWN*2}"E$"THAT GIVES ME ";S1;"OF" : PRINT "YOUR PIECES"
74 GOSUB 144 : IF H1=0 OR N1=64 THEN 110
Spelarens drag
76 T1=H : T2=C
78 PRINT DN$;E$"{WHITE}INPUT YOUR MOVE;{REVERSE ON}ROW{REVERSE OFF}COL{UP}{LEFT*3}"; : GOSUB 168 : IF I<>0 THEN 88
80 PRINT DN$"{DOWN}"E$"{DOWN}"E$"{DOWN}"E$"{UP*2}FORFEITING YOUR TURN" : INPUT X$
82 IF LEFT$(X$,1)<>"Y" THEN 78
84 IF Z=1 THEN 110
86 Z=1 : GOTO 36
88 IF A(I,J)=0 THEN 92
90 PRINT DN$"{DOWN}"E$"SQUARE OCCUPIED" : GOTO 100
92 GOSUB 122 : IF F1=1 THEN 96
94 PRINT DN$"{DOWN}"E$"NOT NEXT TO MY PIECES" : GOTO 100
96 U=-1 : GOSUB 128 : IF S1>0 THEN 102
98 PRINT DN$"{DOWN}"E$"DOESN'T FLANK A ROW"
100 PRINT E$"{RIGHT*5}TRY AGAIN" : PRINT E$ : GOTO 78
Spelarens drag är OK
102 PRINT "{SPACE*23}"
103 Z=0 : PRINT DN$"{DOWN}"E$"{DOWN}"E$"{DOWN}"E$"{UP*2}THAT GIVES YOU ";
104 PRINT S1;" OF" : PRINT "MY PIECES"
106 U=1 : GOSUB 128 : H1=H1+S1+1 : C1=C1-S1 : N1=N1+1 : GOSUB 144 : IF C1=0 OR N1=64 THEN 110
108 GOTO 36
Visa ställningen
110 PRINT DN$;E$"YOU HAVE "H1"PIECES "
114 PRINT "{SPACE*22}"E$"{UP*2}I HAVE "C1"PIECES{SPACE*21}"
Avgör vinnare och avsluta spelet
115 IF C1>H1 THEN 117
116 GOTO 4000
117 PRINT "{SPACE*24}I WIN***"
118 PRINT E$"ANOTHER GAME" : INPUT X$
119 IF LEFT$(X$,1)="Y" THEN 10
120 PRINT "IT'S BEEN FUN !{SPACE*10}THANK YOU{>*3}"
121 END
Kontrollera intilligande
122 F1=0 : FOR I1=-1 TO 1 : FOR J1=-1 TO 1 : IF A(I+I1,J+J1)=T2 THEN 126
124 NEXT J1,I1 : RETURN
126 F1=1 : RETURN
Utför ett drag och uppdatera spelplanen
128 S1=0 : FOR K=1 TO 8 : I5=I4(K) : J5=J4(K) : I6=I+I5 : J6=J+J5 : S3=0
130 IF A(I6,J6)<>T2 THEN 142
132 S3=S3+1 : I6=I6+I5 : J6=J6+J5 : IF A(I6,J6)=T1 THEN 138
134 IF A(I6,J6)=0 THEN 142
136 GOTO 132
138 S1=S1+S3 : IF U<>1 THEN 142
140 I6=I : J6=J : FOR K1=0 TO S3 : A(I6,J6)=T1 : I6=I6+I5 : J6=J6+J5 : NEXT K1
142 NEXT K : RETURN
Visa spelplanen
144 PRINT "{HOME} A B C D E F G H"
146 PRINT " {RED}┌─┬─┬─┬─┬─┬─┬─┬─┐{BLACK}"
148 FOR I=1 TO 8
150 PRINTI"{BLUE}{LEFT}│{BLACK}";
152 FOR J=1 TO 8
154 PRINTD$(A(I,J)+1)"{BLUE}│{BLACK}";
156 NEXT J
158 PRINT
160 IF I<>8 THEN PRINT " {BLUE}├─┼─┼─┼─┼─┼─┼─┼─┤{BLACK}"
162 NEXT I
164 PRINT " {RED}└─┴─┴─┴─┴─┴─┴─┴─{RED}┘{BLACK}"
166 RETURN
Mata in spelarens drag
168 I=-1 : J=-1 : K=1
170 GET X$ : IF X$<>"" THEN 178
172 IF K=1 THEN PRINT "{WHITE}🮕{LEFT}"; : GOTO 176
174 PRINT " {LEFT}";
176 K=-1*K : FOR L=1 TO 200 : NEXT : GOTO 170
178 G=ASC(X$) : IF 47<G AND G<58 THEN I=G-48 : PRINT "{REVERSE ON}"X$"{REVERSE OFF}{BLACK}";
180 IF 64<G AND G<74 THEN J=G-64 : PRINT "{REVERSE ON}"X$"{REVERSE OFF}{BLACK}";
182 IF I<>-1 AND J<>-1 THEN RETURN
184 GOTO 170
186 PRINT LEFT$(DN$,2*(I3-1)+3);LEFT$(R$,2*(J3-1)+3); : K=1 : M=0 : X$=D$(C+1)
188 IF K=1 THEN PRINT X$"{LEFT}"; : GOTO 192
190 PRINT " {LEFT}";
192 K=-1*K : FOR L=1 TO 200 : NEXT : IF M>9 THEN RETURN
194 M=M+1 : GOTO 188
196 DATA 0,1,-1,1,-1,0,-1,-1,0,-1,1,-1,1,0,1,1
Instruktioner
2000 REM INSTRUCTIONS
2010 PRINT "{DOWN} {BLACK}OTHELLO IS PLAYED ON A 8 ✕ 8 CHECKER"
2020 PRINT "BOARD. ROWS ARE NUMBERED 1 THRU 8, AND"
2030 PRINT "COLUMNS A THRU H. THE INITIAL SET UP IS"
2040 PRINT "ALL BLANK EXCEPT FOR THE CENTER FOUR "
2050 PRINT "SQUARES, WHICH FORM THE PATTERN : "
2052 PRINT "{BLUE}HIT RETURN TO CONT.{BLACK}"
2053 GET U$ : IF U$="" THEN 2053
2054 PRINT "{UP}{SPACE*20}"
2055 PRINT "{DOWN} ●○"
2056 PRINT " ○●"
2060 PRINT "{DOWN}TRY TO PLACE YOUR PIECE SO THAT IT"
2070 PRINT "OUTFLANKS MINE, CREATING A HORIZONTAL"
2080 PRINT "VERTICAL OR DIAGONAL RUN OF MY PIECES"
2090 PRINT "BOUND ON EACH END BY AT LEAST ONE OF YOURS."
2093 PRINT "THIS WILL FLIP MY PIECES TURNING THEM INTO YOURS.",
2095 PRINT "{BLUE}HIT RETURN TO CONT.{BLACK}"
2096 GET U$ : IF U$="" THEN 2096
2097 PRINT "{UP}{SPACE*19}{DOWN}"
3000 PRINT "NOTE : YOU MUST CAPTUREAT LEAST ONE OF MY"
3010 PRINT "PIECES IN THIS WAY IF AT ALL POSSIBLE."
3020 PRINT "IF IT IS NOT POSSIBLE THEN YOU FORFEIT YOUR"
3030 PRINT "TURN BY ENTERING I 0 FOR YOUR MOVE."
3060 PRINT "{DOWN*2}HIT RETURN TO START."
3065 GET U$ : IF U$="" THEN 3065
3070 PRINT "{CLEAR}"
3100 RETURN
Ljudeffekt om spelaren vinner
4000 REM***YOU WIN***
4010 PRINT "{SPACE*23}**YOU WIN!****"
4015 POKE 36878,15
4020 FOR W3=125 TO 255
4030 POKE 36879,W3 : POKE 36876,W3 : NEXT W3
4050 POKE 36878,0 : POKE 36879,234
4060 GOTO 118
[HTML 4.01!] [Alla vävläsare går bra här!] $Date: 2025-10-30 12:37:28 $ | peter@softwolves.pp.se

Åter till Softwolves Commodoresida | Peters hemsida