[BB] 4Gewinnt - Wer kann es schlagen ?
Übersicht

KrümelBetreff: [BB] 4Gewinnt - Wer kann es schlagen ? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich hab mir den Code noch nicht angeguckt, aber ein kann ich sagen: Es ist nicht leicht, zu gewinnen ![]() Repekt, ist gut geworden ![]() |
||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@ 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... ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
Krümel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
Krümel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 ![]() |
||
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
Spikespine |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die KI ist gut - ich konnte sie allerdings auch besiegen. ![]() |
||
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group