Super-OTHELLO

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

Super-OTHELLO

Beitrag von ein Thüringer »

Hier ist eine OTHELLO-Version mit einigen Wahlmöglichkeiten.

Code: Alles auswählen

1 RANDOMIZE (60*PEEK(64503!)+PEEK(64504!)):IF PEEK(&HF000)=&H7E THEN 10
2 GOSUB 957:GOTO 983
10 GOTO 1000:REM BASICODE-3 f}r Amstrad PCW v 1.01
20 GOSUB 100:CLEAR:SV=7:OSETCHAR=&HF000:OSETPOINT=&HF0BA:OPOINT2=&HF256:ODRAW=&HF162:OGETCUR=&HF263:OREADCHAR=&HF277:OFINDCHAR=&HF287
21 HO=39:VE=31:HG=659:VG=247
28 GOTO 1010
100 PRINT CHR$(27)"e"CHR$(27)"c?"CHR$(27)"b"CHR$(0);:WIDTH 255
101 PRINT CHR$(27)"E"CHR$(27)"H";:HO=0:VE=0:GOSUB 952:RETURN
110 HO=MAX(0,HO):HO=MIN(39,HO):VE=MAX(0,VE):VE=MIN(31,VE):PRINT CHR$(27)"Y"CHR$(32+VE)CHR$(32+HO);:RETURN
120 CALL OGETCUR:HO=PEEK(&HF26C):VE=PEEK(&HF26D):RETURN
150 PRINT CHR$(27)"p   ";SR$;"   "CHR$(27)"q";:RETURN
200 IN=0:IN$=INKEY$:IF IN$<>"" THEN IN=ASC(IN$)
201 IN=IN+32*((IN>96)AND(IN<127))
202 IN=IN-27*(IN=1):IN=IN-23*(IN=6):IF IN=127 THEN GOSUB 120:IF HO>0 THEN IN$=CHR$(27)+"D "+CHR$(27)+"D" ELSE IN=0:IN$=""
203 RETURN
210 GOSUB 200:IF IN$<>"" THEN RETURN ELSE 210
220 IF ((HO<0) OR (HO>39)) THEN IN=0:RETURN
221 IF ((VE<0) OR (VE>24)) THEN IN=0:RETURN
222 POKE &HF278,VE:POKE &HF27A,HO:CALL OREADCHAR:CALL OFINDCHAR:IN=PEEK(&HF276):CN=-32*((IN>96)AND(IN<127)):IN=IN-CN:RETURN
250 PRINT CHR$(7);:RETURN
260 RV=RND:RETURN
270 FR=FRE(""):RETURN
280 OPTION RUN:IF FR=1 THEN OPTION STOP
281 RETURN
300 SR$=STR$(SR):IF SR>=0 THEN SR$=MID$(SR$,2)
301 RETURN
310 IF CN=0 THEN SR$=DEC$(SR,STRING$(CT,"#")) ELSE SR$=DEC$(SR,STRING$(CT-CN-1,"#")+"."+STRING$(CN,"#"))
311 IF LEFT$(SR$,1)="%" THEN SR$=STRING$(CT,"*")
312 RETURN
330 FOR OF=1 TO LEN(SR$)
331 IF ASC(MID$(SR$,OF,1))>95 THEN GOSUB 340
332 NEXT OF
333 RETURN
340 OSR=ASC(MID$(SR$,OF,1))-32
341 SR$=LEFT$(SR$,OF-1)+CHR$(OSR)+MID$(SR$,OF+1)
342 RETURN
350 LPRINT SR$;:RETURN
360 LPRINT:RETURN
400 IF SV=0 THEN 450
401 IF SD=0 THEN RETURN ELSE OP=SP:ODUUR=SD
402 OP=MAX(SP,11):OP=MIN(SP,112)
403 SD=SD*0.45:ODUUR=MAX(SD,1):ODUUR=MIN(SD,255)
412 OFREQ=880*(2^((OP-69)/12)):OCW=ROUND(400000!/3/OFREQ)-4:OCW=MAX(OCW,1):OCW=MIN(OCW,255)
413 OHLW=0.2*ODUUR*OFREQ:OHLW=MAX(OHLW,1):OHLW=MIN(OHLW,65535!)
415 OADR=&HF404:OLW=OHLW-256*INT(OHLW/256):POKE OADR,(OHLW-OLW)/256:OADR=&HF403:POKE OADR,OLW:OADR=&HF401:POKE OADR,OCW:OADR=&HF400
416 CALL OADR:RETURN
450 OSD=SD*3.45
451 OSD=OSD-1
452 GOSUB 200:IF IN=0 THEN 453 ELSE IF SV<>0 THEN 454
453 IF OSD>0 THEN 451 ELSE 457
454 SD=INT(OSD/3.45)
455 RETURN
457 SD=0:GOTO 455
500 ON NF+1 GOTO 541,541,516,521,516,521,516,521
516 OPEN "I",#2,NF$:INPUT #2,OBESTAND$:IN=0:RETURN
521 PRINT NF$:OPEN "O",#3,NF$:IN=0:RETURN
540 IN$="":IN=1:ON (NF+2)/2 GOTO 541,551,551,551
541 OTX$=CHR$(27)+"p   Arbeit mit Tape am Parallelport au~erhalb Basic mit BCREAD.COM / BCWRIT.COM   "+CHR$(27)+"q":GOSUB 951:RETURN
551 IN$=OBESTAND$:IF EOF(2) THEN 559 ELSE LINE INPUT #2,OBESTAND$
552 IF OBESTAND$<>"" THEN OU$=MID$(OBESTAND$,1,1):IF ASC(OU$)=26 THEN OBESTAND$="":IN=1:RETURN
553 IF EOF(2) THEN 559
554 IN=0:RETURN
559 RETURN
560 IN=1:ON (NF+1)/2 GOTO 561,575,575,574
561 GOSUB 541:RETURN
575 PRINT #3,SR$:IN=0:RETURN
580 ON NF+1 GOTO 541,541,591,593,591,593,591,593
591 CLOSE #2:RETURN     
593 PRINT #3,CHR$(26):PRINT #3,CHR$(26):CLOSE #3:RETURN 
600 PRINT CHR$(27)"f"CHR$(27)"c"CHR$(0)CHR$(27)"b?";:GOSUB 101:RETURN
620 GOSUB 655:OPH%=INT(OHO*HG):OPV%=INT(OVE*VG):OPM%=CN XOR 1:CALL OSETPOINT(OPV%,OPH%,OPM%):CALL OPOINT2(OPV%,OPH%):RETURN
630 GOSUB 655:OPH%=INT(OHO*HG):OPV%=INT(OVE*VG):OPM%=CN XOR 1:CALL ODRAW(OPV%,OPH%,OPM%):CALL OPOINT2(OPV%,OPH%):RETURN
650 GOSUB 655:OVE=MIN(OVE,0.972):OPV%=INT(OVE*VG):FOR OPT%=0 TO LEN(SR$)-1:OPH%=INT(OHO*HG)+OPT%*16:OPH%=MIN(OPH%,652):OPC%=-(CN=0)*ASC(MID$(SR$,OPT%+1,1))-32*(CN=1):CALL OSETCHAR(OPV%,OPH%,OPC%):NEXT OPT%:RETURN
655 OHO=MAX(0,HO):OHO=MIN(OHO,0.998):OVE=MAX(0,VE):OVE=MIN(OVE,0.995):RETURN
950 GOSUB 100:INPUT;"welches BasiCode-Programm laden (ENTER f}r R}ckkehr zu Mallard Basic) : ",IN$:IF IN$<>"" THEN CHAIN MERGE IN$,10,ALL,DELETE 1000-:ELSE CLEAR:PRINT CHR$(27)"E"CHR$(27)"H":END
951 GOSUB 120:OLEN=0.5*(90-LEN(OTX$)):PRINT CHR$(27)"0"CHR$(27)"Y@ ";:PRINT STRING$(OLEN,32);OTX$;:GOSUB 110:WHILE INKEY$="":WEND
952 PRINT CHR$(27)"0"CHR$(27)"Y@             BasiCode-3  f}r  Mallard Basic  auf  Amstrad PCW / Schneider JOYCE      ";:GOSUB 110:RETURN
953 REM Grafik-Routinen aus "SCREENY" von J. Steingr{ber & U. Baumgarten, PCAI 2'88
954 REM Sound-Routine aus "JOYCE COMPOSER" von P.-R. Wolter, PCAI 10'89
955 REM GOSUB 220 nach M. Anton Joyce-Sonderheft 1'87 und Norbert Finke PCAI 6/7'91
956 REM dynamische Berechnung des XBIOS-Vektors nach einem Hinweis von Werner Cirsovius 
1000 A=100:GOTO 20:REM  ** OTHELLO **
1010 DIM F(16,16),I4(14),J4(14),C$(14),D$(3)
1020 HT=HO:VT=VE:CC(0)=5:CC(1)=0:
1030 GOSUB 100:PRINT:SR$="OTHELLO":GOSUB 150
1040 PRINT " wird auf einem quadrat."
1050 PRINT " Brett gespielt, dessen Zeilen von 1-14"
1060 PRINT " und dessen Reihen von A-N bezeichnet"
1070 PRINT " sind. Die Ausgangsstellung ist alle"
1080 PRINT " Felder leer, ausser den mittleren"
1090 PRINT " die eine feste Form haben."
1100 PRINT " Versuche deine Steine so zu plazieren"
1110 PRINT " dass sie meine einschliessen indem sie":
1120 PRINT " eine horizontale, vertikale oder eine"
1130 PRINT " diagonale Linie bilden. Dann werden"
1140 PRINT " alle neu eingeschlossenen Steine in"
1150 PRINT " deine umgewandelt - und umgekehrt"
1160 PRINT " geht es natuerlich auch !"
1170 REM HO=0:VE=VT:GOSUB 110:PRINT "(Taste druecken)";    
1180 REM GOSUB 210:GOSUB 100:PRINT 
1190 PRINT:SR$="Beachte":GOSUB 150
1200 PRINT " Du musst mindestens einen"
1210 PRINT " von meinen Steinen schlagen wenn es"
1220 PRINT " moeglich ist; ansonsten gib fuer"
1230 PRINT " Deinen Zug   0,0   ein.":PRINT 
1240 PRINT "****************************************"
1500 REM *** INITIALISIERUNG ***
1510 D$(1)="X":D$(2)=".":D$(3)="O":SD=40
1520 SR$="Falsche Eingabe"
1530 RESTORE:FOR I=1 TO 14:READ I4(I),J4(I),C$(I):NEXT I
1540 PRINT "  Welche Spielfeldgroesse (3...14) ?":GOSUB 210
1550 IF ((IN<51) OR (IN>90)) THEN GOSUB 150:PRINT:GOTO 1540
1554 IF ((IN>57) AND (IN<86)) THEN IN=86
1556 IF IN>85 THEN IN=IN-28
1560 M=IN-48:G=INT(M/2)+1:V=INT(M/2)+2
1570 FOR I=1 TO 15:FOR J=1 TO 15:F(I,J)=0:NEXT J:NEXT I
1580 F(G,G)=1:F(V,V)=1:F(V,G)=-1:F(G,V)=-1
1590 C1=2:H1=2:N1=4:Z=0:XX=0:YY=0
1600 PRINT:PRINT "  Welche Betriebsart :"
1610 PRINT "    1 = gegen den Computer"
1620 PRINT "    2 = Computer gegen sich selbst"
1630 PRINT "    3 = zwei Spieler gegeneinander"
1640 GOSUB 210:IF ((IN<49) OR (IN>51)) THEN GOSUB 150:GOTO 1600
1650 IF IN=50 THEN XX=1:S2=2:C=1:H=-1:GOSUB 3510:GOTO 2010
1660 IF IN=51 THEN YY=1:C=1:H=-1:GOSUB 3510:GOTO 2510
1670 PRINT:PRINT "Soll ich meine grosse Staerke spielen"
1680 PRINT "   oder nicht (Y/N) ?":GOSUB 210
1690 IF IN=89 THEN S2=2:GOTO 1720
1700 IF IN=78 THEN S2=0:GOTO 1720
1710 GOSUB 150:PRINT:GOTO 1670
1720 PRINT:PRINT "  Willst Du  X oder O  ?":GOSUB 210
1730 IF IN=88 THEN C=1:H=-1:GOTO 1760
1740 IF IN=79 THEN C=-1:H=1:GOTO 1760
1750 GOSUB 150:PRINT:GOTO 1720
1760 PRINT:PRINT "  Willst Du anfangen ? Y/N":GOSUB 210
1770 IF IN=89 THEN GOSUB 3510:GOTO 2510
1780 IF IN=78 THEN GOSUB 3510:GOTO 2010
1790 GOSUB 150:PRINT:GOTO 1760
1800 VE=VT-2:HO=0:CC(0)=5:GOSUB 110:SD=20:GOSUB 450
1810 PRINT "                                     "
1820 REM PRINT "                                    "
1830 PRINT "                                    "
1840 VE=VT-2:GOSUB 110:RETURN
2000 REM *** COMPUTERZUG ***
2010 T1=C:T2=H
2020 B1=-1:I3=0:J3=0:IF ((H1=0) OR (N1=INT(M^2))) THEN 2760
2030 GOSUB 1800
2040 GOSUB 120:CC(0)=4:IF D$(T1+2)="O" THEN CC(0)=2
2042 VE=VE+1:GOSUB 110:PRINT " Bitte warten  '";
2044 PRINT D$(T1+2);
2046 PRINT "'  ist dran":VE=VE-1
2050 FOR I=2 TO M+1
2060 FOR J=2 TO M+1
2070 IF F(I,J)<>0 THEN 2170
2080 GOSUB 2910:IF F1=0 THEN 2170
2090 U=-1:GOSUB 3000
2100 IF S1=0 THEN 2170
2110 IF (I-2)*(I-M+1)=0 THEN S1=S1+S2
2120 IF (J-2)*(J-M+1)=0 THEN S1=S1+S2
2130 IF S1<B1 THEN 2170
2140 IF S1>B1 THEN 2160
2150 GOSUB 260:IF RV<0.5 THEN 2170
2160 B1=S1:I3=I:J3=J
2170 NEXT J
2180 NEXT I
2190 GOSUB 110:IF B1>0 THEN 2230
2200 PRINT "  Ich setze aus !           "
2210 IF Z=1 THEN 2860
2220 Z=1:GOSUB 450:GOTO 2290
2230 Z=0:PRINT " Ich ziehe nach   ";I3-1;", ";C$(J3-1);"    "
2240 I=I3:J=J3:U=1:GOSUB 3000
2250 IF T1=C THEN C1=C1+S1+1:H1=H1-S1
2260 IF T1=H THEN H1=H1+S1+1:C1=C1-S1
2270 N1=N1+1
2280 PRINT " Ich bekomme ";S1+1;" Steine dazu":CC(0)=5
2285 GOSUB 120:GOSUB 110:GOSUB 3520
2290 IF ((XX=1) AND (T1=C)) THEN T1=H:T2=C:GOTO 2020
2300 IF XX=1 THEN 2010
2500 REM *** SPIELERZUG ***
2510 T1=H:T2=C
2520 IF (C1=0) OR (N1=INT(M^2)) THEN 2760
2530 GOSUB 1800
2540 CC(0)=4:IF D$(T1+2)="O" THEN CC(0)=2
2545 GOSUB 120:GOSUB 110
2546 PRINT " Dein Zug (Zeile,Spalte),  ";D$(T1+2);"  ";
2550 GOSUB 210:IF ((IN<48) OR (IN>90)) THEN 2740
2554 IF ((IN>57) AND (IN<86)) THEN IN=86
2556 IF IN>85 THEN IN=IN-28
2560 I=IN-48:PRINT I;", ";:GOSUB 210:IN$=CHR$(IN):PRINT IN$
2570 IF I=0 THEN Z=1:GOTO 2710
2580 Q=1
2590 IF C$(Q)=IN$ THEN 2620
2600 IF Q<M THEN Q=Q+1:GOTO 2590
2610 GOTO 2750
2620 J=Q:I=I+1:J=J+1
2630 IF F(I,J)<>0 THEN 2750
2640 GOSUB 2910:IF F1<>1 THEN 2740
2650 U=-1:GOSUB 3000:IF S1=0 THEN 2740
2660 Z=0:U=1:GOSUB 3000
2670 PRINT " Du bekommst ";S1+1;" Steine dazu"
2675 CC(0)=5:GOSUB 110:
2680 IF T1=H THEN H1=H1+S1+1:C1=C1-S1
2690 IF T1=C THEN C1=C1+S1+1:H1=H1-S1
2700 N1=N1+1:GOSUB 3520
2710 IF ((YY=1) AND (T1=H)) THEN T1=C:T2=H:GOTO 2520
2720 IF YY=1 THEN 2510
2730 GOTO 2010
2740 PRINT:REM fehlerhafte Eingabe
2750 GOSUB 110:GOSUB 150:GOSUB 450:GOTO 2510
2760 IF ((XX=1) OR (YY=1)) THEN 2860
2770 GOSUB 1800:IF H1=C1 THEN PRINT " Unentschieden !"
2780 IF H1<C1 THEN PRINT " Diesmal habe ich gewonnen"
2790 IF H1>C1 THEN PRINT " Du hast gewonnen"
2800 PRINT " Das war ein   ";
2810 IF H1<=INT(M*M*0.9) THEN 2820
2815 PRINT "  Super-Spiel":GOTO 2860
2820 IF H1<=INT(M*M*0.8) THEN 2830
2825 PRINT "  perfektes Spiel ":GOTO 2860
2830 IF H1<=INT(M*M*0.7) THEN 2840
2835 PRINT "  grosser Kampf":GOTO 2860
2840 IF H1<=INT(M*M*0.6) THEN 2850
2845 PRINT "  heisses Spiel":GOTO 2860
2850 PRINT "  Mist - Spiel"
2860 SR$=" Ein neues  Spiel ?   Y/N   "
2870 GOSUB 1800:GOSUB 150:GOSUB 210
2880 IF IN=89 THEN GOSUB 100:GOTO 1510
2890 IF IN=78 THEN 950
2900 PRINT:GOTO 2870
2910 F1=0:FOR I1=-1 TO 1:FOR J1=-1 TO 1
2920 IF F(I+I1,J+J1)=T2 THEN F1=1
2930 NEXT J1:NEXT I1
2940 RETURN
3000 S1=0:FOR K=1 TO 8
3010 I5=I4(K):J5=J4(K):I6=I+I5:J6=J+J5:S3=0
3020 IF F(I6,J6)<>T2 THEN 3120
3030 S3=S3+1:I6=I6+I5:J6=J6+J5
3040 IF F(I6,J6)=T1 THEN 3070
3050 IF F(I6,J6)=0 THEN 3120
3060 GOTO 3030
3070 S1=S1+S3:IF U<>1 THEN 3120
3080 I6=I:J6=J
3090 FOR K1=0 TO S3
3100 F(I6,J6)=T1:I6=I6+I5:J6=J6+J5
3110 NEXT K1
3120 NEXT K
3130 RETURN
3500 REM *** SPIELFELD ***
3510 GOSUB 100
3520 VE=14-M:HO=13-M:GOSUB 110
3530 IF ((XX=1) OR (YY=1)) THEN PRINT "   ";:GOTO 3560
3540 IF S2=0 THEN PRINT "k) ";
3550 IF S2=2 THEN PRINT "g) ";
3560 FOR Q=1 TO M:PRINT C$(Q);" ";:NEXT Q
3570 FOR I=M+1 TO 2 STEP-1:VE=VE+2:HO=13-M:GOSUB 110
3580 SR=I-1:GOSUB 300
3582 IF SR<10 THEN 3586
3584 SR$=CHR$(SR+76)
3586 PRINT " ";SR$;" ";
3590 FOR J=2 TO M+1:T$=D$(F(I,J)+2)
3591 IF ((T$<>"X") AND (T$<>"O")) THEN 3595
3592 CC(0)=2:IF T$="X" THEN CC(0)=4
3593 GOSUB 120:GOSUB 110:PRINT T$;" ";:CC(0)=5
3594 GOSUB 120:GOSUB 110:GOTO 3596
3595 PRINT T$;" ";
3596 NEXT J
3600 PRINT:PRINT:NEXT I
3610 IF ((XX=1) OR (YY=1)) THEN 3630
3620 VE=5:HO=32:GOSUB 110:PRINT "DU  ICH"
3630 VE=7:HO=33:GOSUB 110
3640 IF H<>1 THEN 3650
3645 CC(0)=2:GOSUB 120:GOSUB 110:PRINT "O    ";
3646 CC(0)=4:GOSUB 120
3647 GOSUB 110:PRINT "X":CC(0)=0:GOSUB 110:GOTO 3660
3650 IF H<>-1 THEN 3660
3655 CC(0)=4:GOSUB 120:GOSUB 110:PRINT "X    ";
3656 CC(0)=2:GOSUB 120
3657 GOSUB 110:PRINT "O":CC(0)=5:GOSUB 110
3660 VE=13:HO=31:CC(0)=4:IF C=-1 THEN CC(0)=2
3665 GOSUB 110:SR=H1:CT=3:CN=0:GOSUB 310:PRINT SR$
3666 CC(0)=5:GOSUB 110
3670 HO=36:CC(0)=2:IF C=-1 THEN CC(0)=4
3675 GOSUB 110:SR=C1:GOSUB 310:PRINT SR$
3677 CC(0)=5:GOSUB 110
3680 RETURN
25000 DATA 0,1,"A",-1,1,"B",-1,0,"C",-1,-1,"D"
25010 DATA 0,-1,"E",1,-1,"F",1,0,"G",1,1,"H"
25020 DATA 0,1,"I",-1,1,"J",-1,0,"K",-1,-1,"L"
25030 DATA 0,-1,"M",-1,0,"N"
32000 REM ****************************
32010 REM *                          *
32020 REM *  STRATEGIESPIEL OTHELLO  *
32030 REM * geschrieben auf  KC 85/4 *
32040 REM *                          *
32050 REM *      Wolfgang Pohle      *
32060 REM *     Waldpromenade  3     *
32070 REM *       Erkner  1250       *
32080 REM *                          *
32090 REM *     Stand 02.02.1990     *
32100 REM *                          *
32110 REM ****************************
32120 REM
32130 REM Erstausstrahlung: DS-Kultur
32140 REM -spezial 900725
32200 REM 
32210 REM auf Farbbetrieb abgeaendert,
32220 REM   Spielfeldvergroesserung
32230 REM
32240 REM       Thomas Rademacher
32250 REM      JOYCE-User-AG e. V.
32260 REM
32270 REM           Juli 2023
Das Programm muss aus dem BasiCode-Menü geladen werden, damit die erforderlichen Maschinencode-Routinen initialisiert werden.
Bild_1.jpg
Bild_1.jpg (22.77 KiB) 4150 mal betrachtet
Es bietet die Auswahl zwischen Anzahl der Spieler, zwei unterschiedlichen Spielstärken des Computers bei Option 1
Bild_2.jpg
Bild_2.jpg (60.26 KiB) 4150 mal betrachtet
und Spielfeldgrößen von 3 * 3 bis 14 * 14 (10 ... 14 werden durch V ... Z gewählt).
Bild_3.jpg
Bild_3.jpg (16.82 KiB) 4150 mal betrachtet
Das Ursprungsprogramm http://robhagemans.github.io/basicode/b ... OTHELLO.bc hatte nur ein 8*8-Spielfeld, das ließ auf der Joyce viel freien Platz, was mich verlockte, es für größere Felder umzuschreiben. Natürlich ist es bei einem riesigen Spielfeld sehr langsam, in der CP/M-Box kann das die F11-Taste ausgleichen.
So ein großes Spielfeld (auf einem 8-bit-Computer) ist sonst nur auf dem Robotron KC85 möglich, dort konnte ich auch Farben hineinbringen.
KC85: wie bei Joyce 32 Zeilen - aber Farben
KC85: wie bei Joyce 32 Zeilen - aber Farben
Bild_4.jpg (77.87 KiB) 4150 mal betrachtet
Auf 24-oder 25-Zeilen-Computern sind höchstens 10 * 10 Felder möglich. Rob Hagemans' Browser-Bascoder lässt sich in "Settings" ausreichend groß einstellen. Auch das Tempo (Default 1000 cycles per second, was schon beachtlich ist) lässt sich hier deutlich höher einstellen.
Bild_5.jpg
Bild_5.jpg (139.33 KiB) 4148 mal betrachtet
Viel Spaß damit!
EDIT: 27.VII. 16:48 - bis Spielfeldgröße 14
Antworten