BCC 25 - Abstimmung

Übersicht Sonstiges Projekte

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

Wer hat die beste KI erstellt?
AnniXa 21% 21% 8 Stimmen
ComNik 5% 5% 2 Stimmen
Firstdeathmaker 24% 24% 9 Stimmen
Rallimen 10% 10% 4 Stimmen
TimBo 37% 37% 14 Stimmen
Insgesamt 37 Stimmen

BlitzMoritz

Betreff: BCC 25 - Abstimmung

BeitragSo, Apr 19, 2009 11:54
Antworten mit Zitat
Benutzer-Profile anzeigen
So - die Zeit ist um - hiermit erkläre ich den BCC 25 für beendet und eröffne die Abstimmung, die von jetzt an drei Tage dauern soll. Die Abstimmung endet also am Mittwoch, den 22.April, um 12.00 Uhr mittags.

Zunächst einmal möchte ich ein großes Lob und Anerkennung an alle Teilnehmer aussprechen. Der ein oder andere gewöhnte sich zwar an, ständig tiefzustapeln nach dem Motto "meine KI ist eh' die schlechteste" usw..., was aber gar nicht angebracht erscheint, denn ich weiß von mehreren anderen Usern, dass sie durchaus Interesse hatten, teilzunehmen und auch entsprechende Projekte gestartet hatten, letztlich jedoch nichts Erfolgreiches zuwege brachten bzw. vor dem hohen Anspruch der Aufgabe kapitulieren mussten. Insofern ist jeder der Beiträge ein großer Erfolg, denn mit jeder KI kann man tatsächlich spielen! Und zwar so, dass man eben nicht sofort merkt, dass auf der anderen Seite nur eine (dumme) Maschine entscheidet.
Ich habe alle Beiträge als Exe's kompiliert (und UPX-komprimiert), damit Ihr sofort mit dem Testen loslegen könnt, und in folgendem Download-Päckchen zusammengefasst:

https://www.blitzforum.de/upload/file.php?id=5340

Im "Programme"-Ordner könnt ihr selbst mit den KI's spielen und im "Netzwerk-Turnier"-Ordner könnt ihr die KIs jeweils 40 Partien gegeneinander spielen lassen. Ich habe für TimBo zwei Netzwerk-Programme mit unterschiedlichen Stärken kompiliert. Dabei habe ich TimBo's höchste Suchtiefe 8 vermieden, denn sie benötigt für jeden Zug ungefähr eine halbe Minute. Bei je 40 Partien gegen fünf andere KI's und mindestens zehn Zügen pro Spiel wären das nämlich in der Summe über 16 Stunden Rechenzeit.

Zur Abstimmung sind die folgenden fünf Teilnehmer zugelassen:
AnniXa
ComNik
Firstdeathmaker
Rallimen
TimBo

Bewertung:
Arrow Der wichtigste Entscheidungsparameter für die Abstimmung ist selbstverständlich zuallererst, wie gut eine KI spielt. Dies möge man evtl. nicht ausschließlich in den Ergebnissen des Netzwerk-Turniers ablesen. Man sollte auch selbst einmal gegen die KI spielen.
Arrow Zweiter Entscheidungsparameter ist die Abwechslung: Reagiert die KI ständig mit denselben Spielzügen, oder wechselt sie ab, so dass der Unterhaltungswert für den Spieler wesentlich steigt?
Arrow Dritter Entscheidungsparameter ist die Schnelligkeit, mit der ein Zug berechnet wird. Haben beispielsweise zwei KI's ein ausgeglichenes Sieg-Niederlage-Verhältnis, so sollte diejenige besser beurteilt werden, die dafür weniger Zeit benötigt.
Arrow Und natürlich sollte man auch die Quantität und Qualität des Codes beurteilen.

Ich wünsche viel Spaß beim Testen - möge sich ein verdienter Sieger herauskristallisieren Wink
  • Zuletzt bearbeitet von BlitzMoritz am Do, Apr 23, 2009 7:36, insgesamt 4-mal bearbeitet

BtbN

BeitragSo, Apr 19, 2009 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du nicht was wichtiges vergessen für diese Abstimmung? So die Abstimmung vllt.?

TimBo

BeitragSo, Apr 19, 2009 13:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Suchtiefe 8 ist nur zum entscheiden, was der beste Zug ist. Diese Funktion gibt es bei diversen Schachcomputern, dabei kann es vorkommen das er 2 Stunden rechnet. Also das mit der 8 war nie zum Duell 2er KI's vorgesehen.

Viele Grüße
TimBo

Bei mir funktionieren die Exen nicht, Illegal Memory was weiß ich.
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

BeitragSo, Apr 19, 2009 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
ähmmm mir fällt gerade dass auf was auch ralliman aufgefallen ist.

Spiele Ich:
Rallimen:ComNIk: 24:15 (1 Remis)
ComNik:Rallimen: 10:30
und das IMMER!

Na ja ich bi sowieso für die bewertung Mensch:Ki

Viel Glück noch allen.
WIP: Vorx.Engine

BlitzMoritz

BeitragSo, Apr 19, 2009 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
BtbN hat Folgendes geschrieben:
Hast du nicht was wichtiges vergessen für diese Abstimmung? So die Abstimmung vllt.?

Hä? Ich dachte, dass müsste ein Administrator machen. Falls nicht - sagt mir bitte, wo 'man 'ne Abstimmung eingeben kann, ich hab's noch nie gemacht und auch nix gefunden in der Auswahl "Quote", "Code" usw.

TimBo hat Folgendes geschrieben:
Bei mir funktionieren die Exen nicht, Illegal Memory was weiß ich.
Wieso denn das schon wieder? Das einzige, was ich gemacht habe, ist, alle Exes mit UPX zu komprimieren, damit das Paket nicht zu groß wird. Wenn das (evtl. für Vista) ein Problem sein sollte, kann ich natürlich alles unkomprimiert machen.
  • Zuletzt bearbeitet von BlitzMoritz am So, Apr 19, 2009 16:31, insgesamt einmal bearbeitet

BtbN

BeitragSo, Apr 19, 2009 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Rate mal, wozu fett untendrunter bei der Themen-Erstellung das "Umfrage Erstellen" gut ist.

TimBo

BeitragSo, Apr 19, 2009 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe es versucht im kompatiblität modus und es geht immer noch nicht, ich habe vista.
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.

kriD

BeitragSo, Apr 19, 2009 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
kann man nih einfach die KIs gegeneinander antreten lassen und so den sieger ermitteln?

lg kriD
Wenn ich du wäre, wäre ich lieber ich!

BlitzMoritz

BeitragSo, Apr 19, 2009 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Sooooo, die Abstimmung ist jetzt wirklich eröffnet Rolling Eyes
Für TimBo u.a. habe ich jetzt ganz schnell noch ein Paket mit nicht komprimierten Exen hochgeladen, ich hoffe, es klappt jetzt. (Man muss die Programm-Exen natürlich in einem Ordner starten, in dem auch der "media"-Ordner steckt.).
EDIT: Download wieder entfernt, da nicht mehr notwendig
  • Zuletzt bearbeitet von BlitzMoritz am Do, Apr 23, 2009 7:37, insgesamt einmal bearbeitet

ComNik

BeitragSo, Apr 19, 2009 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
äh, kann man bei der abstimmung nicht einfach immer wieder auf den gewünschten namen klicken??
[edit]Ahhh kann man nicht...[edit ende]

und die teilnehmer dürfen nicht mit abstimmen, oder?

lg
ComNik
WIP: Vorx.Engine

TimBo

BeitragSo, Apr 19, 2009 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke das du für uns Vista konsorten extra das neue Package gemacht hast nur,

ein Bild sagt mehr als 1000 Worte:

user posted image

ich bin am verzweifeln nur das bMax Programm funktioniert, vll. bin ich aber nur zu dumm um ne exe zu starten Wink

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.

BtbN

BeitragSo, Apr 19, 2009 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert hier auf Vista problemlos.

SpionAtom

BeitragSo, Apr 19, 2009 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
AnniXa: hab ich besiegt, nachdem nur noch 2 Spalten übrig waren, gabs Zugzwang
BlitzMoritz: Remis
ComNik: Schnell besiegt
FirstdeathMaker: hab ich besiegt
Rallimen: verloren nach blöder Zwickmühle xD, und dann nochmal nach Zungzwang bei zwei übrig gebliebenen Spalten Exclamation
TimBo: hab ich besiegt, nach Zugzwang bei zwei übrig gebliebenen Spalten

Und bis auf bei TimBo gabs eigentlich keine Zeitverzögerung..
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Xaymar

ehemals "Cgamer"

BeitragSo, Apr 19, 2009 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Firstdeathmakers netzwerk dingends da verbraucht nach der zeit immer mehr speicher. (~1gb nach 30min)
iwie beendet es sich nicht
Warbseite

TimBo

BeitragMo, Apr 20, 2009 1:05
Antworten mit Zitat
Benutzer-Profile anzeigen
warum darf ich denn eigentlich mitstimmen , ich dachte die Teilnehmer dürfen nicht abstimmen ...

und funken tut es bei mir leider immer noch nicht , egal kann man wohl nichts ändern.

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.

BladeRunner

Moderator

BeitragMo, Apr 20, 2009 2:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Es wäre mir neu dass bei Abstimmungen die Teilnahmer ausgeschlossen wären. Weshalb auch.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

BlitzMoritz

BeitragMo, Apr 20, 2009 7:35
Antworten mit Zitat
Benutzer-Profile anzeigen
@TimBo: Tut mir echt leid, aber ich weiß jetzt auch nich' mehr, was ich dir raten soll...
Doch! Eines schon: im Code-Ordner findest du alle BesteSpalte()-Funktionen. Dann kompilier dir die Exen auf deinem Rechner doch einfach neu Smile (Edit: Hattest du die zip-Ordner vorher auch wirklich entpackt?)

@Cgamer: Firstdeathmaker deutete einmal an, dass sich seine KI sämtliche Spiele in Datenbanken speichert, um aus einer Niederlage zu "lernen" - ob's funktioniert, ist die Frage - ich hab' mal die gleiche Partie, die sie verloren hatte, immer wieder gespielt.
  • Zuletzt bearbeitet von BlitzMoritz am Mo, Apr 20, 2009 9:59, insgesamt einmal bearbeitet

ComNik

BeitragMo, Apr 20, 2009 8:01
Antworten mit Zitat
Benutzer-Profile anzeigen
also gegen annixas ki gewinn ich immer, weil sie nicht beachtet ob 3 schräg in einer reihe sind und unten ein stein hinkann.
Gegen rallimens ki gewinn ich auch immer, da sie nicht beachtet ob zwei in einer reihe sind und ich somit eine zwickmühle aufbauen kann.

Lg
WIP: Vorx.Engine

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Apr 20, 2009 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Gegen rallimens ki gewinn ich auch immer

liegt daran das noch ein kleiner Bug drinn ist, der aber starke Auswirkungen hat!
ändern kann ich es nicht mehr da der Abgabetermin schon in der Vergangenheit liegt!
Wenn es interessiert hier die beste Spalte() ohne Bug!
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 V2009_04_20")
;--------------------------------------
Dim SpFe%(6,5)
Dim Slot% (6)
Global Maxtiefe% =4


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%          :Steingesetzt = True ;Stein sezten
            ;ShowFieldPrint():Stop
            If CheckGewinn%(Spalte%,Reihe%,farbe%)
               SpFe (Spalte%,Reihe%) = 0
               Slot(Spalte) =  (10000 + maxtiefe)
            Else
               Slot(Spalte) = GetMinimierung(Maxtiefe, -1999990, +1999990)
               SpFe (Spalte%,Reihe%) = 0    :Steingesetzt = False ;Stein rausnehmen
            End If
            ;ShowFieldPrint():Stop
            Exit
         End If
      Next
   Next
   ;ShowFieldPrint()
   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 = 1 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%
            ;::::ShowFieldPrint()
            If CheckGewinn%(Spalte%,Reihe%,farbe%)    Then
               SpFe (Spalte%,Reihe%) = 0
               wert = (10000 +tiefe)
               ;:Stop
            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 = 1 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
            ;ShowFieldPrint()
            If CheckGewinn%(Spalte%,Reihe%,farbe% Xor 3)   Then
               SpFe (Spalte%,Reihe%) = 0
               wert = -(10000+tiefe)
            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%()
   ;Stop
   ;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
   ;ShowFieldprint()
   Return maxindex%
End Function


Function CheckGewinnNote% (Player%)
AnzNote =anznote +1
Return GewinnNote% (Player%) -GewinnNote% (Player%Xor 3)

End Function
Function GewinnNote% (Player%)
;anznote=anznote+1
   gegner = Player% Xor 3
   ;Waagerecht
   Wert=1
   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 *2
                  If SpFe (x+1,y%) = Player Then Wert= Wert *2 
                  If SpFe (x+2,y%) = Player Then Wert= Wert *2 
                  If SpFe (x+3,y%) = Player Then Wert= Wert *2
                  If wert = 16  Then Wert= Wert *2:RuntimeError "1"
                  Point = Point + Wert
                  Wert=1
               End If    
            End If
         End If
      End If
   Next
   Next
   ;senkrecht
   Point = Point+Wert
   Wert=1
   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 *2 
                  If SpFe (x,y%+1) = Player Then Wert= Wert *2 
                  If SpFe (x,y%+2) = Player Then Wert= Wert *2 
                  If SpFe (x,y%+3) = Player Then Wert= Wert *2
                  If wert = 16  Then Wert= Wert *2:RuntimeError "2"
                  Point = Point + Wert
                  Wert=1
               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 *2 
                  If SpFe (x+1,y%+1) = Player Then Wert= Wert *2 
                  If SpFe (x+2,y%+2) = Player Then Wert= Wert *2 
                  If SpFe (x+3,y%+3) = Player Then Wert= Wert *2
                  If wert = 16  Then Wert= Wert *2:RuntimeError "3"
                  Point = Point + Wert
                  Wert=1
               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 *2 
                  If SpFe(x%+1, y%+2)  = Player Then Wert= Wert *2 
                  If SpFe(x%+2, y%+1)  = Player Then Wert= Wert *2 
                  If SpFe(x%+3, y%  )  = Player Then Wert= Wert *2
                  If wert = 16  Then Wert= Wert *2:RuntimeError "4"
                  Point = Point + Wert
                  Wert=1
               End If
            End If
         End If
      End If
   Next
   Next
   Return Point
End Function

Function CheckGewinn%(SteinSpalte%,SteinReihe%,Player%)
   Spalte =SteinSpalte%
   Reihe% =SteinReihe%
   ;Waagerecht
   For Spalte% = 0 To 3
      If SpFe (Spalte%,Reihe%) = Player% Then
         If SpFe (Spalte%+1,Reihe%) = Player% Then
            If SpFe (Spalte%+2,Reihe%) = Player% Then
               If SpFe (Spalte%+3,Reihe%) = Player% Then  Return 1
            End If
         End If
      End If
   Next
   Spalte =SteinSpalte%
   Reihe% =SteinReihe%
   ;senkrecht
   For Reihe% = 0 To 2
      If SpFe (Spalte%,Reihe%) = Player% Then
         If SpFe (Spalte%,Reihe%+1) = Player% Then
            If SpFe (Spalte%,Reihe%+2) = Player% Then
               If SpFe (Spalte%,Reihe%+3) = Player% Then  Return 1
            End If
         End If
      End If
   Next
   Spalte =SteinSpalte%
   Reihe% =SteinReihe%
   x=Spalte% : y=Reihe : 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 1
            EndIf
         EndIf
      EndIf
      y=y+1
   Next
   Spalte =SteinSpalte%
   Reihe% =SteinReihe%
   y1%=Spalte + Reihe
   If y1 < 3 Then Return
   If y1 > 5 Then x1 = y1-5 : y1=5
   For x1 = x1 To x1+2
      ;If x1+3>6 Or y1-3<0 Then Exit
      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 1
            End If
         End If
      End If
      y1=y1-1
   Next
   
End Function

Function ShowFieldPrint()

   Print"ShowField"
   For y = 5 To 0 Step -1
      For x = 0 To 6
         Write  SpFe (x%,y%)
      Next
      Print ""
   Next
   Print""
   For t= 0 To 6 Print Slot(t) Next
   Print""
End Function
;-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 V2009_04_20")
;--------------------------------------
Dim SpFe%(6,5)
Dim Slot% (6)
Global Maxtiefe% =4


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%          :Steingesetzt = True ;Stein sezten
            ;ShowFieldPrint():Stop
            If CheckGewinn%(Spalte%,Reihe%,farbe%)
               SpFe (Spalte%,Reihe%) = 0
               Slot(Spalte) =  (10000 + maxtiefe)
            Else
               Slot(Spalte) = GetMinimierung(Maxtiefe, -1999990, +1999990)
               SpFe (Spalte%,Reihe%) = 0    :Steingesetzt = False ;Stein rausnehmen
            End If
            ;ShowFieldPrint():Stop
            Exit
         End If
      Next
   Next
   ;ShowFieldPrint()
   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 = 1 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%
            ;::::ShowFieldPrint()
            If CheckGewinn%(Spalte%,Reihe%,farbe%)    Then
               SpFe (Spalte%,Reihe%) = 0
               wert = (10000 +tiefe)
               ;:Stop
            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 = 1 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
            ;ShowFieldPrint()
            If CheckGewinn%(Spalte%,Reihe%,farbe% Xor 3)   Then
               SpFe (Spalte%,Reihe%) = 0
               wert = -(10000+tiefe)
            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%()
   ;Stop
   ;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
   ;ShowFieldprint()
   Return maxindex%
End Function


Function CheckGewinnNote% (Player%)
AnzNote =anznote +1
Return GewinnNote% (Player%) -GewinnNote% (Player%Xor 3)

End Function
Function GewinnNote% (Player%)
;anznote=anznote+1
   gegner = Player% Xor 3
   ;Waagerecht
   Wert=1
   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 *2
                  If SpFe (x+1,y%) = Player Then Wert= Wert *2 
                  If SpFe (x+2,y%) = Player Then Wert= Wert *2 
                  If SpFe (x+3,y%) = Player Then Wert= Wert *2
                  If wert = 16  Then Wert= Wert *2:RuntimeError "1"
                  Point = Point + Wert
                  Wert=1
               End If    
            End If
         End If
      End If
   Next
   Next
   ;senkrecht
   Point = Point+Wert
   Wert=1
   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 *2 
                  If SpFe (x,y%+1) = Player Then Wert= Wert *2 
                  If SpFe (x,y%+2) = Player Then Wert= Wert *2 
                  If SpFe (x,y%+3) = Player Then Wert= Wert *2
                  If wert = 16  Then Wert= Wert *2:RuntimeError "2"
                  Point = Point + Wert
                  Wert=1
               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 *2 
                  If SpFe (x+1,y%+1) = Player Then Wert= Wert *2 
                  If SpFe (x+2,y%+2) = Player Then Wert= Wert *2 
                  If SpFe (x+3,y%+3) = Player Then Wert= Wert *2
                  If wert = 16  Then Wert= Wert *2:RuntimeError "3"
                  Point = Point + Wert
                  Wert=1
               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 *2 
                  If SpFe(x%+1, y%+2)  = Player Then Wert= Wert *2 
                  If SpFe(x%+2, y%+1)  = Player Then Wert= Wert *2 
                  If SpFe(x%+3, y%  )  = Player Then Wert= Wert *2
                  If wert = 16  Then Wert= Wert *2:RuntimeError "4"
                  Point = Point + Wert
                  Wert=1
               End If
            End If
         End If
      End If
   Next
   Next
   Return Point
End Function

Function CheckGewinn%(SteinSpalte%,SteinReihe%,Player%)
   Spalte =SteinSpalte%
   Reihe% =SteinReihe%
   ;Waagerecht
   For Spalte% = 0 To 3
      If SpFe (Spalte%,Reihe%) = Player% Then
         If SpFe (Spalte%+1,Reihe%) = Player% Then
            If SpFe (Spalte%+2,Reihe%) = Player% Then
               If SpFe (Spalte%+3,Reihe%) = Player% Then  Return 1
            End If
         End If
      End If
   Next
   Spalte =SteinSpalte%
   Reihe% =SteinReihe%
   ;senkrecht
   For Reihe% = 0 To 2
      If SpFe (Spalte%,Reihe%) = Player% Then
         If SpFe (Spalte%,Reihe%+1) = Player% Then
            If SpFe (Spalte%,Reihe%+2) = Player% Then
               If SpFe (Spalte%,Reihe%+3) = Player% Then  Return 1
            End If
         End If
      End If
   Next
   Spalte =SteinSpalte%
   Reihe% =SteinReihe%
   x=Spalte% : y=Reihe : 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 1
            EndIf
         EndIf
      EndIf
      y=y+1
   Next
   Spalte =SteinSpalte%
   Reihe% =SteinReihe%
   y1%=Spalte + Reihe
   If y1 < 3 Then Return
   If y1 > 5 Then x1 = y1-5 : y1=5
   For x1 = x1 To x1+2
      ;If x1+3>6 Or y1-3<0 Then Exit
      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 1
            End If
         End If
      End If
      y1=y1-1
   Next
   
End Function

Function ShowFieldPrint()

   Print"ShowField"
   For y = 5 To 0 Step -1
      For x = 0 To 6
         Write  SpFe (x%,y%)
      Next
      Print ""
   Next
   Print""
   For t= 0 To 6 Print Slot(t) Next
   Print""
End Function
[BB2D | BB3D | BB+]

ComNik

BeitragMo, Apr 20, 2009 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Schön! Very Happy
WIP: Vorx.Engine

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht Sonstiges Projekte

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group