[B2D] Komplettes Othello mit Computergegner
Übersicht

![]() |
hecticSieger des IS Talentwettbewerb 2006Betreff: [B2D] Komplettes Othello mit Computergegner |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo, wer als Zeitvertreib zwischendurch Lust auf ner Partie Othello hat, kann sich hier den Code kopieren und sich eine EXE draus machen. Der Computer spielt garnicht mal schlecht. Dafür habe ich ihm zusätzlich eine (Vor/Nacht)Teile -Feldermap erstellt.
Spielprinzip: - Der Spieler muß versuchen so viele Steine wie möglich sich anzueignen. - Spieler hat weiße Spielsteine, Computer hat schwarze Spielsteine - Es kann nur ein Spielstein auf ein Feld gelegt werden, wo mindestens ein gegnerischer Spielstein angeeignet wird. - Aneignung passiert dann, wenn in einer Reihe (horizontal/diagonal/vertikal) gegnerische Spielsteine durchgehend vorhanden sind und am Ende dieser Reihe ein eigener steht. Hier noch ein paar Infos: - Am Anfang wird per Zufall entschieden wer anfangen darf Spieler/Computer. - Alle mögliche Felder die der Spieler spielen darf, werden mit einem kleinem Quadrat markiert. Ist zwar beim richtigem Spiel sicherlich nicht so, aber die Zeile könnt ihr euch ja auch ausschneiden. Ausserdem sollten auf diesem Spiel keine Weltmeisterschaften gespielt werden. - Mit der rechten Maustaste kann man die Anzahl der Spielsteine (eigene/Computer) anzeigen lassen. - Bei Spielende wird das Ergebnis in die othello.dat zu älteren Spielergebissen hinzugefügt (Ähnlich wie bei FreeCell von MS), und ein Aufstellungsergebnis angezeigt. Code: [AUSKLAPPEN] ; Das Programm darf frei verwendet werden
; Programmautor: Darko Najman, 04.08.2005 ; Othello Version 1.1 ; Graphics 320,320,16,2 SetBuffer BackBuffer() ClsColor 120,120,120 AppTitle "Othello" ;Variablendeklarationen Global x%=0 ;Schleifenvariable X-Spielfeld Global y%=0 ;Schleifenvariable Y-Spielfeld Global q%=0 ;Allgemeine Schleifenvariable Global w%=0 ;Allgemeine Schleifenvariable Global ok%=0 ;Fehlervariable zum finden Global mx%=0 ;Maus-X-Spielfeldposition Global my%=0 ;Maus-Y-Spielfeldposition Global ic%=1 ;Spielmodus bestimmen Global gn%=0 ;Geht noch ein weiterer Zug Global s1%=0 ;Spielwertzähler Spieler Global s2%=0 ;Spielwertzähler Computer Global cx%=0 ;Computer X-Position Global cy%=0 ;Computer Y-Position Global ct%=0 ;Computer Treffpunkte ;Spielfeld Dim xy%(9,9) xy(4,4)=1 xy(5,4)=2 xy(4,5)=2 xy(5,5)=1 ;Koordination X Dim xc%(7) xc(0)=0 xc(1)=1 xc(2)=1 xc(3)=1 xc(4)=0 xc(5)=-1 xc(6)=-1 xc(7)=-1 ;Koordination Y Dim yc%(7) yc(0)=-1 yc(1)=-1 yc(2)=0 yc(3)=1 yc(4)=1 yc(5)=1 yc(6)=0 yc(7)=-1 ;Vor/Nachteile Dim vn%(9,9) ;Sprungmarke setzen Restore vornachteile ;Vor/Nachteiletabelle einlesen For y=0 To 9:Read Level,vn(0,y),vn(1,y),vn(2,y),vn(3,y),vn(4,y),vn(5,y),vn(6,y),vn(7,y),vn(8,y),vn(9,y):Next ;Zufallsgenerator SeedRnd MilliSecs() ;Level Zeichnen zeichnen() ;Beginerentscheid ic=Rand(1,2) finden(ic) Delay 500 ;HAUPTSCHLEIFE While Not KeyHit(1) ;Computerspielmodus If ic=2 Then ;Computer spielen computer() ;Level Zeichnen zeichnen() ;Für Benutzermodus finden(1):ic=1 End If ;Benutzerspielmodus If ic=1 Then ;Maus erfassen mx=MouseX()/32 my=MouseY()/32 ;Maus einschränken If mx>9 Then mx=9 If my>9 Then my=9 ;Wenn Auswahl mit Maus getroffen If MouseHit(1) And xy(mx,my)<0 Then ic=2:steine(mx,my,1) ;Level Zeichnen zeichnen() End If Wend ;Wer gewonnen finden(1) ;Spiel beenden beenden(0) ;COMPUTER-KI Function computer() cx=0 cy=0 ct=0 ;Vermenschlichung Delay 500 ;Möglichkeit finden finden(2) ;Möglichkeiten spielen For x=0 To 9 For y=0 To 9 If xy(x,y)<0 Then ;Vorteile sichern xy(x,y)=xy(x,y)-vn(x,y) ;Spielentscheidung festlegen If ct>xy(x,y) Then cx=x:cy=y:ct=xy(x,y) If ct=xy(x,y) Then If Rnd(0,1)>0.5 Then cx=x:cy=y:ct=xy(x,y) End If Next Next ;Steinreihen setzen steine(cx,cy,2) End Function ;ZEICHNEN Function zeichnen() Cls ;Spielsteine zeichnen For x=0 To 9 For y=0 To 9 Color 080,080,080:Rect x*32,y*32,32,32,0 If xy(x,y)=1 Then Color 240,240,240:Oval 2+x*32,2+y*32,28,28,1 If xy(x,y)=2 Then Color 000,000,000:Oval 2+x*32,2+y*32,28,28,1 If xy(x,y)<0 Then Color 140,140,140:Rect 6+x*32,6+y*32,20,20,0;:Color 0,0,0:Text 2+x*32,2+y*32,Abs(xy(x,y)) If ic=1 Then Color 240,240,240:Rect mx*32,my*32,32,32,0 Next Next ;Anzahl Steine anzeigen If MouseDown(2) Then Color 080,080,080:Rect 137,24,45,15,1 Color 255,255,255:Rect 136,23,47,17,0 Text 139,25,Right$("00"+s1,2)+"/"+Right$("00"+s2,2) End If Flip End Function ;MÖGLICHKEITEN Function finden(s) ;Für Spielende bereiten gn=0:s1=0:s2=0 ;Spielfeld überprüfen For x=0 To 9 For y=0 To 9 ;Alte Möglichkeit löschen If xy(x,y)<0 Then xy(x,y)=0 ;Spielsteine zusammenzählen If xy(x,y)=1 Then s1=s1+1 If xy(x,y)=2 Then s2=s2+1 ;Eventuelle Möglichkeit prüfen If xy(x,y)=0 Then ;Alle 8 Richtungen prüfen For q=0 To 7 ;Richtung bis Spielfeldende ok=0:For w=1 To 9 ;Nur wenn kein Spielfeldende If Not x+xc(q)*w<0 Then If Not x+xc(q)*w>9 Then If Not y+yc(q)*w<0 Then If Not y+yc(q)*w>9 Then ;Spielsteinmöglichkeit prüfen If xy(x+xc(q)*w,y+yc(q)*w)=0 Then ok=-1 If xy(x+xc(q)*w,y+yc(q)*w)<0 Then ok=-1 If xy(x+xc(q)*w,y+yc(q)*w)=3-s And ok<>-1 Then ok=1 If xy(x+xc(q)*w,y+yc(q)*w)=s And ok=1 Then gn=1:xy(x,y)=xy(x,y)-w+1 If xy(x+xc(q)*w,y+yc(q)*w)=s Then ok=-1 End If End If End If End If Next Next End If Next Next ;Keine Möglichkeiten If gn=0 Then beenden(s) End Function ;SPIELSTEINE ZEICHNEN Function steine(x,y,s) ;Ersten Stein setzen xy(x,y)=s ;Alle 8 Richtungen prüfen For q=0 To 7 ;Richtung bis Spielfeldende ok=0:For w=1 To 9 ;Nur wenn kein Spielfeldende If Not x+xc(q)*w<0 Then If Not x+xc(q)*w>9 Then If Not y+yc(q)*w<0 Then If Not y+yc(q)*w>9 Then ;Spielsteinmöglichkeit prüfen If xy(x+xc(q)*w,y+yc(q)*w)=0 Then ok=-1 If xy(x+xc(q)*w,y+yc(q)*w)<0 Then ok=-1 If xy(x+xc(q)*w,y+yc(q)*w)=s And ok=0 Then ok=1 End If End If End If End If ;Nur bis Reichweite der Richtung If ok=1 Then For w=1 To 9 ;Nur wenn kein Spielfeldende If Not x+xc(q)*w<0 Then If Not x+xc(q)*w>9 Then If Not y+yc(q)*w<0 Then If Not y+yc(q)*w>9 Then If xy(x+xc(q)*w,y+yc(q)*w)=s Then ok=-1 If ok=1 Then xy(x+xc(q)*w,y+yc(q)*w)=s End If End If End If End If Next End If Next Next End Function ;SPIEL BEENDEN Function beenden(s) ;Aktuelles Bild zeigen Flip:Delay 1000 ;Bild verdunkeln Color 0,0,0 For q=-320 To 320 Step 2 Line q,0,q+320,320 Next ;Texthintergrund Color 40,40,40 Rect 0,25,320,15,1 Rect 0,57,320,15,1 Rect 0,89,320,15,1 Rect 0,121,320,15,1 Rect 0,217,320,15,1 Rect 0,249,320,15,1 Rect 0,281,320,15,1 ;Informationsausgabe Color 255,255,255 If s=0 Then Text 0,25,"Spiel abgebrochen, Spiel verloren" If s=1 Then Text 0,25,"Sie haben keine Möglichkeiten mehr" If s=2 Then Text 0,25,"Computer hat keine Möglichkeiten mehr" Text 0,57,s1+" Spielsteine Spieler" Text 0,89,s2+" Spielsteine Computer" If s1<s2 Then s1=0:s2=1:Text 0,121,"Sie haben verloren" If s>0 And s1>s2 Then s1=1:s2=0:Text 0,121,"Sie haben gewonnen" If s=0 And s1=>s2 Then s1=0:s2=1:Text 0,121,"Warum tun Sie sowas?" If s1=s2 Then s1=0:s2=0:Text 0,121,"Das Spiel ist unentschieden" ;Prüfen ob Spielstände verfügbar If FileType("othello.dat")=1 Then ;Bisherige Spielstände lesen othello=ReadFile("othello.dat") s1=s1+ReadInt(othello) s2=s2+ReadInt(othello) CloseFile othello End If ;Bisherige Ergebnisse anzeigen Text 0,217,s1+" Spiele gewonnen" Text 0,249,s2+" Spiele verloren" If (s1+s2)>0 Then Text 0,281,100/(s1+s2)*s1+"% aller Spiele gewonnen" ;Neue Werte in Datei schreiben othello=WriteFile("othello.dat") WriteInt othello,s1 WriteInt othello,s2 CloseFile othello ;Bild zeigen Flip ;Warten auf Reaktion FlushKeys WaitKey End End Function .vornachteile Data 0, 8,1,6,3,4,4,3,6,1,8 Data 1, 1,0,1,1,1,1,1,1,0,1 Data 2, 6,1,4,2,2,2,2,4,1,6 Data 3, 3,1,2,1,2,2,1,2,1,3 Data 4, 4,1,2,2,2,2,2,2,1,4 Data 5, 4,1,2,2,2,2,2,2,1,4 Data 6, 3,1,2,1,2,2,1,2,1,3 Data 7, 6,1,4,2,2,2,2,4,1,6 Data 8, 1,0,1,1,1,1,1,1,0,1 Data 9, 8,1,6,3,4,4,3,6,1,8 Code nochmal aktualisiert. Für Lob/Kritik würde ich mich freuen... Viel Spaß damit, hectic... |
||
- Zuletzt bearbeitet von hectic am Do, Apr 06, 2006 13:52, insgesamt 2-mal bearbeitet
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aaaargh, wer die Formatierung (Einrückung) nicht verhunzen will. Sollte den Code vor einfügen in BB diesen erst in Notepad einfügen, neu markieren z.B. mit [Strg]+[a], und dann in BB einfügen.
... Und noch was. Wer immer nur gegen Computer verliert sollte die Seiten und vor allem die Ecken bevorzugen. Gerade bei den Ecken hat der Computer keine Möglichkeit mehr den gesetzten Stein sich anzueignen. Damit der Computer die Ecken nicht bekommt (darauf wartet er nähmlich nur die ganze Zeit), sollten die drei Felder um den Ecken herrum gemieden werden... Hoffe, jetzt habe ich nicht zuviel gesagt. |
||
![]() |
Xaron |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey, nettes Spiel. ![]() Gruß - Xaron |
||
Cerberus X - Monkey X Reloaded! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group