BCC#25 (Künstliche Intelligenz)

Übersicht Sonstiges Projekte

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

Neue Antwort erstellen

ComNik

BeitragSo, Apr 12, 2009 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
@TimBo: könnte der Ansatz sinnvooll sein?

Ich wollte in meiner Ki kein Algorithmen wie Minimax oder so benutzen...
Und ich hatte auch keine Lust mir den näher anzugucken Wink

MFG
ComNik
WIP: Vorx.Engine

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSo, Apr 12, 2009 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Es könnte daran liegen das bei mir auch RAND eine kleine Rolle spielt,
also nicht immer optimal gespielt wird da es sonst langweillig wird!

die Analyse beruht zur Zeit nur auf 4-gewinnt, was nicht optimal ist!

Die Speed der KI ist noch ausbaufähig!
[BB2D | BB3D | BB+]

TimBo

BeitragMo, Apr 13, 2009 0:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Sollte nichts mehr kommen von meiner Seite aus , dann ist dies meine Wettbewerbs KI .
https://www.blitzforum.de/upload/file.php?id=5281
Sourcecode enthalten , bitte den Ordner Media selber noch hineinkopieren, man muss das Portal nicht unnötig vollstopfen.

Was kann diese KI ?
Arrow Stellungsanalye mit 4 Schweren Faktoren
Arrow 4 Schwierigkeitsstufen
Arrow hat sich gut gegen andere KI's geschlagen

-------------------------------------------------------------------------------


Hi,

bei dem es wird langweilig kann ich nur soviel sagen , wer immer den gleichen Mist baut, wird immer verlieren. Wink
ok das ist jetzt arrogant .. Surprised
ich werde vll. noch schnell eine Schwierigkeitsstufe mit Rand machen , wie ich das einbaue weiß ich noch nicht so genau.

Den Speed wird man immer weiter ausbauen können Very Happy

Eine Frage , wie machst du die Verweise auf die Hilfe?

Da ich übermorgen bis zum 18. weg bin , werde ich meine KI gleich Posten.

Meine KI hat 4 Faktoren , die bei der Stellungsanalyse eine Rolle spielen, das war mehr arbeit sich diese auszudenken als sie zu code. Rolling Eyes

Viele Grüße
TimBo

@ Comnik , der ansatz ist nicht schlecht aber der Optimale für ein solches Problem ist der , den Rallimen und ich wohl geählt haben. eine Rekursive (??) Funktion , das sind Funktionen , die sich selber aufrufen. Das ist immer von nutzen wenn man kombinationssachen lösen will.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Apr 13, 2009 1:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Eine Frage , wie machst du die Verweise auf die Hilfe?

einfach das Basic Schlüsselwort in Doppelt eckigen Klamern setzten!
[ [Beispiel] ] hier noch die Leerzeichen weglassen und fertig
[BB2D | BB3D | BB+]

BlitzMoritz

BeitragMi, Apr 15, 2009 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Lieber FirstDeathmaker, herzlichen Dank für die BM-Version des Netzwerk-Codes! Smile
Ich weiß nicht ob's jemandem aufgefallen ist, aber ein kleiner Fehler steckt in beiden Versionen, in denen die Remis noch nicht richtig gezählt werden. Bitte korrigiert folgende Function, in der nicht etwa die 0, sondern die 3 die Kennzahl für "Remis" ist:
Code: [AUSKLAPPEN]
'Update die Statistik
'sieg: 3 = remis, 1=gewonnen, 2=verloren
Function STAT_Update(sieg%)
   If sieg = 3
      STAT_Remis = STAT_Remis+1
   ElseIf sieg = 1
      STAT_Gewonnen = STAT_Gewonnen + 1
   ElseIf sieg = 2
      STAT_Verloren = STAT_Verloren + 1
   EndIf
   STAT_Gespielt = STAT_Gespielt + 1
End Function

Außerdem sollten bitte alle daran denken, irgendwo SeedRnd = Millisecs() o.ä. zu benutzen. Ich hab's bisher bei einigen Beiträgen ergänzen müssen.
Nebenbei: Bisher sind alle Beiträge in BB geschrieben. Wo bleibt hier eigentlich die "BlitzMax-Fraktion"?

Der Contest geht jetzt in die heiße Phase - noch 3 Tage Zeit.
Erfreut stelle ich fest, dass bereits fünf Wettbewerbsteilnehmer dabei sind (anscheinend ist die Themenstellung doch nicht ganz schlecht gewesen): Smile
AnniXa, FirstDeathmaker, TimBo, ComNik und Rallinen. Und es wäre toll, wenn noch mehr dazukämen, aber ich nehme an, dass das tolle Frühlingswetter berechtigter Weise viele davon abhält, sich in einer dunklen Stube mit vertrackten Algorithmen abzuquälen.
ComNik bitte ich noch, nicht zu vergessen, seinen endgültigen Beitrag zu posten. Gleiches gilt für Rallinen.
TimBos KI dauert im Netzwerkspiel (mit der höchsten Spieltiefe) wirklich seeehr lange, ich mein' ja nur - vielleicht haben später einige Tester einfach zu wenig Geduld, die Ergebnisse abzuwarten...
Da die Aufgabe auch mich ungemein gereizt hat (sonst hätte ich sie ja nicht gestellt), habe ich nun selbst ebenfalls eine KI entwickelt. Sie ist ziemlich anders aufgebaut als die meisten bisherigen Ansätze. Das sieht man schon an der (relativ geringen) Berechnungszeit, die sie benötigt. Der Code ist aber leider ziemlich ungenießbar, denn auf der Suche nach geeigneten Strategien habe ich mich immer tiefer in Verzweigungen begeben und musste schließlich irgendwann bewundernd vor dem menschlichen Geist kapitulieren, dessen vielfältige logische Überlegungen tatsächlich ungemein schwer nachzuahmen sind. Meine KI ist im Downloadpaket des Abstimmungs-Threads zu finden.

Beim Testen muss ich Rallinens Bemerkung bestätigen:
Zitat:
Es könnte daran liegen das bei mir auch RAND eine kleine Rolle spielt, also nicht immer optimal gespielt wird, da es sonst langweillig wird!

Bei einigen Gegenüberstellungen muss man tatsächlich feststellen, dass auch nach 100 Testläufen immer nur das gleiche Spiel gespielt wird. Oder nur zwei, je nachdem, wer anfängt. In gewissem Sinne ist das ja auch verständlich: Jeder will unbedingt gewinnen und möchte nur die (nach seinem Algorithmus) einzig beste Spalte verwenden. Ich stelle mir etwas problematisch vor, wie man in diesem Zusammenhang bewerten soll, wenn ein Algo aus Abwechslungsgründen zwischenzeitlich eine weniger gute Spalte ausspuckt, wie Rallinen andeutet. Auch mein eigener Algo war anfangs nur optimal eingestellt und hat mit mehreren anderen KI's immer nur die gleichen ein oder zwei Partien gespielt. Daher habe ich jetzt auch weniger gute Spaltenentscheidungen zugelassen, denn letzten Endes soll ja später ein Mensch mit der KI spielen und Freude an der Abwechslung haben. Außerdem sehe ich ansonsten noch ein anderes Manko: Wenn der Mensch (oder auch eine KI) eine ewig gleichförmig entscheidende KI, so gut sie auch sein möge, zu "knacken" verstünde, würde die KI nie mehr gewinnen und der Mensch nie mehr eine andere Partie spielen (müssen). Darum wird sich eine Entscheidungs-Varianz letzten Endes doch wieder gut auswirken, auch wenn rein statistisch die Anzahl der Niederlagen im Netzwerkspiel steigen wird.
Hinsichtlich der Abwechslung hätte ich da noch eine gute Idee:
Wenn Ihr nichts dagegen habt, würde ich gerne nach Beendigung des Contests alle Beiträge in einem Programm zusammenfassen, bei dem man sich den Gegner aus sämtlichen Beiträgen auswählen kann, denn wie TimBo sehr richtig anmerkt, sind die Vorgehensweisen sehr verschieden, was dann die Abwechslung beim Spielen garantieren würde:
Zitat:
Deine KI hat ein komplett anderes Grundschema als meine , aber genau das finde ich an dem Wettbewerb voll cool , das man sehen kann , wie andere KI's arbeiten.
  • Zuletzt bearbeitet von BlitzMoritz am Do, Apr 23, 2009 21:29, insgesamt einmal bearbeitet

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMi, Apr 15, 2009 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe das Netztwerk-Programm mal getestet, und mir ist da ein Fehler aufgefallen wenn es einer ist!!

Dazu habe ich mein neuen Code (Spielstärke angepasst) gegen den von TimBo Soldier 50 mal laufen lassen.
Und das kam dabei heraus

Rallimen : TimBo Soldier 23:27
TimBo Soldier : Rallimen 23:27

das bedeutet an Host 0 verliere ich immer gegen ihn!

Die neue Version kommt auf jeden Fall, da die gepostete noch einen erheblichen Bug hat!
[BB2D | BB3D | BB+]

ComNik

BeitragMi, Apr 15, 2009 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Tadaaa Ich präsentiere den ersten von unten:

Exclamation[b]DIES IST MEIN WETTBEWERBSBEITRAG[\b]Exclamation

Code: [AUSKLAPPEN]
AppTitle("Vier-gewinnt-Gegner: ComNik")

Global gegner% ; DER GEGNER... ...wer hätte das gedacht...

Dim gefahr%(6) ; LISTE DER SPALTEN IN DIE !KEIN! STEIN GEWORFEN WERDEN DARF!!! ...unter keinen umständen...
;--------------------------------------
Function BesteSpalte%()
;--------------------------------------
   ;Zur Erinnerung:    0 = leer, 1 = rot, 2 = gelb
   ;Mit diesen Werten wird das Spielbrett in dem globalen Array "Feld%(6,5)" gespeichert.
   ;Die unterste Reihe ist die Reihe 0, die oberste Reihe ist die Reihe 5.
   ;Ebenso laufen die Spalten von 0 bis 6 von Links nach Rechts

 For versuch = 0 To 6000
   SeedRnd MilliSecs()   

   If farbe% = 1 Then gegner% = 2       ;gegner und farbe bestimmen...
   If farbe% = 2 Then gegner% = 1       ;  "     "    "    "       """
 
   For nogo = 0 To 6                   ;ZIEMLICH WICHTIG!!! HAB ICH AUCH ERST SPÄT GEMERKT!!!
     gefahr%(nogo) = 0                 ;NOGOS IMMER AUF NULL SETZEN!!!
   Next                                ;puhh...

   ziel = ki_sieg()
 
    If ziel <= 6 And ziel >= 0 Then
      If Feld%(ziel,5) = 0 Then
       Return ziel
     End If
    End If
  Next
;--------------------------------------
End Function
;--------------------------------------


;//PRÜFEN OB ICH/KI IN DIESEM ZUG GEWINNEN KANN\\
Function ki_sieg() ;prüfen ob drei in |, /, \, -> oder <- liegen...
     For x = 0 To 6  ;spalten
       For y = 0 To 5       ;reihen

         If Feld%(x,y) = farbe% Then ;wenn auf dem Feld mein stein liegt...

           ;//HOCH\\
           If y + 3 <= 5 Then          ;wenn 3 in einer reihe liegen können^^
           If Feld%(x,y+1) = farbe% And Feld%(x,y+2) = farbe% And Feld%(x,y+3) = 0 Then
              If gefahr%(x) = 0 Then Return x
             End If
           End If
           
           ;//RECHTS\\ und //LINKS\\
           If x + 3 <= 6 Then          ; 3 können in einer Reihe liegen...
             If Feld%(x+1,y) = farbe% And Feld%(x+2,y) = farbe% And Feld%(x+3,y) = 0 Then
               If y = 0 Then
                 Return x + 3

                 ElseIf Feld%(x+3,y-1) <> 0 Then
                      Return x + 3
                 Else
                      gefahr%(x+3) = 1               
               End If
             End If
            End If   

           If x - 1 >= 0 Then
           If x - 1 + 3 <= 6 Then
            If Feld%(x-1,y) = 0 And Feld%(x+1,y) = farbe% And Feld%(x+2,y) = farbe% Then
                 If y = 0 Then
                   Return x - 1

                  ElseIf y > 0 Then
                   If Feld%(x-1,y-1) <> 0 Then
                     Return x - 1
                   End If
                  Else
                    gefahr%(x-1) = 1
                 End If
             End If
            End If     
            End If


           ;//RECHTS und LINKS mit LÜCKEN\\
           ;1011
           If x + 3 <= 6 Then
           If Feld%(x+1,y) = 0 And Feld%(x+2,y) = farbe% And Feld%(x+3,y) = farbe% Then
             If y = 0 Then
               Return x + 1
             
             ElseIf Feld%(x+1,y-1) <> 0 Then
                Return x + 1
             Else
                gefahr%(x+1) = 1
             End If
           End If

           ;1101
           If Feld%(x+1,y) = farbe% And Feld%(x+2,y) = 0 And Feld%(x+3,y) = farbe% Then
             If y = 0 Then
              Return x + 2
 
             ElseIf Feld%(x+2,y-1) <> 0 Then
              Return x + 2
             Else
              gefahr%(x+2) = 1
             End If
           End If
           End If

          ;//SCHRÄG: OBEN RECHTS\\
          If x + 3 <= 6 And y + 3 <= 5 Then
            If Feld%(x+1,y+1) = farbe% And Feld%(x+2,y+2) = farbe% And Feld%(x+3,y+3) = 0 Then
              If Feld%(x+3,y+2) <> 0 Then
                Return x + 3
               
              Else
               gefahr%(x+3) = 1
              End If
            End If
          End If

         ;//SCHRÄG: OBEN LINKS\\
          If y < 3 And x > 2 Then
            If Feld%(x-1,y+1) = farbe% And Feld%(x-2,y+2) = farbe% And Feld%(x-3,y+3) = 0 Then
              If Feld%(x-3,y+2) <> 0 Then
                Return x - 3

               Else
                gefahr%(x-3) = 1
              End If
            End If
          End If

          ;//SCHRÄG: UNTEN RECHTS\\
         If x + 3 <= 6 And y - 3 >= 0 Then
           If Feld%(x+1,y-1) = farbe% And Feld%(x+2,y-2) = farbe% And Feld%(x+3,y-3) = 0 Then
             If y - 3 = 0 Then
               Return x + 3
           
             ElseIf y - 4 >= 0 Then
              If Feld%(x+3,y-4) <> 0 Then
               Return x + 3
              End If
             Else
               gefahr%(x+3) = 1
             End If
           End If
          End If         

         ;//SCHRÄG: UNTEN LINKS\\
         If x - 3 >= 0 And y - 3 >= 0 Then
           If Feld%(x-1,y-1) = farbe% And Feld%(x-2,y-2) = fareb% And Feld%(x-3,y-3) = 0 Then
             If y - 3 = 0 Then
               Return x - 3
           
             ElseIf y - 4 >= 0 Then
              If Feld%(x-3,y-4) <> 0 Then
               Return x - 3
              End If
             Else
               gefahr%(x-3) = 1
             End If
           End If
          End If         

         ;//SCHRÄG: OBEN LINKS(mit LÜCKEN)\\
         ;1011
          If y < 3 And x > 2 Then
           If Feld%(x-1,y+1) = 0 And Feld%(x-2,y+2) = farbe% And Feld%(x-3,y+3) = farbe% Then
            If Feld%(x-1,y) <> 0 Then
             Return x-1
           
            Else
             gefahr%(x-1) = 1
            End If
           End If
          End If

         ;1101
         If y < 3 And x > 2 Then
          If Feld%(x-1,y+1) = farbe% And Feld%(x-2,y+2) = 0 And Feld%(x-3,y+3) = farbe% Then
           If Feld%(x-2,y+1) <> 0 Then
            Return x-2
           
           Else
            gefahr%(x-2) = 1
           End If
          End If
         End If

         ;//SCHRÄG: OBEN RECHTS(mit LÜCKEN)\\
         ;1101
         If x + 3 <= 6 And y + 3 <= 5 Then
          If Feld%(x+1,y+1) = farbe% And Feld%(x+2,y+2) = 0 And Feld%(x+3,y+3) = farbe% Then
           If Feld%(x+2,y+1) <> 0 Then
             Return x + 2
           
           Else
             gefahr%(x+2) = 1
           End If
          End If
         End If   
     
        ;1011
        If x + 3 <= 6 And y + 3 <= 5 Then
         If Feld%(x+1,y+1) = 0 And Feld%(x+2,y+2) = farbe% And Feld%(x+3,y+3) = farbe% Then
          If Feld%(x+1,y) <> 0 Then
             Return x + 1
           
          Else
             gefahr%(x+1) = 1
          End If
         End If
        End If

        End If
       Next
      Next
    spalte = gegner_sieg()
    Return spalte
End Function   


;//SCHADE, MAL SEHEN OB DER GEGNER IN DIESEM ZUG GEWINNEN KANN\\
Function gegner_sieg() ;prüfen ob 3 in |, /, \, -> oder <- liegen...
     For x = 0 To 6  ;spalten
       For y = 0 To 5       ;reihen

         If Feld%(x,y) = gegner% Then ;wenn auf dem Feld mein stein liegt...

           ;//HOCH\\
           If y + 3 <= 5 Then          ;wenn 4 in einer reihe liegen können^^
            If Feld%(x,y+1) = gegner% And Feld%(x,y+2) = gegner% And Feld%(x,y+3) = 0 Then Return x
           End If
           
           ;//RECHTS\\ und //LINKS\\
           If x + 3 <= 6 Then          ; 4 können in einer Reihe liegen...
             If Feld%(x+1,y) = gegner% And Feld%(x+2,y) = gegner% And Feld%(x+3,y) = 0 Then
               If y = 0 Then
                 Return x + 3

                ElseIf Feld%(x+3,y-1) <> 0 Then
                      Return x + 3
                Else
                 gefahr%(x+3) = 1
               End If
             End If
            End If                 
           
           If x - 1 >= 0 Then
           If x - 1 + 3 <= 6 Then
            If Feld%(x-1,y) = 0 And Feld%(x+1,y) = gegner% And Feld%(x+2,y) = gegner% Then
                 If y = 0 Then
                   Return x - 1

                  ElseIf y > 0 Then
                   If Feld%(x-1,y-1) <> 0 Then
                     Return x - 1
                  Else
                    gefahr%(x-1) = 1
                   End If
                 End If
              End If
            End If     
            End If
                             
          ;//SCHRÄG: OBEN RECHTS\\
          If x + 3 <= 6 And y + 3 <= 5 Then
            If Feld%(x+1,y+1) = gegner% And Feld%(x+2,y+2) = gegner% And Feld%(x+3,y+3) = 0 Then
              If Feld%(x+3,y+2) <> 0 Then
                Return x + 3

               Else
                gefahr%(x+3) = 1
               End If
            End If
          End If

          ;//SCHRÄG: OBEN LINKS\\
          If y < 3 And x > 2 Then
            If Feld%(x-1,y+1) = gegner% And Feld%(x-2,y+2) = gegner% And Feld%(x-3,y+3) = 0 Then
              If Feld%(x-3,y+2) <> 0 Then
                Return x - 3

               Else
                gefahr%(x-3) = 1
               End If
            End If
          End If     
     
         ;//SCHRÄG: UNTEN RECHTS\\
         If x + 3 <= 6 And y - 3 >= 0 Then
           If Feld%(x+1,y-1) = gegner% And Feld%(x+2,y-2) = gegner% And Feld%(x+3,y-3) = 0 Then
             If y - 3 = 0 Then
               Return x + 3
           
             ElseIf y - 4 >= 0 Then
              If Feld%(x+3,y-4) <> 0 Then
               Return x + 3
              End If
             Else
               gefahr%(x+3) = 1
             End If
           End If
          End If         

         ;//SCHRÄG: UNTEN LINKS\\
         If x - 3 >= 0 And y - 3 >= 0 Then
           If Feld%(x-1,y-1) = gegner% And Feld%(x-2,y-2) = gegner% And Feld%(x-3,y-3) = 0 Then
             If y - 3 = 0 Then
               Return x - 3
           
             ElseIf y - 4 >= 0 Then
              If Feld%(x-3,y-4) <> 0 Then
               Return x - 3
              End If
             Else
               gefahr%(x-3) = 1
             End If
           End If
          End If         

         ;//RECHTS und LINKS mit LÜCKEN\\
         ;1011
         If x + 3 <= 6 Then
         If Feld%(x+1,y) = 0 And Feld%(x+2,y) = gegner% And Feld%(x+3,y) = gegner% Then
           If y = 0 Then
            Return x + 1

           ElseIf Feld%(x+1,y-1) <> 0 Then
            Return x + 1
           Else
            gefahr%(x+1) = 1
           End If
         End If

         ;1101
         If Feld%(x+1,y) = gegner% And Feld%(x+2,y) = 0 And Feld%(x+3,y) = gegner% Then
           If y = 0 Then
            Return x + 2
 
           ElseIf Feld%(x+2,y-1) <> 0 Then
            Return x + 2
           Else
            gefahr%(x + 2) = 1
           End If
         End If
         End If

         ;//SCHRÄG: OBEN LINKS(mit LÜCKEN)\\
         ;1011
          If y < 3 And x > 2 Then
           If Feld%(x-1,y+1) = 0 And Feld%(x-2,y+2) = gegner% And Feld%(x-3,y+3) = gegner% Then
            If Feld%(x-1,y) <> 0 Then
             Return x-1
           
            Else
             gefahr%(x-1) = 1
            End If
           End If
          End If

         ;1101
         If y < 3 And x > 2 Then
          If Feld%(x-1,y+1) = gegner% And Feld%(x-2,y+2) = 0 And Feld%(x-3,y+3) = gegner% Then
           If Feld%(x-2,y+1) <> 0 Then
            Return x-2
           
           Else
            gefahr%(x-2) = 1
           End If
          End If
         End If

         ;//SCHRÄG: OBEN RECHTS(mit LÜCKEN)\\
         ;1101
         If x + 4 <= 6 And y + 3 <= 5 Then
          If Feld%(x+1,y+1) = gegner% And Feld%(x+2,y+2) = 0 And Feld%(x+3,y+3) = gegner% Then
           If Feld%(x+2,y+1) <> 0 Then
             Return x + 2
           
           Else
             gefahr%(x+2) = 1
           End If
          End If
         End If   
       
         ;1011
        If x + 3 <= 6 And y + 3 <= 5 Then
         If Feld%(x+1,y+1) = 0 And Feld%(x+2,y+2) = gegner% And Feld%(x+3,y+3) = gegner% Then
          If Feld%(x+1,y) <> 0 Then
             Return x + 1
           
          Else
             gefahr%(x+1) = 1
          End If
         End If
        End If

        End If
       Next
      Next
  spalte = zwei_bedrohung()
   Return spalte
End Function   


;//UND WIE SIEHTS MIT DEM STÖREN DES AUFBAUS DES GEGNERS AUS(satzbau??!!)??\\
Function zwei_bedrohung()
  For x = 0 To 6  ;spalten
    For y = 0 To 5       ;reihen

      If Feld%(x,y) = gegner% Then ;wenn auf dem Feld mein stein liegt...
           
           ;//RECHTS\\ und //LINKS\\
           If x + 2 <= 6 Then          ; 3 können in einer Reihe liegen...
            If x - 1 >= 0 Then
             If Feld%(x-1,y) = 0 Then
             If Feld%(x+1,y) = gegner% And Feld%(x+2,y) = 0 Then
               If y = 0 Then
                 If gefahr%(x+2) = 0 Then Return x + 2
                ElseIf Feld%(x+2,y-1) <> 0 Then
                      Return x + 2               
               
                ElseIf Feld%(x-1,y) = 0 Then
                   If y > 0 Then
                   If Feld%(x-1,y-1) <> 0 Then
                    If gefahr%(x-1) = 0 Then Return x - 1
                   End If
                   End If
                 End If       
                End If
               End If
             End If
            End If

          ; 1 1
          ;00000  (mir ist kein Name eingefallen...)
          If x + 3 <= 6 And x - 1 >= 0 Then
            If y = 0 Then
              If Feld%(x-1,y) = 0 And Feld%(x+1,y) = 0 And Feld%(x+2,y) = gegner% And Feld%(x+3,y) = 0 Then Return x + 1
       
            Else
              If Feld%(x-1,y) = 0 And Feld%(x+1,y) = 0 And Feld%(x+2,y) = gegner% And Feld%(x+3,y) = 0 Then
               If Feld%(x-1,y-1) <> 0 And Feld%(x+1,y-1) <> 0 And Feld%(x+3,y-1) <> 0 Then 
                 Return x + 1
               Else
                 gefahr%(x+1) = 1
               End If
              End If
            End If
           End If               
             
          ;//SCHRÄG: OBEN RECHTS\\
          If x + 3 <= 6 And y + 2 <= 5 Then
            If Feld%(x+1,y+1) = gegner% And Feld%(x+2,y+2) = 0 Then
              If Feld%(x+2,y+1) <> 0 Then
               If gefahr%(x+2) = 0 Then Return x + 2
              End If
            End If
          End If
         
         ;//SCHRÄG: OBEN LINKS\\
          If y < 2 And x > 1 Then
            If Feld%(x-1,y+1) = gegner% And Feld%(x-2,y+2) = 0 Then
              If Feld%(x-2,y+1) <> 0 Then
               If gefahr%(x-2) = 0 Then Return x - 2
              End If
            End If
          End If     
       
        End If
       Next
      Next
    spalte = bauen()
    Return spalte
End Function

;//DANN KANN ICH/KI JA AUFBAUEN\\
Function bauen()
   For x = 0 To 6  ;spalten
       For y = 0 To 5       ;reihen

         If Feld%(x,y) = farbe% Then ;wenn auf dem Feld mein stein liegt...

          ; 1 1
          ;00000  (mir ist kein Name eingefallen...)
          If x + 3 <= 6 And x - 1 >= 0 Then
            If y = 0 Then
              If Feld%(x-1,y) = 0 And Feld%(x+1,y) = 0 And Feld%(x+2,y) = farbe% And Feld%(x+3,y) = 0 Then Return x + 1
       
            Else
              If Feld%(x-1,y) = 0 And Feld%(x+1,y) = 0 And Feld%(x+2,y) = farbe% And Feld%(x+3,y) = 0 Then
               If Feld%(x-1,y-1) <> 0 And Feld%(x+1,y-1) <> 0 And Feld%(x+3,y-1) <> 0 Then 
                 Return x + 1
               Else
                 gefahr%(x+1) = 1
               End If
              End If
            End If
           End If               

           ;//HOCH\\
           If y + 3 <= 5 Then          ;wenn 3 in einer reihe liegen können^^
           If Feld%(x,y+1) = farbe% And Feld%(x,y+2) = 0 Then
              If gefahr%(x) = 0 Then Return x
             End If
           End If
           
           ;//RECHTS\\ und //LINKS\\
           If x + 3 <= 6 Then          ; 3 können in einer Reihe liegen...
             If Feld%(x+1,y) = farbe% And Feld%(x+2,y) = 0 Then
               If y = 0 Then
                  If gefahr%(x+2) = 0 Then Return x + 2
                 ElseIf Feld%(x+2,y-1) <> 0 Then
                    If gefahr%(x+2) = 0 Then Return x + 2
                 Else
                      gefahr%(x+2) = 1               
                End If
              End If
            End If
           
           If x - 1 >= 0 Then
           If x - 1 + 3 <= 6 Then
            If Feld%(x-1,y) = 0 And Feld%(x+1,y) = farbe% Then
                 If y = 0 Then
                   If gefahr%(x-1) = 0 Then Return x - 1
                  ElseIf y > 0 Then
                   If Feld%(x-1,y-1) <> 0 Then
                     If gefahr%(x-1) = 0 Then Return x - 1
                   End If
                 End If
             End If
            End If     
          End If

          ;//SCHRÄG: OBEN RECHTS\\
          If x + 4 <= 6 And y + 3 <= 5 Then
            If Feld%(x+1,y+1) = farbe% And Feld%(x+2,y+2) = 0 And Feld%(x+3,y+3) = 0 Then
              If Feld%(x+2,y+1) <> 0 Then
                If gefahr%(x+2) = 0 Then Return x + 2
              Else
                gefahr%(x+2) = 1
              End If
            End If
          End If

         ;//SCHRÄG: OBEN LINKS\\
          If y < 3 And x > 2 Then
            If Feld%(x-1,y+1) = farbe% And Feld%(x-2,y+2) = 0 Then
              If Feld%(x-2,y+1) <> 0 Then
                If gefahr%(x-2) = 0 Then Return x - 2

              Else
               gefahr%(x-2) = 1
              End If
            End If
          End If
     
        End If
       Next
      Next
    spalte = no_plan_von_ki()
    Return spalte
End Function

Function no_plan_von_ki() ;yeah und so! Check the Flow und so... (-.-)
 If Feld%(3,0) = 0 Then
  If gefahr%(3) = 0 Then Return 3
 End If
   For g = 0 To 255  ; Was für ein zufälliger Variablenname...
     spalte = Rnd(0,6)
    If Feld%(spalte,5) = 0 Then
     If gefahr%(spalte) = 0 Then
      Return spalte
     End If
    End If
   Next

;SCH**** Nichts gefunden...
 spalte = Rnd(0,6)
 Return spalte
End Function


gegen die blitz moritz ki hab ich 20 zu 0 verloren...

also nur um die teilnehmerzahl mal zu erhöhen.

mfg comnik

[EDIT] Die ki benutzt keinerlei bestehende Algos... Das hheißt Suchtiefe erhöhen und alle plattmachen is nich-.-[EDIT ENDE]
WIP: Vorx.Engine
  • Zuletzt bearbeitet von ComNik am Fr, Apr 17, 2009 23:39, insgesamt einmal bearbeitet

AnniXa

BeitragFr, Apr 17, 2009 10:29
Antworten mit Zitat
Benutzer-Profile anzeigen
So die schlechteste KI von allen wurde nochmal leicht "verbessert".
(um etwas zu verbessern müste es ja erstmal gut sein ;D)

https://www.blitzforum.de/upload/file.php?id=5325
|moonForge|
Ich bin Pokémon Meisterin seit 1998!

ComNik

BeitragFr, Apr 17, 2009 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
was erlaubst du dir an meinem code rumzumachen?! Wink
WIP: Vorx.Engine

AnniXa

BeitragSa, Apr 18, 2009 11:05
Antworten mit Zitat
Benutzer-Profile anzeigen
ComNik hat Folgendes geschrieben:
was erlaubst du dir an meinem code rumzumachen?! Wink



? das müste ich wohl eher dich fragen :O
|moonForge|
Ich bin Pokémon Meisterin seit 1998!

ComNik

BeitragSa, Apr 18, 2009 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
wieso?
WIP: Vorx.Engine

TimBo

BeitragSa, Apr 18, 2009 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhh also das ist ja echt sehr auffällig, mich würde mal interressieren, wie das Netzwerktool entscheidet, wer welche Farbe hat.

Ich denke unsere KI's sind genau gleich stark....
ok mein Traum mal endlich oben zu sein wäre daran geowned XDD

awas Spaß

Viele Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

ComNik

BeitragSa, Apr 18, 2009 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
@timbo: meinst du unsere sind gleich stark?! Surprised
WIP: Vorx.Engine

TimBo

BeitragSa, Apr 18, 2009 15:59
Antworten mit Zitat
Benutzer-Profile anzeigen
oh sry, komisch ausgedrückt, ich meinte Rallimen

Zitat:
Rallimen : TimBo Soldier 23:27
TimBo Soldier : Rallimen 23:27
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSa, Apr 18, 2009 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier meine aktuelle Beste Spalte!
Es ist noch einiges an Performance möglich, aber die Zeit ist bei mir um! Cool

Code: [AUSKLAPPEN]
;-Bitte ergänze im Folgenden "Nickname?" durch deinen eigenen, damit man später beim
;Gegeneinanderspielen mehrerer Gegner die Fenster anhand der Titelleisten unterscheiden kann:
AppTitle("Rallimen ")
;--------------------------------------
Dim SpFe%(6,5)
Dim Slot% (6)
Global Maxtiefe% = 6
Global Min%,Max%


Function BesteSpalte%()
   Dim Slot% (6)
   Local x%,y%,Tiefe%,Spalte%
   For x% = 0 To 6
      For y% = 0 To 5
         SpFe (x%,y%) = Feld (x%,y%)
         zz=zz+Feld (x%,y%)
      Next
   Next

   For Spalte = 0 To 6
      For Reihe% = 0 To 5
         If SpFe (Spalte%,Reihe%) = 0 Then
            SpFe (Spalte%,Reihe%) = Farbe%    
            If CheckGewinn%(Spalte%,Reihe%,farbe%) Then Return spalte
            SpFe (Spalte%,Reihe%) = 0
            Exit
         End If
      Next
   Next
   For Spalte = 0 To 6
      For Reihe% = 0 To 5
         If SpFe (Spalte%,Reihe%) = 0 Then
            SpFe (Spalte%,Reihe%) = Farbe% Xor 3   
            If CheckGewinn%(Spalte%,Reihe%,farbe% Xor 3) Then Return spalte
            SpFe (Spalte%,Reihe%) = 0
            Exit
         End If
      Next
   Next

   For Spalte = 0 To 6
      For Reihe% = 0 To 5
         If SpFe (Spalte%,Reihe%) = 0 Then
            SpFe (Spalte%,Reihe%) = Farbe%
            gewinne =CheckGewinn%(Spalte%,Reihe%,farbe%)
            If gewinne Then
               SpFe (Spalte%,Reihe%) = 0
               Slot(Spalte) = + (10000 + maxtiefe)
            Else
               wert = GetMinimierung(Maxtiefe, -1999990, +1999990)
               Slot(Spalte ) = wert
               SpFe (Spalte%,Reihe%) = 0
            End If
            Exit
         End If
      Next
   Next

   Return Slotauswaehlen%()
End Function


Function getMaximierung(tiefe%,alpha%,beta%)
   If tiefe = 0 Then  Return  CheckGewinnNote% (Farbe)
   For nr = 0 To 6
      Select Nr Case 0 Spalte = 3 Case 1 Spalte = 2 Case 2 Spalte = 4 Case 3 Spalte = 3 Case 4 Spalte = 5 Case 5 Spalte = 0 Case 6 Spalte = 6 End Select
      For Reihe% = 0 To 5
         If SpFe (Spalte%,Reihe%) = 0 Then
               SpFe (Spalte%,Reihe%) = Farbe%
               
               gewinne= CheckGewinn%(Spalte%,Reihe%,farbe%)
               If gewinne   Then
                  SpFe (Spalte%,Reihe%) = 0
                  wert= (10000 +tiefe)
               Else
                  wert = GetMinimierung(tiefe-1, alpha, beta)
                  SpFe (Spalte%,Reihe%) = 0
               End If
               If (wert => beta) Then Return beta
               If (wert > alpha) Then alpha = wert
               Exit
         End If
      Next
   Next
   Return alpha
End Function

Function getMinimierung (tiefe%,alpha%,beta%)
    If Tiefe = 0 Then Return CheckGewinnNote% (Farbe)
   For nr = 0 To 6
      Select Nr Case 0 Spalte = 3 Case 1 Spalte = 2 Case 2 Spalte = 4 Case 3 Spalte = 3 Case 4 Spalte = 5 Case 5 Spalte = 0 Case 6 Spalte = 6 End Select
      For Reihe% = 0 To 5
        If SpFe (Spalte%,Reihe%) = 0 Then
            SpFe (Spalte%,Reihe%) = Farbe Xor 3 
            Gewinne =CheckGewinn%(Spalte%,Reihe%,farbe% Xor 3)
         If gewinne  Then
            wert= -(10000+tiefe)
            SpFe (Spalte%,Reihe%) = 0
         Else
            wert = Getmaximierung(tiefe-1, alpha, beta)
            SpFe (Spalte%,Reihe%) = 0
         End If
            If (wert <= alpha) Then Return alpha
            If (wert < beta) Then beta = wert
         Exit
        End If
    Next
   Next
    Return beta
End Function


Function Slotauswaehlen%()
   ;höchsten Wert emitteln
   For x% = 0 To 6 ;Slot ermitteln
      If Feld (x%,5) = 0 Then ; der Slot ist oben frei
         maxwert% = Slot(x%)
         maxindex% = x%
         For x1% = x%+1 To 6
            If Feld (x1%,5) = 0 Then ; der Slot ist oben frei
               If maxwert% < Slot(x1%) Then
                  maxindex% = x1%
                  maxwert% = Slot(x1%)
               End If
            End If
         Next
         Exit
      End If
   Next
   
   Return maxindex%
End Function

Function CheckGewinnNote% (Player%)
   Return GewinnNote% (Player%) -GewinnNote% (Player%Xor 3)
End Function
Function GewinnNote% (Player%)
   gegner = Player% Xor 3
   ;Waagerecht
   
   Wert=1:faktor =2
   For x% = 0 To 3
   For y% = 0 To 5
      If SpFe (x,y) <> gegner% Then
         If SpFe (x+1,y%) <> gegner% Then
            If SpFe (x%+2,y%) <> gegner% Then
               If SpFe (x%+3,y%) <> gegner% Then
                  If SpFe (x,y%)   = Player Then Wert= Wert *faktor :faktor =faktor +1
                  If SpFe (x+1,y%) = Player Then Wert= Wert *faktor :faktor =faktor +1 
                  If SpFe (x+2,y%) = Player Then Wert= Wert *faktor :faktor =faktor +1 
                  If SpFe (x+3,y%) = Player Then Wert= Wert *faktor
                  Point = Point + Wert
                  Wert=1:faktor =2
               End If    
            End If
         End If
      End If
   Next
   Next
   ;senkrecht
   For x% = 0 To 6
   For y% = 0 To 2
      If SpFe (x,y) <> gegner% Then
         If SpFe (x,y%+1) <> gegner% Then
            If SpFe (x%,y%+2) <> gegner% Then
               If SpFe (x%,y%+3) <> gegner% Then
                  If SpFe (x,y%) = Player   Then Wert= Wert *faktor :faktor =faktor +1
                  If SpFe (x,y%+1) = Player Then Wert= Wert *faktor :faktor =faktor +1
                  If SpFe (x,y%+2) = Player Then Wert= Wert *faktor :faktor =faktor +1
                  If SpFe (x,y%+3) = Player Then Wert= Wert *faktor
                  Point = Point + Wert
                  Wert=1:faktor =2
               End If    
            End If
         End If
      End If
   Next
   Next
   
   For x% = 0 To 3
   For y% = 0 To 2
      If SpFe (x,y) <> gegner% Then
         If SpFe (x+1,y%+1) <> gegner% Then
            If SpFe (x%+2,y%+2) <> gegner% Then
               If SpFe (x%+3,y%+2) <> gegner% Then
                  If SpFe (x,y%) = Player Then  Wert= Wert    *faktor :faktor =faktor +1
                  If SpFe (x+1,y%+1) = Player Then Wert= Wert *faktor :faktor =faktor +1
                  If SpFe (x+2,y%+2) = Player Then Wert= Wert *faktor :faktor =faktor +1
                  If SpFe (x+3,y%+3) = Player Then Wert= Wert *faktor
                  Point = Point + Wert
                  Wert=1:faktor =2
               End If    
            End If
         End If
      End If
   Next
   Next
   
   For x% = 0 To 3
   For y% = 0 To 2
      If SpFe(x%, y%+3)  <> gegner%
         If SpFe(x%+1, y%+2)  <> gegner%
            If SpFe(x%+2, y%+1)  <> gegner%
               If SpFe(x%+3, y%)  <> gegner%
                  If SpFe(x%,   y%+3)  = Player Then Wert= Wert *faktor :faktor =faktor +1
                  If SpFe(x%+1, y%+2)  = Player Then Wert= Wert *faktor :faktor =faktor +1 
                  If SpFe(x%+2, y%+1)  = Player Then Wert= Wert *faktor :faktor =faktor +1
                  If SpFe(x%+3, y%  )  = Player Then Wert= Wert *faktor
                  Point = Point + Wert
                  Wert=1:faktor =2
               End If
            End If
         End If
      End If
   Next
   Next
   Return Point
End Function

Function CheckGewinn%(SteinSpalte%,SteinReihe%,Player%)
   ;Waagerecht
   For Spalte% = 0 To 3
      If SpFe (Spalte%,SteinReihe%) = Player% Then
         If SpFe (Spalte%+1,SteinReihe%) = Player% Then
            If SpFe (Spalte%+2,SteinReihe%) = Player% Then
               If SpFe (Spalte%+3,SteinReihe%) = Player% Then reture =1
            End If
         End If
      End If
   Next
   ;senkrecht
   For Reihe% = 0 To 2
      If SpFe (SteinSpalte%,Reihe%) = Player% Then
         If SpFe (SteinSpalte%,Reihe%+1) = Player% Then
            If SpFe (SteinSpalte%,Reihe%+2) = Player% Then
               If SpFe (SteinSpalte%,Reihe%+3) = Player% Then Return reture =reture +1
            End If
         End If
      End If
   Next
   ;
   x=SteinSpalte% : y=SteinReihe : If x < y Then y=y-x :x=0 ElseIf y<x  x=x-y :y=0 Else x=0 :y=0
   For x = x To 3
      If x+3 >6 Or y+3 >5 Then Exit
      If SpFe(x , y)=Player%
         If SpFe(x +1, y+1)=Player%
            If SpFe(x +2, y+2)=Player%
               If SpFe(x +3, y+3)=Player% Return reture =reture +1
            EndIf
         EndIf
      EndIf
      y=y+1
   Next
   ;
   y1%=SteinSpalte + SteinReihe
   If y1 < 3 Then Return
   If y1 > 5 Then x1 = y1-5 : y1=5
   For x1 = x1 To x1+2
      If x1>3 Or y1<3 Then Exit
      If SpFe(x1,y1) =Player%
         If SpFe(x1+1, y1-1) =Player%
            If SpFe(x1+2, y1-2) =Player%
               If SpFe(x1+3, y1-3) =Player% Then Return reture =reture +1
            End If
         End If
      End If
      y1=y1-1
   Next
   Return reture
End Function
[BB2D | BB3D | BB+]

PSY

BeitragSo, Apr 19, 2009 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,

bin mal auf das Endergebnis gespannt Very Happy

Hatte auch angefangen, aber aus Zeitgründen abgebrochen. Vllt reich ich noch was nach, nur der Vollständigkeit halber Very Happy

Meine Implementation hat sich dem alpha-beta Algo bedient, der sich rekursiv aufruft und dann die Blätter bewertet hat, was aber Probleme bereitete, weil vorher schon eine Sieg/Niederlage Situation eintreten konnte. Ich hab deswegen den Beta-Cutoff rausgenommen, was zwar etwas an Performance ausmacht, aber so hab ich halt alle Wege bewertet und diese nach der Bewertung nach Sieg/Niederlage durchforstet.
Naja so 100% zufrieden war ich noch nicht, weil es noch zu Fehlbewertungen kam, aber um das auszubügeln muss ich die Einzelknoten nach Sieg/Niederlage bewerten, dafür hab ich aber jetzt keine Zeit mehr Oo

Vllt mach ichs noch fertig, vllt auch nicht. Jedenfalls ein sehr geiler Wettbewerb, ich gratulier schon mal dem Sieger Wink

L8er,
PSY
PSY LABS Games
Coders don't die, they just gosub without return

TimBo

BeitragSo, Apr 19, 2009 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja genau das war (ist) meine Vorgehensweise, das mit den einzelknoten habe ich so gelöst:

ich gehe ja jeden zug durch und bewerte nur den letzten ast, denn davor wäre es ja total energie fressend Rolling Eyes

wenn es beim letzten ast eine möglichkeit gibt , dass ich verlieren sollte, dann wird dieser komplette erste zug also schlecht bewertet.

Zitat:
1. 2. 3. 4. 5. 6. 7.
....|
1. 2. 3. 4. 5. 6. 7.
.. /
./
1. 2. 3. 4. 5. 6. 7.


wenn der zug (1 (letzter zug)) verlust fpr mich als folge hätte, dann wäre Zug 2(ausgangszug) mit einer Stärke von #-10000 oder so bewertet worden.


Viele Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

PSY

BeitragMo, Apr 20, 2009 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
@Timbo
das problem bei der blätterbewertung ist, dass es -je grösser die suchtiefe ist- öfter vorkommt, dass es für gelb und rot mehrere gewinnstellungen gibt, das verursacht probleme bei der bewertung...werd mal dran schrauben wenn ich zeit hab.


gib mal die stellung in deine KI ein:



Vier-gewinnt-Spielstellung, 0 = leer, 1 = rot, 2 = gelb:
--------------------
0000100
0000200
0122200
0111200
0212100
2111200
--------------------
2 ist am Zug

l8er,
psy
PSY LABS Games
Coders don't die, they just gosub without return

TimBo

BeitragMo, Apr 20, 2009 1:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja meine KI macht wie ich sehe in die erste Spalte,

erstmal musste ich mich wundern, aber jetzt sehe ich, dass meine KI doch seh Fair sein kann, sie gibt auf, denn sie hat sowieso verloren.

Macht sie nicht in die erste , macht der gegner in die erste , dann muss ich auch in die erste machen , dann macht sie in die erste und hat gewonnen XD

Ich denke mal das das die Begründung sein mag.

Viele Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

PSY

BeitragMo, Apr 20, 2009 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm,

das ist ne Möglichkeit. Aber schau Dir mal diese Stellung an (die von vorhin, bloss 2 Züge weiter):

Vier-gewinnt-Spielstellung, 0 = leer, 1 = rot, 2 = gelb:
--------------------
0000100
0001200
0122200
0111200
0212100
2111220
--------------------
2 ist am Zug

Gelb wirft immer noch in den ersten Slot, obwohl er einfach in den 6. werfen muss, um zu gewinnen.

Grüsse,
PSY

(Edit)
So wie versprochen (nur der Vollständigkeit halber und falls jemand interessiert ist) meine KI, hab doch noch etwas Zeit gefunden.

Die Grundstruktur ist ein rekursiver Alpha-Beta Algorithmus mit Beta Cut-Off, um Rechenzeit zu sparen. Alle 2 Halbzüge (also wenn jeder Spieler 1 Stein geworfen hat) wird die Stellung schnell auf Sieg/Niederlage bewertet, wird was gefunden, wird sofort eine entsprechende Bewertung zurückgeliefert. Wenn nicht, gehts tiefer. Wird das Ende eines Astes(Blatt) erreicht, wird die Stellung bewertet. Dabei werden alle 8 Richtungen um jeden Stein auf Nachbarn (eigene oder gegnerische) gecheckt. Je mehr eigene in einer Reihe, desto höher die Bewertung. Am Ende werden alle eigenen und gegnerischen jeweils addiert und die Gesamtwertung voneinander subtrahiert. Diese Endwertung wird dann zurückgeliefert.

Die ersten Züge werden präferiert in die mittleren Slots geworfen.

Es gibt noch einiges an Verbesserungspotential, z.B.
Mittlere Spalten höher bewerten
Defensiv, aggressiv oder neutral spielen (relativ einfach durch die Bewertung zu lösen)
Bewertung verfeinern (ich hab bei eigenen Steinen Faktor 10 und bei gegnerischen Faktor 9, da werd ich bei Gelegenheit noch ein wenig mit den Werten rumspielen).

Spielen tut die KI dennoch ziemlich gut. Der KI vs KI Netzwerk Test taugt in der jetzigen Form leider nicht. Erstmal hängts total davon ab, wer der Host ist, und sobald eine KI verhältnismässig hohe Rechenzeiten braucht, wirds total fehlerhaft. Teilweise wird mit viel niedrigerer Rechentiefe ein viel besseres Ergebnis erzielt Oo

Die oben erwähnte Stellung wird übrigens korrekt gelöst ;P

Code: [AUSKLAPPEN]
AppTitle("Vier-gewinnt-Gegner: PSY'S EXTERMINATOR")
SeedRnd MilliSecs()

Global searchDepth% = 6 ; DIFFICULTY LEVEL

Dim movesLeft%(searchDepth)
Dim slot%(6,searchDepth)
Dim undoX%(searchDepth), undoY%(searchDepth)


Global BESTMOVE%
Global currentPlayer%   ; PLAYER WHOSE TURN IT IS AT THE ACTUAL DEPTH
Global player2rate%    ; KI PLAYER
Global EM%            ; EVALUATION MODIFICATOR (-1 AT ODD SEARCHDEPTH, +1 AT EVEN SEARCHDEPTH)
Global totalchips%      ; TOTAL NUMBER OF CHIPS PLAYED

Function BesteSpalte%()
   Local x%, y%, depth%, TOPRATING%=-9999999, TOPSLOT=-1
   player2rate    = farbe
   currentPlayer    = 3 - farbe
   BESTMOVE       = 0
   totalchips      = 0
   If (searchDepth Mod 2) = 0 Then EM=1 Else EM=-1
   For x=0 To 6
      For y=0 To 5
         If feld(x,y)>0 Then totalchips = totalchips+1 ; COUNT ALL CHIPS
      Next
      If searchDepth>42-totalchips Then searchDepth=42-totalchips ; LIMIT SEARCHDEPTH IF EXCEEDING FREE SLOTS
      For depth%=0 To searchDepth
         slot(x,depth%) = False
         undoX(depth)=0 : undoY(depth)=0
      Next
   Next
   AlphaBeta (searchDepth, -9999999, 9999999) ; INVOKE ALPHA-BETA ALGO
   Return BESTMOVE
End Function


; RECURSIVE ALPHA-BETA ALGORITHM WITH BETA CUT-OFF
Function AlphaBeta(depth%, alpha%, beta%)
   Local rating%, mate%, center%
   currentPlayer=3-currentPlayer
   
   If totalchips<3 ;PREFER CENTER SLOTS AT THE BEGINNING
      center = Rand(1,10)
      If center>4 Then BESTMOVE=3 : Return    ; 60% CENTER SLOT
      If center>2 Then BESTMOVE=4 : Return    ; 20% RIGHT OF CENTER SLOT
      BESTMOVE=2 : Return                ; 20% LEFT OF CENTER SLOT
   EndIf
   
   ;CHECK FOR WIN/LOSS EVERY 2 CHIPS
   If (depth<>searchDepth) And ((searchDepth-depth) Mod 2 = 0)
      mate=check4win(depth) : If mate<>0 Then Return mate
   EndIf
   
   If depth=0 Then Return RatePosition(depth) ; CALL EVALUATION FUNCTION WHEN DEPTH=0 (LEAF REACHED)
   
   FindValidMoves(depth)       ; FIND ALL VALID MOVES AT THE CURRENT DEPTH
   While movesLeft(depth) > 0    ; ARE THERE ANY VALID MOVES LEFT?
      DoMove(depth)          ; IF YES, DO NEXT MOVE
      rating = -AlphaBeta(depth-1, -beta, -alpha) ; RECURSIVE CALL OF ALPHA-BETA
      UndoMove(depth)
      currentPlayer=3-currentPlayer ; SWITCH PLAYER
      
      If rating >= beta ; BETA CUT-OFF TO SAVE TIME
         movesLeft(depth)=0
         For x=0 To 6
            slot(x,depth)=False
         Next
         Return beta
      EndIf
      
      If rating > alpha  Then alpha = rating : If depth = searchDepth Then BESTMOVE = undoX(depth) ; BEST MOVE YET?
      
   Wend
   Return alpha
End Function

; CHECK FOR WIN/LOSS
; PREFER EARLIER SITUATIONS BY CALCULAING WITH A DEPTH FACTOR
Function check4win(depth)
   Local enemy%=3-player2rate
   Local lossflag%=0
   Local x%,y%
   For x=0 To 6
      For y=0 To 5
         If x<4          And feld(x,y) = player2rate And feld(x+1,y)      = player2rate And feld(x+2,y)   = player2rate And feld(x+3,y)    = player2rate Then Return depth*500001 ; -
         If y<3          And feld(x,y) = player2rate And feld(x,y+1)      = player2rate And feld(x,y+2)   = player2rate And feld(x,y+3)   = player2rate Then Return depth*500001 ; |
         If y<3 And x<4    And feld(x,y) = player2rate And feld(x+1,y+1)   = player2rate And feld(x+2,y+2)   = player2rate And feld(x+3,y+3)   = player2rate Then Return depth*500001 ; /
         If y>2 And x<4    And feld(x,y) = player2rate And feld(x+1,y-1)   = player2rate And feld(x+2,y-2)   = player2rate And feld(x+3,y-3)   = player2rate Then Return depth*500001 ; \
         If x<4          And feld(x,y) = enemy    And feld(x+1,y)      = enemy And feld(x+2,y)      = enemy And feld(x+3,y)    = enemy Then lossflag=lossflag-1 ; -
         If y<3          And feld(x,y) = enemy    And feld(x,y+1)      = enemy And feld(x,y+2)      = enemy And feld(x,y+3)      = enemy Then lossflag=lossflag-1 ; |
         If y<3 And x<4    And feld(x,y) = enemy    And feld(x+1,y+1)   = enemy And feld(x+2,y+2)   = enemy And feld(x+3,y+3)   = enemy Then lossflag=lossflag-1 ; /
         If y>2 And x<4    And feld(x,y) = enemy    And feld(x+1,y-1)   = enemy And feld(x+2,y-2)   = enemy And feld(x+3,y-3)   = enemy Then lossflag=lossflag-1 ; \
      Next
   Next
   If lossflag<>0 Return depth*-500000
   Return 0
End Function


Function FindValidMoves(depth%)
   Local x%,y%
   For x=0 To 6
      If feld(x,5)=0 ;SLOT NOT FULL YET?
         movesLeft(depth) = movesLeft(depth) + 1
         slot(x,depth)=True
      EndIf
   Next
End Function


Function DoMove(depth%)
   Local x%,y%
   For x=0 To 6
      If slot(x,depth)=True                   ; FIND NEXT MOVE
         slot(x,depth)=False                ; MOVE FOUND, MARK SLOT
         movesLeft(depth) = movesLeft(depth) - 1
         y=0
         While feld(x,y)<>0                  ; FIND FREE Y-POSITION
            y=y+1
         Wend
         feld(x,y) = currentPlayer            ; INSERT CHIP
         undoX(depth)=x : undoY(depth)=y         ; REMEMBER X/Y POSITION
         Return
      EndIf
   Next
End Function


Function UndoMove(depth)
   feld(undoX(depth),undoY(depth))=0
End Function


; EVALUATE LEAF (DEPTH HAS REACHED ZERO)
; THE MORE CHIPS OF THE SAME COLOR ARE NEXT TO EACH OTHER, THE HIGHER THE RATING
; NEARBY ENEMY CHIPS LOWER THE RATING
Function RatePosition(depth)
   Local enemy%=3-player2rate
   Local x%, y%, a%, b%, score_a%, score_b%, i%, finalrating%
   
   For x=0 To 6
      For y=0 To 5
         a=10
         For i=0 To 3
            If (x+i)<7
               If feld(x+i,y)=player2rate  Then a=a*10 ElseIf feld(x+i,y)=enemy Then a=10 : Exit Else Exit ; >
            EndIf
         Next
         If a>10 Then score_a=score_a+a
         a=10
         For i=0 To 3
            If (x-i)>=0
               If feld(x-i,y)=player2rate Then a=a*10 ElseIf feld(x-i,y)=enemy Then a=10 : Exit Else Exit ; <
            EndIf
         Next
         If a>10 Then score_a=score_a+a
         a=10
         For i=0 To 3
            If (y+i)<6
               If feld(x,y+i)=player2rate Then a=a*10 ElseIf feld(x,y+i)=enemy Then a=10 : Exit Else Exit ; ^
            EndIf
         Next
         If a>10 Then score_a=score_a+a
         a=10
         For i=0 To 3
            If (y-i)>=0
               If feld(x,y-i)=player2rate Then a=a*10 ElseIf feld(x,y-i)=enemy Then a=10 : Exit Else Exit ; v
            EndIf
         Next
         If a>10 Then score_a=score_a+a
         a=10
         For i=0 To 3
            If (x+i)<7 And (y+i)<6
               If feld(x+i,y+i)=player2rate Then a=a*10 ElseIf feld(x+i,y+i)=enemy Then a=10 : Exit Else Exit ; ^>
            EndIf
         Next
         If a>10 Then score_a=score_a+a
         a=10
         For i=0 To 3
            If (x-i)>=0 And (y+i)<6
               If feld(x-i,y+i)=player2rate Then a=a*10 ElseIf feld(x-i,y+i)=enemy Then a=10 : Exit Else Exit ; ^<
            EndIf
         Next
         If a>10 Then score_a=score_a+a
         a=10
         For i=0 To 3
            If (y-i)>=0 And (x+i)<7
               If feld(x+i,y-i)=player2rate Then a=a*10 ElseIf feld(x+i,y-i)=enemy Then a=10 : Exit Else Exit ; v>
            EndIf
         Next
         If a>10 Then score_a=score_a+a
         a=10
         For i=0 To 3
            If (y-i)>=0 And (x-i)>=0
               If feld(x-i,y-i)=player2rate Then a=a*10 ElseIf feld(x-i,y-i)=enemy Then a=10 : Exit Else Exit ;v<
            EndIf
         Next
         If a>10 Then score_a=score_a+a
      Next
   Next
   
   For x=0 To 6
      For y=0 To 5
         b=9
         For i=0 To 3
            If (x+i)<7
               If feld(x+i,y)=enemy  Then b=b*9 ElseIf feld(x+i,y)=player2rate Then b=9 : Exit Else Exit ; >
            EndIf
         Next
         If b>9 Then score_b=score_b+b
         b=9
         For i=0 To 3
            If (x-i)>=0
               If feld(x-i,y)=enemy Then b=b*9 ElseIf feld(x-i,y)=player2rate Then b=9 : Exit Else Exit ; <
            EndIf
         Next
         If b>9 Then score_b=score_b+b
         b=9
         For i=0 To 3
            If (y+i)<6
               If feld(x,y+i)=enemy Then b=b*9 ElseIf feld(x,y+i)=player2rate Then b=9 : Exit Else Exit ; ^
            EndIf
         Next
         If b>9 Then score_b=score_b+b
         b=9
         For i=0 To 3
            If (y-i)>=0
               If feld(x,y-i)=enemy Then b=b*9 ElseIf feld(x,y-i)=player2rate Then b=9 : Exit Else Exit ; v
            EndIf
         Next
         If b>9 Then score_b=score_b+b
         b=9
         For i=0 To 3
            If (x+i)<7 And (y+i)<6
               If feld(x+i,y+i)=enemy Then b=b*9 ElseIf feld(x+i,y+i)=player2rate Then b=9 : Exit Else Exit ; ^>
            EndIf
         Next
         If b>9 Then score_b=score_b+b
         b=9
         For i=0 To 3
            If (x-i)>=0 And (y+i)<6
               If feld(x-i,y+i)=enemy Then b=b*9 ElseIf feld(x-i,y+i)=player2rate Then b=9 : Exit Else Exit ; ^<
            EndIf
         Next
         If b>9 Then score_b=score_b+b
         b=9
         For i=0 To 3
            If (y-i)>=0 And (x+i)<7
               If feld(x+i,y-i)=enemy Then b=b*9 ElseIf feld(x+i,y-i)=player2rate Then b=9 : Exit Else Exit ; v>
            EndIf
         Next
         If b>9 Then score_b=score_b+b
         b=9
         For i=0 To 3
            If (y-i)>=0 And (x-i)>=0
               If feld(x-i,y-i)=enemy Then b=b*9 ElseIf feld(x-i,y-i)=player2rate Then b=9 : Exit Else Exit ;v<
            EndIf
         Next
         If b>9 Then score_b=score_b+b
         
      Next
   Next
   
   finalrating = (score_a-score_b)
   Return EM*finalrating
   
End Function




L8er,
PSY
PSY LABS Games
Coders don't die, they just gosub without return

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

Neue Antwort erstellen


Übersicht Sonstiges Projekte

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group