[BB] 4Gewinnt - Wer kann es schlagen ?

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Krümel

Betreff: [BB] 4Gewinnt - Wer kann es schlagen ?

BeitragMo, Sep 18, 2006 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein 4Gewinnt für BlitzBasic.
Ursprünglich im BlitzMax Forum gepostet.

Code: [AUSKLAPPEN]

Global PCStrength=5000                          ;Anzahl der Testspiele für PC
Global WinCount=4                               ;Länge der Gewinnreihe
Global BoardWidth=7                             ;Felder Horizontal         
Global BoardHeight=6                            ;Felder Vertikal   
Global Size=50                                  ;Größe der Felder
Global CurrentPlayer
Global TEST=False
Global LastX,LastY                              ;zuletzt gespieltes Feld
Dim Board(BoardWidth,BoardHeight, 2)            ;das Spielfeld

Graphics BoardWidth*Size,(BoardHeight+1)*Size,16,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Type Line                                       ;zum Speichern der letzten Gewinnreihe
   Field x,y
End Type

Function newGame()
   CurrentPlayer=Rand(1,2)                     ;Spieler "auswürfeln"
   LastX=-1 : LastY=-1
   For yy=0 To BoardHeight-1
   For xx=0 To BoardWidth-1
      Board(xx,yy,0)=0                        ;Steine vom Spielfeld löschen         
   Next
   Next

   For l.Line=Each Line : Delete l : Next

   FlushKeys()
   Cls : Draw() : Flip
End Function

Function GameOver(Message$)
   Color 255,255,255
   Text GraphicsWidth()*0.5,10,Message, 1

   Draw()
   Color 0,0,0                                 ;Gewinnreihe anzeigen
   For l.Line=Each Line
      Oval l\x*Size+15,l\y*Size+Size+15,Size-30,Size-30
      Board(l\x,l\y, 0)=0
   Next
   Color 0,0,255 : Oval LastX*Size+15,LastY*Size+Size+15,Size-30,Size-30   
   Flip
   Repeat
      If MouseHit(1) Exit Else If KeyHit(1) End      
   Forever
   FlushKeys() : FlushMouse()
   newGame()
End Function


Function SetStone(x)
   full=True                                   ;Spielfeld voll?
   For xx=0 To BoardWidth-1
      If Board(xx,0,TEST)=0 full=False : Exit
   Next
   If full=True
      If TEST=0 GameOver("UNENTSCHIEDEN")   Else Return -2
   EndIf   

   For y=0 To BoardHeight-1                    ;Reihe voll?
      If Board(x,y,TEST)<>0 Exit
   Next
   If y=0 Return -1

   Board(x,y-1,TEST)=CurrentPlayer             ;Stein setzen
   Result=checkwin(x,y-1)                      ;Steine zählen
   LastX=x : LastY=y-1
   
   If TEST=False
      If Result>=WinCount                     ;Gewonnen?
         If CurrentPlayer=1 GameOver("ROT gewinnt") Else GameOver("GELB gewinnt")
      EndIf
   EndIf

   ;Spieler tauschen
   If CurrentPlayer=1 CurrentPlayer=2 Else CurrentPlayer=1

   Return Result
End Function

Function checkWin(x,y)                          ;Funktion zum zählen der zusammenhängenden Steine
   ;suche links-rechts:
   For l.Line=Each Line : Delete l : Next
   c=CountStones(x,y, -1, 0)+CountStones(x,y, 1, 0)-1 : If c>=WinCount Return c
   ;suche oben-unten:
   For l.Line=Each Line : Delete l : Next
   c=CountStones(x,y,  0,-1)+CountStones(x,y, 0, 1)-1 : If c>=WinCount Return c
   ;suche diagonal:
   For l.Line=Each Line : Delete l : Next
   c=CountStones(x,y, -1,-1)+CountStones(x,y, 1, 1)-1 : If c>=WinCount Return c
   For l.Line=Each Line : Delete l : Next
   c=CountStones(x,y, -1, 1)+CountStones(x,y, 1,-1)-1 : If c>=WinCount Return c
End Function
Function CountStones(x,y, dirX,dirY)
   Repeat
      Count=Count+1
      If TEST=0 l.Line=New Line : l\x=x : l\y=y
      x=x+dirX : y=y+dirY
      If x<0 Or x>BoardWidth-1 Or y<0 Or y>BoardHeight-1 Exit
      If Board(x,y, TEST)<>CurrentPlayer Exit
   Forever
   Return Count
End Function

Function CalculateMove(Computer)
   TEST=True                                   ;Testmodus anschalten

   For x=0 To BoardWidth-1                     ;der PC testet nacheinander alle Reihen durch
      wMax=0
      For t=1 To PCstrength                   ;Testspiele starten
         For yy=0 To BoardHeight-1           ;Spielfeld in Ausgangslage bringen
         For xx=0 To BoardWidth-1
            Board(xx,yy, TEST)=Board(xx,yy,0)   
         Next
         Next

         CurrentPlayer=Computer
         xx=x
         Repeat                              ;Zufällig Steine setzen bis Spiel
            Result=SetStone(xx)             ;gewonnen oder Spielfeld voll ist   
            xx=Rand(0,BoardWidth-1)
         Until (Result>=WinCount) Or (Result=-2)   

         If (CurrentPlayer<>Computer) And (Result>=WinCount) wMax=wMax+1 ;PC gewinnt - wMax um 1 erhoehen
      Next
      If wMax>WinMax WinMax=wMax : MaxX=x     ;hoechste Anzahl gewonnener Spiele (WinMax) + dazugehoerige Reihe (MaxX) merken
   Next

   TEST=False                                  ;Testmodus ausschalten

   CurrentPlayer=Computer                      ;Stein an Position mit
   Result=setStone(MaxX)                       ;maximaler Gewinnchance setzen
   
   If Result=-1                                ;Die gewählte Reihe ist voll
      For x=0 To BoardWidth-1                 ;suche nach freiem Feld               
         If Board(x,0, TEST)=0 SetStone(x) : Exit
      Next
   EndIf   
End Function

Function draw()
   Color 0,0,255                               ;Spielfeld zeichnen   
   Rect 0,size,BoardWidth*Size,BoardHeight*Size

   For y=0 To BoardHeight-1
   For x=0 To BoardWidth-1
      If Board(x,y, 0)=1 Color 255,0,0 Else If Board(x,y, 0)=2 Color 255,255,0 Else Color 0,0,0
      xx=x*Size : yy=y*Size
      Oval xx+4,yy+4+Size,Size-8,Size-8       ;Steine zeichen
   Next
   Next
   Color 0,0,255                               ;zuletzt gespielten Stein markieren
   Oval LastX*Size+15,LastY*Size+Size+15,Size-30,Size-30
End Function

newGame()

While Not KeyHit(1)
   If CurrentPlayer=1
      If MouseHit(1) Or KeyHit(57) SetStone(Int(MouseX()/size))
   Else
      CalculateMove(2)
      FlushKeys()
   EndIf   

   draw : Flip
Wend
  • Zuletzt bearbeitet von Krümel am Mo, Sep 18, 2006 22:28, insgesamt einmal bearbeitet
 

Mr Hopp

BeitragMo, Sep 18, 2006 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir den Code noch nicht angeguckt, aber ein kann ich sagen: Es ist nicht leicht, zu gewinnen Very Happy Ich bemerke zwar schon ein Handlungsmuster, konnte allerdings noch nicht siegen.

Repekt, ist gut geworden Wink

SpionAtom

BeitragMo, Sep 18, 2006 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habs geschaft!

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

Aber es entschied sich erst am Ende, als nur noch 2 Spalten übrig waren und die KI gezwungen wurde ihren Todeszug zu setzen..
Aber gefällt mir, hab 3-4 Versuche gebraucht. Und einmal hat die KI sogar eine Zwickmühle gebaut. Cool
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Blitzcoder

Newsposter

BeitragMo, Sep 18, 2006 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versuche es auch die ganze zeit vergeblich. ist echt gut


EDIT: Juhuu, ich hab es geschafft 2x3er auf einmal zu bauen, und somit konnte er es nicht mehr vereiteln. ist allerdings abgestürtzt, bevor er meinen Sieg verkündet har Shocked
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)
 

Krümel

BeitragMo, Sep 18, 2006 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Blitzcoder:
Zitat:

EDIT: Juhuu, ich hab es geschafft 2x3er auf einmal zu bauen, und somit konnte er es nicht mehr vereiteln. ist allerdings abgestürtzt, bevor er meinen Sieg verkündet har


Also die Abstürzerei macht mir Kopfzerbrechen... Mad
Ich spiele schon seit Tagen aber abgestürzt ist es bisher noch nie.

Versuch doch mal mit eingeschaltetem Debugmode zu spielen und sag mir anschliessend ob du so den Fehler ausfindig machen konntest.

StepTiger

BeitragMo, Sep 18, 2006 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
habs auch schon 2 mal geschafft. Jedoch:
ein kleiner Bug:
wenn die KI 2 in einer Reihe hat, und man selbst 3, dann baut die KI ihr zweiertürmchen in ein dreiertürmchen aus, statt die gnadenlose niederlage zu vermeiden
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
 

Krümel

BeitragMo, Sep 18, 2006 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, bei der KI ist noch Handlungsbedarf ...

Die beruht übrigens auf einem sehr simplen Prinzip:
Der PC setzt Reihe für Reihe seinen Stein, danach folgen eine ganze Menge Testspiele nach reinem Zufall. Der PC merkt sich einfach wie oft er auf dem jeweiligen anfangs gesetzten Feld gewinnt und setzt seinen Stein am Ende auf das Feld mit der höchsten Gewinnanzahl.
Ich dachte ich hab mir das selbst ausgedacht, das gibts allerdings schon und heisst Monte-Carlo-Simulation.

StepTiger

BeitragMo, Sep 18, 2006 23:27
Antworten mit Zitat
Benutzer-Profile anzeigen
zur KI

speicher mal am anfang jeden durchgangs die millisekunden und lass es dann jedes mal pro neuer Durchgang neu berechnen um den Vorgang repräsentativ und zufälliger und nicht irgendwie laufen zu lassen
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
 

Krümel

BeitragMo, Sep 18, 2006 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
@StepTiger:
Das hab ich jetzt leider nicht vertanden.
Was mache ich mit dem Millisekunden wert?
welcher Vorgang läuft Deiner Meinung nach "irgendwie" und ist nicht representativ wofür?
Sorry, aber es ist schon spät, du musst meine Blödheit entschuldigen Rolling Eyes

StepTiger

BeitragDi, Sep 19, 2006 0:22
Antworten mit Zitat
Benutzer-Profile anzeigen
ach quark! So war des nicht gemeint!

Ich mein das so:

du speicherst bei jedem Vorgang (for x=1 to intelligenz oder wie das hieß) die Millisecs von jetzt. Kannst es also mit seedrnd vor jedem Vorgang nochmals anders berechnen lassen. Hab das im Code mal gemacht und erhielt ganz gute Resultate (intelligentere)
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Spikespine

BeitragDi, Sep 19, 2006 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Die KI ist gut - ich konnte sie allerdings auch besiegen. Smile
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group