Svenska English
[ Download D64 ]
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.
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!
Filerna på disken är som följer:
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.
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.
| 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ällningen | Visa 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):
| 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 |