OTHELLO, alten Fehler aufgespürt

Spielprogramme für den Zeitvertreib
Antworten
Benutzeravatar
ein Thüringer
Beiträge: 35
Registriert: 29.08.2021, 11:04

OTHELLO, alten Fehler aufgespürt

Beitrag von ein Thüringer »

In dem trotzdem unbestreitbar genialen OTHELLO-Programm steckte von je her ein Fehler bei der Ausgabe der Steine-Anzahl (unvollständiges Löschen, Überschreiben, doch nur, wenn am Anfang Level 2 gewählt wurde). Auch diesen Fehler hat KC85-Frank jetzt lokalisieren und beseitigen können (vgl. viewtopic.php?f=4&t=95 ). "Nebenbei" haben wir auch (wie schon für den ZX Spectrum —> https://forum.tlienhard.com/phpBB3/viewtopic.php?t=3885 ) die Anleitung usw. auf Deutsch umgestellt. Wie KUBUSGER läuft auch dieses Programm erst mit dem Bascoder, siehe dort.

Code: Alles auswählen

1000 A=200:GOTO 20:REM   OTHELLO
1010 HO=INT(HO/4):VE=INT(VE/3):GOSUB 110
1020 NM=0:WU=0:CO=0:C2=0:CL=0:CR=0:REM DIM CC(2)
1030 SR$="O T H E L L O"
1040 CC(0)=4:GOSUB 150:CC(0)=7
1050 VE=VE+4:HO=HO+1:GOSUB 110
1060 PRINT "J. Simons 1988"
1070 VE=VE+8:GOSUB 110
1080 PRINT "Anleitung lesen ? (J/N)"
1090 GOSUB 210
1100 IF (IN<>74)AND(IN<>78) THEN GOTO 1090
1110 IF IN=74 THEN GOSUB 9010
1120 GOSUB 600:CN=0
1130 HO=.34:VE=.015:CC(0)=2:SR$="O T H E L L O":GOSUB 650
1140 HO=.01:VE=.001:CC(0)=7:GOSUB 620
1150 HO=.99:GOSUB 630:VE=.055:GOSUB 630
1160 HO=.01:GOSUB 630:VE=.001:GOSUB 630
1170 HO=.01:VE=.88
1180 SR$=" LEERTASTE suchen":GOSUB 650
1190 HO=.52
1200 SR$="      ENTER setzen":GOSUB 650
1210 HO=.01:VE=.7:CC(0)=4:SR$="Ich":GOSUB 650
1220 HO=.9:CC(0)=2:SR$="Du":GOSUB 650
1230 HO=.01:VE=.78:CC(0)=7:GOSUB 620
1240 HO=.11:GOSUB 630:VE=.85:GOSUB 630
1250 HO=.01:GOSUB 630:VE=.78:GOSUB 630
1260 HO=.89:VE=.78:GOSUB 620
1270 HO=.99:GOSUB 630:VE=.85:GOSUB 630
1280 HO=.89:GOSUB 630:VE=.78:GOSUB 630
1290 SD=0:DL=0
1300 DIM A(8,8),B(8,8),C(8,8),D(8,8),E(8,8),F(8,8),G(8,8)
1310 DIM P1(60),P2(60),T1(60),T2(60),RG(60),HM(60)
1320 A(4,4)=1:A(5,4)=-1:A(4,5)=-1:A(5,5)=1
1330 PN=0
1340 FOR J1=1 TO 8
1350 FOR J2=1 TO 8
1360 READ C(J1,J2)
1370 NEXT J2
1380 NEXT J1
1390 FOR J1=1 TO 8
1400 FOR J2=1 TO 8
1410 D(J1,J2)=1
1420 NEXT J2
1430 NEXT J1
1440 D(3,3)=0:D(3,4)=0:D(3,5)=0:D(3,6)=0
1450 D(4,3)=0:D(4,6)=0:D(5,3)=0:D(5,6)=0
1460 D(6,3)=0:D(6,4)=0:D(6,5)=0:D(6,6)=0
1470 GOSUB 3000
1475 MZ$=" Ich denke ...    ":DZ$=" Dein Zug?         "
1480 HO=.27:VE=.07:SR$=" Level (1) oder (2) ?":GOSUB 650
1490 GOSUB 210
1500 IF (IN$<>"1")AND(IN$<>"2") THEN GOTO 1490
1510 CN=1:GOSUB 650:CN=0
1520 HE=IN-49
1530 GOSUB 260:PL=RV*10
1540 IF PL<5 THEN PL=-1:GOTO 2000
1550 PL=1
2000 PL=-PL
2010 GOSUB 250
2020 GOSUB 2200
2060 GOSUB 3300
2070 IF PM=0 THEN GA=GA+1:IF GA=2 THEN GOSUB 6600
2080 IF PM=0 THEN GOTO 2000
2090 GA=0
2100 CN=1:GOSUB 650:CN=0
2110 IF PL<>1 THEN GOTO 2130
2120 SR$=DZ$:SL$=DZ$:CC(0)=2:GOSUB 650:CC(0)=7
2125 GOTO 2150
2130 GOSUB 250
2140 SR$=MZ$:SL$=MZ$:CC(0)=4:GOSUB 650:CC(0)=7
2150 IF PL=-1 THEN GOSUB 5800:GOSUB 6000:GOTO 2170
2160 GOSUB 4100
2170 NM=NM+1
2180 IF NM=60 THEN GOSUB 6600:GOTO 3000
2190 GOTO 2000
2200 HO=.01:VE=.07:CN=1:SR$=SL$:GOSUB 650:CN=0
2210 SR$=" Augenblick ...        ":SL$=SR$:GOSUB 650
2220 RETURN
2250 HO=.01:VE=.07:CN=1:SR$=SL$:GOSUB 650:CN=0
2260 SR$=" Mein Zug ...          ":SL$=SR$:GOSUB 650
2270 RETURN
3000 FOR HO=.2 TO .8 STEP .075
3010 VE=.13:CN=0:GOSUB 620
3020 VE=.845:GOSUB 630
3030 NEXT HO
3040 FOR VE=.13 TO .85 STEP .09
3050 HO=.2:GOSUB 620
3060 HO=.8:GOSUB 630
3070 NEXT VE
3080 FOR J=1 TO 8
3090 FOR K=1 TO 8
3100 HO=(48+J*24)/320:VE=(14+(9-K)*18)/200
3110 CN=1:SR$=".":GOSUB 650:SR$="X":GOSUB 650
3120 SR$="O":GOSUB 650:CN=0
3130 IF A(J,K)+4=3 THEN SR$="X":CC(0)=4
3140 IF A(J,K)+4=4 THEN SR$=""
3150 IF A(J,K)+4=5 THEN SR$="O":CC(0)=2
3160 GOSUB 650
3170 NEXT K
3180 NEXT J
3190 HO=.03:VE=.8:CN=1:SR=CL:GOSUB 300:GOSUB 650
3200 HO=.91:SR=CR:GOSUB 300:GOSUB 650:CN=0
3210 GOSUB 6500
3220 HO=.03:VE=.8
3230 CL=CO:SR=CO:GOSUB 300:CC(0)=4:GOSUB 650
3240 HO=.91
3250 CR=C2:SR=C2:GOSUB 300:CC(0)=2:GOSUB 650:CC(0)=7:RETURN
3300 PM=0
3310 FOR X=1 TO 8
3320 FOR Y=1 TO 8
3330 IF (A(X,Y)<>0)OR(D(X,Y)=1) THEN GOTO 3350
3340 GOSUB 3400
3350 NEXT Y
3360 NEXT X
3370 IF (PM=0)AND(DL=0) THEN GOSUB 5600
3380 RETURN
3400 KO=0:X1=X:Y1=Y:C=0
3410 C=C+1:GOSUB 4000:J=0
3420 J=J+1
3430 SE=X1+XD:SI=Y1+YD
3440 IF (SE<1)OR(SE>8)OR(SI<1)OR(SI>8) THEN J=8
3450 IF (SE<1)OR(SE>8)OR(SI<1)OR(SI>8) THEN GOTO 3520
3460 X1=X1+XD:Y1=Y1+YD
3470 IF A(X1,Y1)<>-PL THEN J=8:GOTO 3520
3480 SE=X1+XD:SI=Y1+YD
3490 IF (SE<1)OR(SE>8)OR(SI<1)OR(SI>8) THEN J=8
3500 IF (SE<1)OR(SE>8)OR(SI<1)OR(SI>8) THEN GOTO 3520
3510 IF A(X1+XD,Y1+YD)=PL THEN J=8:C=8:KO=1
3520 IF J<8 THEN GOTO 3420
3530 X1=X:Y1=Y:IF C<8 THEN GOTO 3410
3540 IF KO=1 THEN PM=PM+1:P1(PM)=X:P2(PM)=Y
3550 RETURN
4000 ON C GOTO 4010,4020,4030,4040,4050,4060,4070,4080
4010 XD=0:YD=-1:RETURN
4020 XD=1:YD=-1:RETURN
4030 XD=1:YD=0:RETURN
4040 XD=1:YD=1:RETURN
4050 XD=0:YD=1:RETURN
4060 XD=-1:YD=1:RETURN
4070 XD=-1:YD=0:RETURN
4080 XD=-1:YD=-1:RETURN
4100 ZZ=0
4110 N=0
4120 N=N+1
4130 GOSUB 4300
4140 GOSUB 5500
4150 GOSUB 4400:IF AD=2 THEN GOSUB 250:GOTO 4170
4160 IF AD=0 THEN GOTO 4130
4170 IF AD=2 THEN GOSUB 4300:ZZ=N:N=PM
4180 IF N<>PM THEN GOTO 4120
4190 IF ZZ=0 THEN GOTO 4110
4200 A(P1(ZZ),P2(ZZ))=PL
4210 CC(0)=2:GOSUB 2200:CC(0)=7:GOSUB 6100
4220 X=P1(ZZ):Y=P2(ZZ)
4230 GOSUB 5660:GOSUB 4500:GOSUB 3000
4240 AD=0:PN=0:RETURN
4300 GOSUB 250
4310 HO=(48+P1(N)*24)/320
4320 VE=(14+(9-P2(N))*18)/200
4330 SR$=".":GOSUB 650:RETURN
4400 CN=1:GOSUB 650:CN=0:RETURN
4500 GOSUB 4700:KO=0:X1=X:Y1=Y:C=0
4510 C=C+1:GOSUB 4000:J=0
4520 J=J+1
4530 SE=X1+XD:SI=Y1+YD
4540 IF (SE<1)OR(SE>8)OR(SI<1)OR(SI>8) THEN J=8
4550 IF (SE<1)OR(SE>8)OR(SI<1)OR(SI>8) THEN GOTO 4630
4560 X1=X1+XD:Y1=Y1+YD
4570 IF B(X1,Y1)<>-PL THEN J=8:GOTO 4630
4580 B(X1,Y1)=PL
4590 SE=X1+XD:SI=Y1+YD
4600 IF (SE<1)OR(SE>8)OR(SI<1)OR(SI>8) THEN J=8
4610 IF (SE<1)OR(SE>8)OR(SI<1)OR(SI>8) THEN GOTO 4630
4620 IF B(X1+XD,Y1+YD)=PL THEN J=8:KO=1
4630 IF J<8 THEN GOTO 4520
4640 IF KO=1 THEN GOSUB 4800:KO=0
4650 IF KO<>1 THEN GOSUB 4700
4660 X1=X:Y1=Y
4670 IF C<8 THEN GOTO 4510
4680 RETURN
4700 FOR J=1 TO 8
4710 FOR K=1 TO 8
4720 B(J,K)=A(J,K)
4730 NEXT K
4740 NEXT J
4750 RETURN
4800 FOR J=1 TO 8
4810 FOR K=1 TO 8
4820 A(J,K)=B(J,K)
4830 NEXT K
4840 NEXT J
4900 RETURN
4910 FOR J=1 TO 8
4920 FOR K=1 TO 8
4930 E(J,K)=A(J,K)
4940 NEXT K
4950 NEXT J
4960 RETURN
5000 FOR J=1 TO 8
5010 FOR K=1 TO 8
5020 A(J,K)=E(J,K)
5030 NEXT K
5040 NEXT J
5050 RETURN
5100 FOR J=1 TO 8
5110 FOR K=1 TO 8
5120 F(J,K)=D(J,K)
5130 NEXT K
5140 NEXT J
5150 RETURN
5200 FOR J=1 TO 8
5210 FOR K=1 TO 8
5220 D(J,K)=F(J,K)
5230 NEXT K
5240 NEXT J
5250 RETURN
5300 FOR J=1 TO 8
5310 FOR K=1 TO 8
5320 G(J,K)=C(J,K)
5330 NEXT K
5340 NEXT J
5350 RETURN
5400 FOR J=1 TO 8
5410 FOR K=1 TO 8
5420 C(J,K)=G(J,K)
5430 NEXT K
5440 NEXT J
5450 RETURN
5500 GOSUB 210
5510 IF IN$=" " THEN AD=1:RETURN
5520 IF IN$=CHR$(13) THEN AD=2:RETURN
5530 GOTO 5500
5600 GOSUB 250
5610 HO=.01:VE=.07:CN=1:SR$=SL$:GOSUB 650:CN=0
5620 IF PL=-1 THEN SR$=" Ich kann nicht setzen":GOTO 5640
5630 SR$=" Du kannst nicht setzen"
5640 GOSUB 650
5650 SD=40:GOSUB 450
5655 CN=1:GOSUB 650:CN=0
5660 XX=X:YY=Y
5670 FOR C=1 TO 8
5680 GOSUB 4000:NX=XX+XD:NY=YY+YD
5690 IF (NX<1)OR(NX>8)OR(NY<1)OR(NY>8) THEN GOTO 5710
5700 D(NX,NY)=0
5710 NEXT C:RETURN
5800 IF (NM>11)AND(HE=1) THEN GOSUB 6200
5810 BM=-3000
5820 FOR N=1 TO PM
5830 TC=C(P1(N),P2(N)):IF TC>BM THEN BM=TC
5840 NEXT N
5850 FOR N=1 TO PM
5860 RG(N)=N
5870 NEXT N
5880 FOR N=1 TO PM
5890 GOSUB 260
5900 FF=RV*PM:GG=RV*PM:HH=RG(FF):RG(FF)=RG(GG):RG(GG)=HH
5910 NEXT N
5920 N=0
5930 N=N+1
5940 IF C(P1(RG(N)),P2(RG(N)))<>BM THEN GOTO 5930
5950 A(P1(RG(N)),P2(RG(N)))=PL
5960 X=P1(RG(N)):Y=P2(RG(N))
5970 IF (NM>11)AND(HE=1) THEN GOSUB 5400
5980 X=P1(RG(N)):Y=P2(RG(N)):GOSUB 6100:RETURN
6000 N=0
6010 N=N+1:GOSUB 4300:GOSUB 250
6020 FOR WT=1 TO 800
6030 NEXT WT
6040 GOSUB 4400
6050 IF A(P1(N),P2(N))<>PL THEN GOTO 6010
6060 GOSUB 4300:GOSUB 250:CC(0)=4:GOSUB 2250:CC(0)=7
6070 GOSUB 5660:GOSUB 4500:GOSUB 3000:RETURN
6100 IF PL=-1 THEN FH=800:TH=500
6110 IF PL<>-1 THEN FH=500:TH=300
6120 IF (X=1)AND(Y=1) THEN C(2,1)=FH:C(1,2)=FH:C(2,2)=TH
6130 IF (X=1)AND(Y=8) THEN C(1,7)=FH:C(2,8)=FH:C(2,7)=TH
6140 IF (X=8)AND(Y=1) THEN C(7,1)=FH:C(8,2)=FH:C(7,2)=TH
6150 IF (X=8)AND(Y=8) THEN C(8,7)=FH:C(7,8)=FH:C(7,7)=TH
6160 RETURN
6200 DL=1:TP=PM
6210 FOR JJ=1 TO PM
6220 T1(JJ)=P1(JJ):T2(JJ)=P2(JJ)
6230 NEXT JJ
6240 FOR ZZ=1 TO PM
6250 PL=-1:GOSUB 4910:GOSUB 5100:GOSUB 6500
6260 C1=C2:A(T1(ZZ),T2(ZZ))=PL:X=P1(ZZ)
6270 Y=P2(ZZ):GOSUB 5660:GOSUB 4500:GOSUB 6500
6280 CO=C1-C2*NM/50:PL=1
6290 GOSUB 3300
6300 HM(ZZ)=CO
6310 FOR HM=1 TO PM
6320 HM(ZZ)=HM(ZZ)+C(P1(HM),P2(HM))
6330 NEXT HM
6340 HM(ZZ)=HM(ZZ)/(PM+1)
6350 GOSUB 5000:GOSUB 5200
6360 NEXT ZZ
6370 PM=TP
6380 FOR JJ=1 TO PM
6390 P1(JJ)=T1(JJ):P2(JJ)=T2(JJ)
6400 NEXT JJ
6410 GOSUB 5300
6420 FOR Z=1 TO PM
6430 C(P1(Z),P2(Z))=C(P1(Z),P2(Z))-HM(Z)
6440 NEXT Z
6450 DL=0:PL=-1:RETURN
6500 CO=0:C2=0
6510 FOR CC=1 TO 8
6520 FOR CD=1 TO 8
6530 IF A(CC,CD)=1 THEN C2=C2+1
6540 IF A(CC,CD)=-1 THEN CO=CO+1
6550 NEXT CD
6560 NEXT CC
6570 IF (DL=0)AND(CO=0)OR(DL=0)AND(C2=0) THEN WU=1
6580 IF WU=1 THEN GOTO 6600
6590 RETURN
6600 IF (DL=0)AND(CO=0)OR(DL=0)AND(C2=0) THEN GOTO 6620
6610 GOSUB 6500
6620 GOSUB 250:HO=.01:VE=.07
6630 CN=1:SR$=SL$:GOSUB 650:CN=0
6650 IF C2>CO THEN SR$="  Sehr gut !! Du hast gewonnen ."
6660 IF C2<CO THEN SR$="    Schade !! Du hast verloren ."
6670 IF C2=CO THEN SR$="  Unentschieden !"
6680 GOSUB 650
6690 SD=80:GOSUB 450
6695 CN=1:GOSUB 650:CN=0
6700 HO=.01:VE=.07:CN=1:GOSUB 650:CN=0
6710 SR$="Willst du noch ein Spiel (J/N)?  ":GOSUB 650
6720 GOSUB 210:IF IN=74 THEN GOTO 1000
6730 IF IN=78 THEN GOTO 950
6740 GOTO 6720
9000 REM   *** Erklaerung ***
9010 GOSUB 100
9020 SR$="  S p i e l r e g e l n  ":CC(0)=2:GOSUB 150
9030 CC(0)=7:VE=1:GOSUB 110:PRINT 
9040 PRINT "Dieses Programm ist eine BasiCode-"
9050 PRINT "Version des bekannten Spiels ";
9055 PRINT CHR$(34);"Othello";CHR$(34);"."
9060 PRINT "Auf einem Brett mit 8 x 8 Feldern"
9070 PRINT "setzen du und der Computer"
9080 PRINT "abwechselnd einen Spielstein."
9090 PRINT :PRINT "Deine Steine werden mit ";CHR$(34);
9095 GOSUB 120:CC(0)=2:GOSUB 110:PRINT "O";:CC(0)=7
9097 GOSUB 120:GOSUB 110:PRINT CHR$(34);" und die des"
9100 PRINT "Computers  mit ";CHR$(34);:GOSUB 120
9103 CC(0)=4:GOSUB 110:PRINT "X";
9105 CC(0)=7:GOSUB 120:GOSUB 110:PRINT CHR$(34);" angezeigt."
9110 PRINT "Du darfst nur einen Stein auf ein Feld"
9120 PRINT "setzen, wenn du mit diesem Zug einen"
9130 PRINT "oder mehrere Steine des Computers"
9140 PRINT "einschliessen kannst, und zwar in"
9150 PRINT "horizontaler, vertikaler und"
9160 PRINT "diagonaler Richtung."
9170 PRINT "Die Felder, die du eingeschlossen hast,"
9180 PRINT "werden dann mit deinen Steinen besetzt."
9190 PRINT "Das Ziel des Spiels ist, so viele"
9200 PRINT "Felder wie moeglich zu besetzen."
9210 GOSUB 9390
9220 PRINT :PRINT "Das Spiel endet, wenn alle Felder mit"
9230 PRINT "einem Stein besetzt sind oder kein"
9240 PRINT "Zug mehr moeglich ist. Sieger ist, wer"
9250 PRINT "die meisten Felder besetzt hat."
9260 PRINT "Du kannst nicht auf Felder setzen, wenn"
9270 PRINT "du dort keinen Stein des Computers"
9280 PRINT "einschliessen kannst. Der Computer"
9290 PRINT "zeigt mit einem Punkt an, auf welche"
9300 PRINT "Felder du setzen darfst. Mit Druck auf"
9310 PRINT "die Leertaste kannst du nacheinander"
9320 PRINT "alle Felder sehen, auf die du setzen"
9330 PRINT "darfst. Mit der ENTER- oder RETURN-"
9340 PRINT "Taste setzt du den Stein auf das"
9350 PRINT "Feld, auf dem der Punkt gerade steht."
9360 PRINT 
9370 PRINT "Viel Vergnuegen mit dem Spiel ..."
9380 GOSUB 9390:RETURN
9390 PRINT :PRINT "Druecke eine Taste ..."
9400 GOSUB 210
9410 GOSUB 100:RETURN
25000 DATA 1499,-504,118,98,102,121
25010 DATA -499,1504,-510,-999,21,11
25020 DATA 12,19,-1000,-500,119,19
25030 DATA 49,29,31,49,19,119,99
25040 DATA 10,30,0,0,31,11,99,99
25050 DATA 9,31,0,0,29,11,99,119
25060 DATA 21,49,31,29,51,21,121
25070 DATA -501,-999,21,11,9,21
25080 DATA -999,-501,1501,-501
25090 DATA 121,101,99,121,-501,1499
32000 REM   
32010 REM   ************************
32020 REM   *                      *
32030 REM   *  OTHELLO             *
32040 REM   *                      *
32050 REM   *  J.P.M. SIMONS       *
32060 REM   *  STATIONSSTRAAT 11   *
32070 REM   *  4872 TA ETTEN-LEUR  *
32080 REM   *                      *
32090 REM   *  JULI 1991           *
32100 REM   *                      *
32110 REM   ************************
32120 REM
32130 REM TROS-RADIO dd 911225
32140 REM-spezial DS-Kultur 920318
32200 REM *****************************
32210 REM Korrektur T.Ludwig/22.01.2012
32220 REM in Zeile 1020 vor "DIMCC(2)"
32230 REM ein "REM" hinzugefuegt, da
32240 REM Fehlermeldung bei PC-BASCODER
32250 REM *****************************
32260 REM Uebersetzung fuer
32270 REM Bedienung auf Deutsch
32280 REM Th. Rademacher  April 2023
32290 REM *****************************
32300 REM Grafik fuer KC85/3..5
32310 REM optimiert, Grafikfehler 
32320 REM beseitigt (Variablen CO,C2)
32330 REM FL, Juni 2023
32340 REM *****************************
Ihr könnt es auch im online-Bascoder spielen, sogar auf dem Smartphone:
https://robhagemans.github.io/basicode/
https://robhagemans.github.io/basicode/
Smartphone.jpg (122.58 KiB) 731 mal betrachtet
Auch hiermit: FF (Fiel Fergnügen)! ;-)
Antworten