Reversi KI

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2, 3, 4

Neue Antwort erstellen

 

neolein

BeitragDi, Feb 09, 2010 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Na gut.... "Es gibt nirgends eine Regel, die verbietet, dass in einem Thread nur zwei Leute aktiv mitmachen dürften."

Wir haben keine Regel, es dürfen Alle mitmachen.

Also dann eben kein Worklog.

Richtig, wir erarbeiten einen Code in BlitzBasic, ich wäre sehr überrascht, wenn das in einem BlitzBasic-Forum nicht möglich sein sollte, denn dafür ist es ja da.

Aber eben dafür ist das allg. Forum nicht flexibel genug, weil immer Alles wiederholt eingegeben werden muß, besser wäre es, Rechte an einen Dritten zu vergeben, damit auch er an einem bestehenden Code etwas ändern kann.

Ist aber nur meine persönliche Meinung, mal sehen, ob es jetzt so gut läuft, wie Midimaster es vorgeschlagen hat. Das ist immerhin ein Kompromiß.

Midimaster

BeitragDi, Feb 09, 2010 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
@D2006
vorneweg: Ich bin vollkommen einverstanden mit euerer Entscheidung. Es ist euer Forum! Ihr bestimmt, wohin es gehen soll. Und ihr macht eueren Job gut! Very Happy

an das Code-Pasting dachte ich auch als Allererstes...Aber der Nachteil wäre, das der link auf ein solches Pasting in den Posts nach einigen Tagen tot wäre.

Auch das priv. Archiv scheidet leider aus, weil man dort zwar Code hochladen kann, aber ein EDIT nicht möglich ist. Durch ein erneutes Hochladen erhält man immer eine neue URL und damit wären in den Postings wieder tote Links.

Das ist Schade. Das Forum könnte hier mehr Möglichkeit offerieren. Auch den Gedanke von Neolein, zwei Accounts könnten gemeinsam einen Archiveintrag bearbeiten, finde ich gut. Das wäre hilfreich.

Aber sicherlich habt ihr dieses Thema schon einmal besprochen und entschieden, dem gemeinschaftlichen Code-Arbeiten im Portal nicht mehr Möglichkeiten einzuräumen?

Danke auch für den Hinweis, wie es zu den 1000 Aufrufen kommt. Ich wußte nicht, dass die autom. Vorlage bei den Moderatoren da mitgezählt wird. Das relativiert ja vieles...

@Neolein

klar, bau es doch ein, deshalb haben wir ja das SpielFeldMalen() in eine Funktion gekapselt. Jetzt kann man nach Herzenslust darin herumändern. Es beeinflusst den eingentlichen Code garantiert nicht.

Du musst aber dringen die Zufallsoptimierung beginnen! Das ginge vor!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Feb 10, 2010 0:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich dräng mich mal kurz dazwischen, da ich auch mal genau das gleiche Spiel programmiert hatte. Nur ich kannte das Spiel unter den Namen ''Othello'', welches ich dann auf BB programmiert hatte.

https://www.blitzforum.de/foru...ht=othello

Nebenbei noch: Ich kannte die Spielregeln damals nicht 100%ig korrekt, was zur Folge hat, dass sobald ein Spieler keine Zugmöglichkeit hat, automatisch das Spiel beendet bzw. ausgewertet wird. Das ist in den üblichen Regeln nicht richtig. In so einem Fall spielt der Gegner weiter. Das heisst, der eine Spieler muß einmal aussetzen. Diese Möglichkeit wurde also nicht richtig interpretiert.

Interessant könnte es aber dennoch sein, weil die von Midimaster beschriebene Richtungsangaben um mit nur einer Funktion auszukommen die gleich alle Richtungen bearbeiten kann auch eingesetzt wurde. Hier werden die X/Y-Richtungen in den beiden Arrays xc und yc gespeichert.

Außerdem erhält jedes Feld eine Gewichtung wie wichtig es für den weiteren Spielverlauf ist, gespeichert in den Data-Zeilen die auf das 2D-Array vn übertragen wird. So ist die KI ohne Vorberechnung des weiteren Spielverlaufen durchaus in der Lage Sinnvolle Züge zu leisten. Ist somit aber auch schlagbar.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Midimaster

BeitragMi, Feb 10, 2010 1:32
Antworten mit Zitat
Benutzer-Profile anzeigen
@Hectic

danke für deinen Hinweis und den Link Very Happy
ich hab Deine Version gleich mal gespielt (und gleich verloren Wink )und bemerkt, dass beide Vorgehensweisen sehr ähnlich sind. Auch bei mir (anders als bei Neolein) laufen schon die Vorhersagen, wie Du sie in den dünnen Rahmen verwirklicht hast. Zu wissen, ob der Computer alle seine Möglichkeiten ausprobiert hat, ist auch die Voraussetzung für "Abgeben an den Gegner", wenn er einmal nicht ziehen kann.
Die von dir erwähnte Spielregel ist daher ebenfalls bereits eingebaut.

Durch den Trick, nicht alle 8 wirklichen Richtungen, sonder mutig 9 Richtungen (also auch "0,0") zuzulassen ist mein Code wahrscheinlich etwas eleganter und schlanker als deiner.

Aber der wirkliche Hammer ist die KI von dir! Dein "Computer" spielt wirklich gut! Wie hast du das ermittelt?
Ich werde mich mal daran machen, deine KI in unseren Code zu übertragen. Unser Code ist so konzipiert, dass man schnell verschiedene KI's gegeneinander antreten lassen kann. Es gibt keine Unterscheidung Mensch - Computer. So kann man auch Computer-Computer spielen.

So wie ich es sehe, ist es eine Tabelle mit Werteinschätzungen der einzelnen Spielfelder. Was ich noch nicht verstehe, du rechnest da was negatives in die Felder rein. Die scheinen bei dir also nicht nur 0,1 oder 2 sein zu können. Verwendest du sie als eine Art "Zwischenspeicher"?.

Was ich auch noch nicht so blicke: Fliessen in diese Entscheidung auch die zu gewinnenden Steine mit ein, oder wird nur der neue Setzpunkt alleine für sich betrachtet?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Feb 10, 2010 2:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar, es wird praktisch auch hier kein Unterschied zwischen den Spieler oder KI gemacht. Einzig den Fehler hab ich gemacht, dass zwei Variablen in der Funktion computer statisch waren. Setzt man diese auf einen variablen Parameterwert, so wird das ganze auch KI vs. KI spielbar.

Das KI-Prinzip beruht einfach nur darauf, dass bestimmte Felder eher gemieden bzw. gevorzugt werden. Jedes Feld hat also eine art Punkte, die zusätzlich mit den einzunehmenden Spielsteinen addiert werden. Je nachdem welches Feld geprüft wird kommt also die Summe einzunehmender Gegenspielersteite + Die Punktzahl des aktuellen Spielfeld (siehe Vor/Nachteile-Tabelle). Die KI spielt somit ~relativ~gut~, ohne Spielkombinationen speichern und verwerten zu müssen. Lediglich die augenblickliche Situation wird berechnet. Der große Nachteil bei so einer KI ist einfach, dass das Spielprinzip nach mehreren Spielen durchschaut wird. Letztendlich gewinnt der, der als zweites dran kommt. Denn der Spielstarter muß somit als erstes aus dem zu vermiedenen Spielbereich ein Stein setzen, wodurch der andere dann schon mal vorsorglich den Rand anspielen kann. Diese sind nämlich schwerer einzunehmen. Besonders bevorzugt werden die Ecken...

KI vs. KI 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 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(2)
      
      ;Level Zeichnen
      zeichnen()
      
      ;Für Benutzermodus
      finden(1):ic=1
   End If
   
   
   
   
   ;HIER SPIELT DIE KI DEN SPIELER
   
   If ic=1 Then
      
      ;Computer spielen
      computer(1)
      
      ;Level Zeichnen
      zeichnen()
      
      ;Für Benutzermodus
      finden(2):ic=2
   End If
   
   
   
   
   ;HIER SPIELT DER SPIELER DEN SPIELER
   
;   ;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(wer)
   cx=0
   cy=0
   ct=0
   
   ;Vermenschlichung
   Delay 100
   
   ;Möglichkeit finden
   finden(wer)
   
   ;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)*1.5
            
            ;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,wer)
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 9,2,7,7,7,7,7,7,2,9
Data 2,0,2,2,2,2,2,2,0,2
Data 7,2,4,4,4,4,4,4,2,7
Data 7,2,4,4,4,4,4,4,2,7
Data 7,2,4,4,0,0,4,4,2,7
Data 7,2,4,4,0,0,4,4,2,7
Data 7,2,4,4,4,4,4,4,2,7
Data 7,2,4,4,4,4,4,4,2,7
Data 2,0,2,2,2,2,2,2,0,2
Data 9,2,7,7,7,7,7,7,2,9
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

neolein

BeitragMi, Feb 10, 2010 11:37
Antworten mit Zitat
Benutzer-Profile anzeigen
@hectic - die KI von Othello ist doch etwas anders, aber mit dem anderen Wissen könntest du dein Spiel vielleicht fortsetzen.

1. Das Feld muß 8x8 groß sein

2. Schwarz fängt immer an, daher hat weiß, bei einem normalen Spiel, wo jeder abwechelnd setzt den Vorteil des letzten Zuges.

3. Die Ränder und sogar die Ecken sind nicht in jedem Fall von Vorteil, sie können sogar bei bestimmten Konstellationen von Nachteil ) sein (Stichwort Stoner Trap oder Swindle) ebenso ist die Maximumstrategie zu vermeiden, d.h. möglichst viele Steine des Gegners umzusetzen.

Die einzig sinnvolle Strategie für den Anfang ist, die Anzahl der Züge des Gegners einzuschränken und die eigene zu erhöhen, deswegen MUß in die KI eine Vorausberechnung in den nächst höheren Ebenen stattfinden.

Ich gebe nur die Stichworte Mobilität, Tempo, Quit Moves, Waiting Moves und Parität, gerade und ungerade Lücken.

Das mit den C- und X- Feldern (z.B. a2, b1, b2) ist sicherlich richtig, es gibt aber auch hier Ausnahmen.

Ich wollte eigentlich noch nicht in die Tiefen der KI gehen, sondern nur vermeiden, daß wir womöglich von unserem Kurs abkommen, wenn wir etwas Neues in unseren Code implementieren.

Da ich schon X Programme kenne, seit 10 Jahren spiele (bei den dt. Meisterschaften 2006 immerhin auf Platz 8 Very Happy ) wollte ich von Grund auf ein leistungsfähiges Reversi programmieren.

Zur Maximumstrategie hier ein berühmtes Beispiel, wer gewinnt?

user posted image


Die Function FindeAlleLeeren() habe ich angefangen, aber ich glaube ich muß passen, hier ist mein erster "Entwurf":

Code: [AUSKLAPPEN]

Function SpielerSetzt()

   ZugFestlegen Methode(Spieler)
   
   MausX=ZufallX
   MausY=ZufallY
   
   If EsIstHierErlaubt(MausX,MausY,Spieler)
   
      Feld(Ebene,MausX,MausY)=Spieler
      DebugLog "Spieler " + Spieler + " setzt auf " + MausX + "/" + MausY
      AllesDrehen(MausX,MausY,Spieler)
      Spieler=3-Spieler
      DebugLog "bald ist Spieler " + Spieler + " dran"
      
      ; dieser Teil stellt später fest, ob der gegner im anschluss überhaupt ziehen kann
      FindeAlleLeeren
      If AnzahlLeere=0
         DebugLog "(SpielerSetzt) Gegner " + Spieler + " kann nicht"
         Spieler=3-Spieler
         FindeAlleLeeren
         If AnzahlLeere=0
            DebugLog "(SpielerSetzt) Auch Gegner " + Spieler + " kann nicht"
            SpielEnde=1
         EndIf
         WaitKey                        
      EndIf
      
   EndIf
   
End Function



Function FindeAlleLeeren()

   For Such.LeerTyp = Each LeerTyp
      Delete Such
   Next
   
   For X=1 To 8
      For Y=1 To 8
   
      If EsIstHierErlaubt(X%,Y%,Spieler)
      
         Neu.LeerTyp= New  LeerTyp

         Neu\X= X
         Neu\Y= Y
         
      AnzahlLeere% = AnzahlLeere + 1
      
       EndIf
      Next
   Next
   
   ;For Such.LeerTyp = Each LeerTyp
   
       ;   RotX=Such\X
       ;   RotY=Such\Y
    ;....entscheiden, ob dies der nächste Zug wird.
   ;Next

End Function

  • Zuletzt bearbeitet von neolein am Mi, Feb 10, 2010 20:54, insgesamt 8-mal bearbeitet

Midimaster

BeitragMi, Feb 10, 2010 12:02
Antworten mit Zitat
Benutzer-Profile anzeigen
die Typ-Definition ist richtig, steht aber immer ganz oben im Programm

Beim finden aller leeren Felder scannst du das ganze spielfeld durch

BlitzBasic: [AUSKLAPPEN]
For X=1 To 8
ForY=1 To 8
If IstEsHierErlaubt(X%,Y%,Spieler)
....

erst, wenn diese Bedingung erfüllt ist, legst du einen neuen Eintrag in der Liste an:
BlitzBasic: [AUSKLAPPEN]
      Neu.LeerTyp= New LeerTyp
...

Das Anlegen hast du richtig gemacht, aber eben nicht 60 auf einmal! Dadurch zeigt auch AnzahlLeere% später genau die gefundene Anzahl an.

Da du die FindeAlleLeeren() ja mehrfach aufrufen wirst, ist es noch wichtig zu Beginn der Function die alte Liste vom vorherigen Mal zu leeren:

BlitzBasic: [AUSKLAPPEN]
For Such.Leere = Each Leere
Delete Such
Next


Die letzten 3 Zeilen sind Unsinn. Wozu hattest du sie gedacht?


Erst später, dort wo jetzt der einfache Zufall ( =Rand(1,8)...) steht, greifst du ein Element aus der Liste heraus, oder arbeitest sie alle systematisch durch.

BlitzBasic: [AUSKLAPPEN]
For Such.Leere = Each Leere
TestX=Such\X
TestY=Such\Y
....entscheiden, ob dies der nächste Zug wird.
Next



Hectic-KI
Bitte mach das nicht gleich nieder!
Der Vorteil von Hectic's KI ist ihre Einfachheit. Und sie ist auf jeden Fall besser als unser aktueller Zufalls-Algo. In einem zukünftigen Spiel würde ich sie auf jeden Fall als eine der Levelstufen aufnehmen wollen. Auch in einem System mit vielen Ebenen werden wir über seinen Ansatz einer Feldbewertung glücklich sein. Vielleicht wird es ja bei dir darauf hinauslaufen, für jede Situation eine neue Feldbewertung aufzustellen. Dass ändert aber nichts daran, dass wir diese Situation wahrscheinlich wieder mit Hectics Code-Algo beschreiben werden.
 

neolein

BeitragMi, Feb 10, 2010 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, lass uns Hectics KI mit einbauen... aber langsam OK? es ist schon jetzt schwer am Ball zu bleiben, wenn da nicht die Familie wär.... Rolling Eyes

also ich habe im letzten Beitrag den Code für SpielerSetzt() und FindeAlleLeeren() aktualisiert, das Spiel läuft zwar, aber meine Vermutung ist ziemlich vage, daß der Code so richtig ist.

Den

Type LeerTyp
Field X%
Field Y%
End Type

habe ich ganz an den Anfang des Codes gesetzt.

Ich habe außerdem im allerersten Beitrag den Gesamtcode so geändert, daß jetzt alle Reihen und Spalten beschriftet sind, das mit den Spalten (A-H) würde ich allerdings gerne eleganter hinbekommen (auch in einer Schleife, wie die Reihen 1-8).

Im Gesamtcode sind noch nicht die neuen Funktionen SpielerSetzt() und FindeAlleLeeren() implementiert.

Frage, können wir IstEsHierErlaubt() in EsIstHierErlaubt() umbenennen, denn sonst klingt es wie eine Frage.
Wenn IstEsHiererlaubt() zutrifft dann wäre mir EsIstHierErlaubt() lieber.

Midimaster

BeitragMi, Feb 10, 2010 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Vernünftige Idee!

Da du ja selbst ja schon bei den Codes von mir etwas ruderst, aber ja unbedingt deine eigene KI schreiben willst, wäre der Einbau sicherlich eine gute Vorbereitung und Übung.

Beschriftung

Eine elegantere Beschriftung machts Du mit der Funktion Chr$(i) und i läuft von 65 bis72


Umbenennen

Du kannst natürlich jede Funktion umbenennen, aber ist das Wesen dieser Funktion nicht wirklich eine "Anfrage"?

BlitzBasic: [AUSKLAPPEN]
If IstEsHierErlaubt() Then...


Wir nennen es einfach um! Es heißt jetzt: EsIstHierErlaubt()


Deine FindeLeere()
Ist fast perfekt. Allerdings hat der Zufall in ihr nichts mehr zu suchen. Der Sinn eines neuen Listeneintrags Leer.LeerTyp ist es ja, sich die Koordinaten X% und Y% zu merken, bei denen EsIstHierErlaubt() zutraf. Da spielt Zufall noch keine Rolle. Wir sammeln ganz ordentlich alle zutreffenden Koordinatenpaare. Also muss es heißen:
BlitzBasic: [AUSKLAPPEN]
         Neu\X= X
Neu\Y= Y



Der Teil
BlitzBasic: [AUSKLAPPEN]
   For Such.LeerTyp = Each LeerTyp

RotX=Such\X
RotY=Such\Y
;....entscheiden, ob dies der nächste Zug wird.
Next

ist grundsätzlich ebenfalls schon richtig, doch darf er nicht schon in der FindeAlleLeeren() abgearbeitet werden, weil dies den Arbeitsauftrag der Funktion überschreitet. Die Entscheidung fällt erst später in einer KI.
  • Zuletzt bearbeitet von Midimaster am Fr, Feb 12, 2010 15:39, insgesamt einmal bearbeitet
 

neolein

BeitragFr, Feb 12, 2010 11:20
Antworten mit Zitat
Benutzer-Profile anzeigen
So, die Formel zur Spaltenbeschriftung ist

Code: [AUSKLAPPEN]

                  For i = 65 To 72
                      Text Xpos,25,Chr$(i)
                      Xpos = Xpos + 50
                  Next


Zu mehr bin ich nocht leider nicht gekommen Confused

Cyrano ist ein gutes & bekanntes Reversi Trainings Tool; "Debutant" ist leicht, auf "Amateur" kann man es noch gut schlagen, bei "Fort" braucht man schon viel Konzentration.

In jedem Fall ist es ein gutes Beispiel zur Veranschaulichung der Strategie

Gehe zu Seite Zurück  1, 2, 3, 4

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group