BCC#25 (Künstliche Intelligenz)

Übersicht Sonstiges Projekte

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

Neue Antwort erstellen

Firstdeathmaker

BeitragSo, März 29, 2009 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab garnix verbessert. Ich hab nur deinen Code in eine Datei gepastet und die anderen Files dazugepackt. Lag vielleicht am fehlenden Initialisieren von Graphics, das bei BB3D nicht nötig ist.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

ComNik

BeitragMo, März 30, 2009 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
So meine Ki ist immer noch nicht ganz fertig, baut aber geschickter auf...
Ich hab übrigens nichts dagegen, den Wettbewerb später enden zu lassen. Mir egal.

Die neuen Ergebnisse:
KI: Schwester 12:0
KI: Schimpansenhirn 14:16
KI: FDM's KI 3:17 Embarassed

Aber einige wichtige Dinge sind noch nicht drinne...

MFG ComNik

@FDM: Achso dann hab ich das mit dem verbessern falsch verstanden. Kann es sein dass die Ki's im Netzwerktool immer die gleichen Spiele spielen? Weil wenn ich zweimal hintereinander ausführe, hab ich immer die gleichen Ergebnisse...
Aber sonst SUPER!
WIP: Vorx.Engine

Firstdeathmaker

BeitragDi, März 31, 2009 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht ein fehlendes Seedrnd? Meine KI handelt bisher jedenfalls nicht aus Zufall.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

ComNik

BeitragDi, März 31, 2009 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
War nur ne vermutung...

Übrigens: In der Version die du gepostet hast(von deiner ki mein ich) gibts einen(oder mehrere xD) Bug.
Ich denke mal der is schon weg, aber man kann ja nie wissen. Rolling Eyes

Also wenn du ein neues Spiel startest und dann immer auf "Pc Spielt" klickst, immre wieder. Dann kommt am Schluss die Fehlermeldung : "Die von deiner Funktion zurückgegebene Spalte usw..."

Wie gesagt, nur ein Tipp.
MFG
ComNik
WIP: Vorx.Engine

Firstdeathmaker

BeitragDi, März 31, 2009 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop, den Bug kenne ich schon. Hab aber gerade keine Zeit daran weiter zu machen Sad
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

BlitzMoritz

BeitragMi, Apr 01, 2009 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Da sich keiner über den Vorschlag beschwert hat, verlängere ich hiermit offiziell die Dauer des Contests um eine knappe Woche bis zum Sonntag, den 19.April, um 06.00 Uhr in der Frühe. Also habt ihr ab jetzt noch knapp drei Wochen Zeit.
Wenn ich's richtig verstanden habe, gibt es derzeit drei Teilnehmer. Das ist schön. Am Anfang hatte aber noch eine Reihe anderer User Interesse gezeigt - wäre toll, wenn die sich auch noch zu einem Beitrag durchringen könnten. Ich selbst darf ja nicht teilnehmen! Aber wer weiß? Vielleicht schicke ich trotzdem aus reiner Bosheit auch noch 'was ins Rennen, hehehe Twisted Evil

ComNik

BeitragMi, Apr 01, 2009 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Verdammt, jeh mehr leute dabei sind desto blöder siehts aus, aufm letzten platz zu sein Crying or Very sad

Von coolo hab ich gehört dass er auch mitmachen will *GERÜCHTEVERBREIT*

MFG
ComNIk
WIP: Vorx.Engine

AnniXa

BeitragDo, Apr 02, 2009 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
mach dir keine sorge, ich werde schon den letzten platz einnehmen Wink

ComNik

BeitragDo, Apr 02, 2009 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Very Happy wir werden sehen

Meine spielt im moment:
gegen Schimpansenhirn: 13:7
gegen FDM(Iterationstiefe: 3) : 18:2
gegen FDM(Iterationstiefe: 4) : 4:16

Aber es ist ja nich so das Schimpansenhirn und FDM auch nicht besser geworden sind Wink
Ich hab bald den Punkt erreicht, an dem ich nichts mehr verbessern kann.(programmierkenntnisse Embarassed )

Naja viel Spass noch!

ComNIk
WIP: Vorx.Engine

TimBo

BeitragDo, Apr 02, 2009 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich mache auch mit , programmiere schon seid einigen Tagen mehr oder weniger an meiner KI rum , aber nicht um am Wettbewerb zu gewinnen , sondern mehr so just 4 fun .

Ich hatte , als ich angefangen haben , beim BCC 16 ne KI geschreiben , die als "Hauptschule" galt , diesen ruf muss ich wegbekommen . Wie hat diese "KI" gearbeitet ? Sie hat nach gewonnen oder verloren gesucht und den rest "mehr oder weniger" nach dem Zufall entschieden , das war nicht sehr effektiv.

Wie die jetzige arbeitet werde ich sagen , wenn ich sie onlinestelle , bis jetzt allerdings noch ohne jeden Zufall , es wird mathematisch und Algorithmisch der beste Zug ermittelt .

Ich programmiere nur noch den letzten Schliff , damit er auf grobe Fallen nicht mehr reinfällt , dann wäre sie schon stark genug um mich zu besiegen Rolling Eyes

Stärker muss sie dann für mich nicht sein .

Viele Grüße
TimBo

Edit:

meine Statistiken :
AniniXa vs TimBo Soldier : 18 - 78 Shocked
FirstdeahtMatcher vs TimBo Soldier ; 10 : 0 Embarassed das war wohl nichts

Ich werde dann doch erst morgen am feinschliff weiter machen

noch ein Edit:
das 10:0 wird morgen wohl nicht mehr sein , unsere KIS machen immer (mehr oder weniger) das selbe , was taktisch unklug von meiner ist , da sie immer darauf reinfallen wird Rolling Eyes

noch ein Edit:
habe gerade 40:0 gegen FDM gewonnen .
Ich weiß selber nicht wie das möglich war , habe die Suchtiefe von 2 auf 4 erhöht und mal spielen lassen.
Wahrscheinlich fällt meine KI deshalb nicht mehr auf deine Tricks rein Very Happy


ich geh pennen [Link wurde ersetzt]
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.
  • Zuletzt bearbeitet von TimBo am Mo, Apr 06, 2009 22:44, insgesamt einmal bearbeitet

ComNik

BeitragFr, Apr 03, 2009 12:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Find ich gut, dass noch jemand mitmacht!
Meine spielt gegen den TimBo Soldier: 10:10

Ich befürchte dass ich hier bald untergehe Confused
MFG
ComNik
WIP: Vorx.Engine

Silver_Knee

BeitragFr, Apr 03, 2009 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
bei mir hat timbo-soldier vs timbo-soldier 21:19 gespielt Wink

TimBo

BeitragSa, Apr 04, 2009 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hii,

alsoo meine jetzige KI (ich habe nur eine Sache geänder)
spielt gegen die alte hochgeladene
63:37

also ich habe sie verbessert , ich weiß nicht ob es sinn macht DIE ultimative KI zu schreiben (also so gut wie es geht) aber das habe ich mir als zeil genommen , da ich eh nicht sehen kann , wie der user den Schwierigkeitsgrad einstellen kann .

Viele Grüße
TimBo

Achja , ich möchte mit keiner KI i.jemand "rausschmeißen" ich finde das thema so interressant , das ich mir doch etwas mühe gebe ^^
@ ComNik , ich bin mal gespannt , ob deine KI am Ende doch noch meine KI boxen wird ;D
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

BeitragMo, Apr 06, 2009 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich progge erst seit ein paar wochen...
ich denke das deine meine auf jeden fall schlägt.
Na ja wir werden sehen.

Bin im Urlaub hab deswegen noch nicht weiter gemacht. Aber bald Wink
WIP: Vorx.Engine

Firstdeathmaker

BeitragMo, Apr 06, 2009 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab den Netzwerkclient auch mal für BMX geschrieben, ist aber vielleicht noch etwas buggy:

Code: [AUSKLAPPEN]
SuperStrict


Import vertex.bnetex
Include "BesteSpalte().bmx"
Graphics 400, 300

Const wx:Int = 7
Const wy:Int = 6
Global Feld:Byte[wx,wy]
Global Farbe:Byte
Global progEnd:Byte = False

Global Game_Max:Int = 10 'Wie viele Spiele Maximal gespielt werden sollen

Global NET_portC:Byte = 2
Global NET_ports:Int[NET_portC , 2]
Global NET_otherIp:Int
Global NET_otherPort:Int

Global MessageIp:Int 'last Message IP

Global Timeout% = 15000
Global LastIncome:Int
Global SEARCH_pollIntervall:Int = 10000 'ms Until Next poll
Global SEARCH_nextPoll:Int


'Init
Net_ports[0 , 0] = 4000
Net_ports[0 , 1] = 4001
Net_ports[1 , 0] = 5000
NET_ports[1, 1] = 5001

Global rIp:Int 'remote Ip

Global iStream:TUDPStream
Global oStream:TUDPStream

Global NET_adapter:TAdapterInfo


Global Game_State% '0 = search, 1 = init game,  2=ich Bin dran, 3=anderer ist dran
Const STATE_SEARCH% = 1
Const STATE_INIT% = 2
Const STATE_MYTURN% = 3
Const STATE_OTHERTURN% = 4
Const STATE_END% = 5


Global Game_MyColor% 'Meine Farbe
Global Game_Host% 'host hat immer recht
Global Game_Round% 'Spielrunde (1 Spiel geht über mehrere Runden)
Global Game_TotalRound%
Global Game_Count% 'Spielzähler, wie viele Spiele insgesamt gespielt wurden

'Statistik
Const STAT_Savefile$ = "statistik.txt"
Global STAT_Gewonnen%
Global STAT_Verloren%
Global STAT_Remis%
Global STAT_Gespielt%
Global STAT_FunctionTime%


'Message Bytes
Const MSG_GameOpen% = 1
Const MSG_JoinGame% = 2
Const MSG_SetColor% = 3
Const MSG_StartGame% = 4
Const MSG_InsertCoin% = 5


InitNetwork()
PROCESS_SetState(STATE_SEARCH)
'Runtime
While Not progEnd
   Delay 10
   PROCESS_MAIN()
Wend

'Final
STAT_Save()
CloseNetwork()
End


Function InitNetwork()
   TNetwork.GetAdapterInfo(NET_adapter)
   iStream:TUDPStream = New TUDPStream
   oStream:TUDPStream = New TUDPStream
   
   iStream.Init()
   oStream.Init()
   
   If NET_otherIp = 0 NET_otherIp = NET_adapter.Address
   
   Local OK:Byte
   Local c:Byte = 0
   Repeat
      OK = iStream.SetLocalPort(NET_ports[c, 0])
      oStream.SetLocalPort(Net_ports[c , 1])
      If ok = False
         Net_otherPort = Net_ports[c , 0]
      Else
         NET_otherPort = NET_ports[c + 1, 0]
      EndIf
      c:+ 1
   Until c = NET_portC Or OK
   
   Print TNetwork.StringIP(NET_otherIp)
   
   rIp = NET_otherIp
   oStream.SetRemoteIp(NET_otherIp)
   oStream.SetRemotePort(NET_otherPort)
   
   Print "Status:"
   Print "ownIp: " + DottedIP(iStream.GetLocalIP())
   Print "ownPort: " + iStream.GetLocalPort()
   Print "remote Ip: " + DottedIP(rIp)
   Print "remote Ip2: " + DottedIP(oStream.GetRemoteIP())
   Print "remotePort: " + oStream.GetRemotePort()
End Function

Function CloseNetwork()
   If iStream CloseStream iStream
   If oStream CloseStream oStream
End Function

Function NET_Send()
   oStream.SendMsg()
   LastIncome = MilliSecs()
End Function

Function MSG_Process()
   If iStream.RecvAvail()
      iStream.RecvMsg()
      MessageIp = iStream.GetMsgIP()
      Select ReadByte(iStream)
         Case MSG_GameOpen Recv_GameOpen()
         Case MSG_JoinGame Recv_JoinGame()
         Case MSG_SetColor Recv_SetColor()
         Case MSG_StartGame Recv_StartGame()
         Case MSG_InsertCoin Recv_InsertCoin()
      End Select      
   EndIf
End Function


'Game Open
Function Send_GameOpen()
   WriteByte oStream,MSG_GameOpen
   NET_Send()
End Function

Function Recv_GameOpen()
   If Game_State <> STATE_SEARCH Return
   If MessageIP <> rIp Return
   Game_Host = 0
   PROCESS_SetState(STATE_INIT)
   Send_JoinGame()
End Function

'Join Game
Function Send_JoinGame()
   DebugLog "SendJoinGame"
   WriteByte oStream,MSG_JoinGame
   NET_Send()
End Function

Function Recv_JoinGame()
   DebugLog "RecvJoinGame"
   If Game_State <> STATE_SEARCH Return
   If MessageIP <> rIp Return
   Game_Host = 1
   PROCESS_SetState(STATE_INIT)
End Function

'Set Color
Function Send_SetColor(player%)
   DebugLog "SendSetColor"
   WriteByte oStream,MSG_SetColor
   WriteByte oStream,player
   NET_Send()
End Function

Function Recv_SetColor()
   DebugLog "RecvSetColor"
   If Game_State <> STATE_INIT Return
   If MessageIP <> rIp Return
   If Game_Host Return
   Game_MyColor = ReadByte(iStream)
   DebugLog "MyColor: "+GAME_MyColor
End Function

'Start Game
Function Send_StartGame()
   DebugLog "SendStartGame"
   WriteByte oStream,MSG_StartGame
   NET_Send()
   If Farbe = GAME_MyColor
      PROCESS_SetState(STATE_MYTURN)
   Else
      PROCESS_SetState(STATE_OTHERTURN)
   EndIf
End Function

Function Recv_StartGame()
   DebugLog "RecvStartGame"
   If Game_State <> STATE_INIT Return
   If MessageIP <> rIp Return
   If Farbe = GAME_MyColor
      PROCESS_SetState(STATE_MYTURN)
   Else
      PROCESS_SetState(STATE_OTHERTURN)
   EndIf
End Function

'Insert Coin
Function Send_InsertCoin(column%)
   DebugLog "SendInsertCoin: "+column
   WriteByte oStream,MSG_InsertCoin
   WriteByte oStream,column
   NET_SEND
End Function

Function Recv_InsertCoin()
   DebugLog "RecvInsertCoin"
   If Game_State <> STATE_OTHERTURN Return
   If MessageIP <> rIp Return
   Local column% = ReadByte(iStream)
   Game_InsertCoin(column,FARBE)
   Game_Step()
End Function


Function PROCESS_SetState(state%)
   If Game_State = STATE_END Return
   Game_State = state
   Select Game_State
      Case STATE_SEARCH PROCESS_SEARCH_INIT()
      Case STATE_INIT PROCESS_INIT_INIT()
      Case STATE_MYTURN PROCESS_MYTURN_INIT()
      Case STATE_OTHERTURN PROCESS_OTHERTURN_INIT()
      Case STATE_END PROCESS_END_INIT()
   End Select
End Function

Function PROCESS_MAIN()
   MSG_PROCESS()
   
   If MilliSecs() - LastIncome > Timeout And LastIncome<>0
      DebugLog "Timeout, reset to Searchstate"
      PROCESS_SetState(STATE_SEARCH)
      LastIncome = MilliSecs()
   EndIf
   
   Select Game_State
      Case STATE_SEARCH PROCESS_SEARCH()
      Case STATE_INIT PROCESS_INIT()
      Case STATE_MYTURN PROCESS_MYTURN()
      Case STATE_OTHERTURN PROCESS_OTHERTURN()
      Case STATE_END PROCESS_END()
   End Select
End Function

Function PROCESS_SEARCH_INIT()
   DebugLog "init search"
End Function

Function PROCESS_SEARCH()
   If SEARCH_nextPoll < MilliSecs()
      DebugLog "poll"
      SEARCH_nextPoll = MilliSecs() + SEARCH_pollIntervall
      Send_GameOpen()
   EndIf
   
   Cls
      DrawText "Searching...", 10, 10
   Flip
End Function

Function PROCESS_INIT_INIT()
   DebugLog "init init"
   Game_Init()
   
   If Game_Max <= Game_Count
      PROCESS_SetState(STATE_END)
   ElseIf Game_Host
      GAME_MyColor = Rand(1,2)
      DebugLog "MyColor: "+GAME_MyColor
      Send_SetColor((GAME_MyColor Mod 2) + 1)
      Send_StartGame()
   EndIf
End Function

Function PROCESS_INIT()
End Function

Function PROCESS_MYTURN_INIT()
   DebugLog "init myturn"
   
   Local time% = MilliSecs()
   Local spalte% = BesteSpalte()
   STAT_FunctionTime = STAT_FunctionTime + (MilliSecs()-time)
   Game_InsertCoin(spalte,GAME_MyColor)
   Send_InsertCoin(spalte)
   Game_Step()
End Function

Function PROCESS_MYTURN()
   BASIC_SHOW()
End Function

Function PROCESS_OTHERTURN_INIT()
   DebugLog "init otherturn"
End Function

Function PROCESS_OTHERTURN()
   BASIC_SHOW()
End Function

Function PROCESS_END_INIT()
End Function

Function PROCESS_END()
   BASIC_SHOW()
   Local key:Int = GetChar()
   If key<>0 progEnd = True
End Function


'Game Stuff
'GAMECODE
Function Game_Init()
   Local x%, y%

   Game_Round = 0
   Farbe = 1
   
   'Spielfeld säubern
   For x = 0 Until wx
   For y = 0 Until wy
      Feld[x,y] = 0
   Next
   Next
End Function

'Inserts a coin, returns False If column is full, otherwise True
Function Game_InsertCoin%(column%,player%)
   Local y%
   
   For y = 0 Until wy
      If Feld[column,y] = 0
         Feld[column,y] = player
         Return 1
      EndIf
   Next
   Return 0
End Function

Function Game_Step()
   Local win% = GAME_CheckWin()
   If win
      If win=GAME_MyColor
         STAT_Update(1)
      ElseIf win=3
         STAT_Update(3)
      Else
         STAT_Update(2)
      EndIf
      Game_Count = Game_Count + 1
      PROCESS_SetState(STATE_INIT)
      Return
   EndIf
   Game_ToggleTurn()
End Function

Function Game_ToggleTurn()
   Game_Round = Game_Round + 1
   Game_TotalRound = Game_TotalRound + 1
   FARBE = (FARBE Mod 2) + 1
   
   
   If FARBE = GAME_MyColor
      PROCESS_SetState(STATE_MYTURN)
   Else
      PROCESS_SetState(STATE_OTHERTURN)
   EndIf
End Function

'Importierte Funktion aus dem Hauptprogramm
Function GAME_CheckWin:Byte()
   'gibt 0 zur�ck, falls das Spiel noch nicht zu Ende ist.
   'gibt 1 zur�ck, wenn Rot gewonnen hat, und 2 zur�ck, wenn Gelb gewonnen hat
   'gibt 3 zur�ck, wenn keiner gewonnen hat, das Spielbrett aber voll ist: Remis!
   Local Reihe:Int, Spalte:Int, ObereSumme:Int
   'Waagerechte Viererreihen:
   For Spalte = 0 To 3
      For Reihe = 0 To 5
            If Feld[Spalte, Reihe] > 0 And Feld[Spalte+1, Reihe] = Feld[Spalte, Reihe] And Feld[Spalte+2, Reihe] = Feld[Spalte, Reihe] And Feld[Spalte+3, Reihe] = Feld[Spalte, Reihe] Then Return Feld[Spalte, Reihe]
      Next
   Next
   'Senkrechte Viererreihen:
   For Spalte = 0 To 6
      For Reihe = 0 To 2
         If Feld[Spalte, Reihe] > 0 And Feld[Spalte, Reihe+1] = Feld[Spalte, Reihe] And Feld[Spalte, Reihe+2] = Feld[Spalte, Reihe] And Feld[Spalte, Reihe+3] = Feld[Spalte, Reihe] Then Return Feld[Spalte, Reihe]
      Next
      ObereSumme = ObereSumme + (Feld[Spalte, 5]+1)/2
   Next
   'Diagonale Viererreihen (zwei M�glichkeiten):
   For Spalte = 0 To 3
      For Reihe = 0 To 2
         If Feld[Spalte, Reihe] > 0 And Feld[Spalte, Reihe] = Feld[Spalte+1, Reihe+1] And Feld[Spalte, Reihe] = Feld[Spalte+2, Reihe+2] And Feld[Spalte, Reihe] = Feld[Spalte+3, Reihe+3] Then Return Feld[Spalte, Reihe]
         If Feld[Spalte, Reihe+3] > 0 And Feld[Spalte, Reihe+3] = Feld[Spalte+1, Reihe+2] And Feld[Spalte, Reihe+3] = Feld[Spalte+2, Reihe+1] And Feld[Spalte, Reihe+3] = Feld[Spalte+3, Reihe] Then Return Feld[Spalte, Reihe+3]
      Next
   Next
   'Remis?
   If ObereSumme = 7 Then Return 3
   'Ansonsten gar nichts:
   Return 0
End Function

Function GAME_Show(ox%=0,oy%=0)
   Local x%,y%
   Local fw% = 10, fh% = 12
   
   For x = 0 Until wx
   For y = 0 Until wy
      Local px:Int = x * fw + ox
      Local py:Int = (wy - y) * fh + oy
      
      Select Feld[x, y]
         Case 0
            DrawText Feld[x, y], px, py
         Case 1
            DrawText Feld[x, y], px, py
         Case 2
            DrawText Feld[x, y], px, py
      End Select
   
   Next
   Next
   DrawText "Runde: " + Game_Round, ox, oy + (wy + 1) * fh
End Function

'STATISTIK

'Update die Statistik
'sieg: 0 = remis, 1=gewonnen, 2=verloren
Function STAT_Update(sieg%)
   If sieg = 0
      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

Function STAT_Save()
   Local file:TStream = WriteFile(Game_Host + STAT_Savefile)
   WriteLine file,"Gespielt: "+STAT_Gespielt+"/"+Game_Max
   WriteLine file,"Davon Gewonnen: "+STAT_Gewonnen
   WriteLine file,"Davon Verloren: "+STAT_Verloren
   WriteLine file,"Davon Remis   : "+STAT_Remis
   WriteLine file,"BesteSpalte() Zeit: "+(Float(STAT_FunctionTime*2)  / Game_TotalRound)
   CloseFile(file)
End Function

Function STAT_Show(x% = 10,y% = 10)
   DrawText "Gespielt: " + STAT_Gespielt + "/" + Game_Max + " Host: " + Game_Host, x, y;y = y + 20
   DrawText "Davon Gewonnen: " + STAT_Gewonnen, x, y;y = y + 20
   DrawText "Davon Verloren: " + STAT_Verloren, x, y;y = y + 20
   DrawText "Davon Remis   : " + STAT_Remis, x, y;y = y + 20
   DrawText "BesteSpalte() Zeit: " + (Float(STAT_FunctionTime * 2) / Game_TotalRound), x, y;y = y + 20
End Function

Function BASIC_SHOW()
   Cls
   STAT_SHow(10,10)
   GAME_Show(10,110)
   Flip
End Function
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

TimBo

BeitragMo, Apr 06, 2009 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
@ ComNik
als ich angefangen habe , da habe ich für den BCC #15 ein 4-Gewinnt Game geschrieben, und die war echt Hauptschule ! ^^

Die war 80% aus Rand zusammengebaut . D.h. n Affe hätte Chancen gehabt .

Ich finde dagegen , dass deine KI einen fetten Respekt verdient !! Wink

Viele Grüße
TimBo

Ich habe mal eben die neue KI hochgeladen:
https://www.blitzforum.de/upload/file.php?id=5235

wäre nett, wenn ihr eure Ergebnise mal Posten könntet, müsst ihr aber nicht !
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

BeitragDo, Apr 09, 2009 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für das Lob,
wie schon gesagt bin im Urlaub und deswegen nicht ganz so oft online.

Ich hab gestern etwas ausprobiert, um (ohne Minimax oder so) zu testen ob die entscheidung der ki, in zwei oder drei zügen später auswirkungen hat. Umständlich ausgedrückt...

Nun ja ich war nicht 100% erfolgreich und bin mir ziemlich sicher dass der Ansatz dämlich und umständlich ist. Ich poste ihn aber trotzdem:

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...
Dim vFeld%(6,5) ; "Virtuelles" Feld, zum vorberechnen von Zügen
;--------------------------------------
Function BesteSpalte%()
;--------------------------------------
 
 For versuch = 0 To 5000               ;Sieht unnötig aus! Ist aber ziemlich nützlich. 5000 mal ist immer besser als 1 mal ;-)

   SeedRnd MilliSecs()                 ;Schöne Zufallszahlen... Sollten welche gebraucht werden.

   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... (wusste wahrscheinlich sowieso schon jeder außer mir -.-)
 
   ziel = ki_sieg()                    ;ziel wird am ende zurückgegeben! ki_sieg() ist die erste Funktion, mit blödem Namen

   If ziel <= 6 And ziel >= 0 Then     ; wenn ziel innerhalb vom feld -.-
    If Feld%(ziel,5) = 0 Then          ; wenn ziel spalte noch nicht voll ist dann...

   For XX = 0 To 6                     ;Einmal durchs "Virtuelle" Feld
    For YY = 0 To 5                    ; "        "       "        "
     vFeld%(XX,YY) = Feld%(XX,YY)      ; Daten übertragen von Feld%() auf vFeld%()
    Next
   Next

 For tiefe = 0 To 10

     For yy = 0 To 5                   
       If vFeld%(ziel,yy) = 0 Then vFeld%(ziel,yy) = farbe%  ;Ziel im vFeld% einsetzen
     Next

     mSieg = TesteMeinSieg()                ; gucken ob ich gewinnen würde
    If mSieg = 1 Then Goto ende     ; wenn ja, dann goto(omg! GOTO benutzt) .end

     gSieg = TesteGegnerSieg()       ; Testen ob der Gegner gewinnen würde
    If gSieg = 0 Then Goto ende      ; wenn NEIN, dann zum Ende
   
    eintragen()                  ;Sollte der Gegner nun doch gewinnen oder ich doch verlieren.

 Next

    End If
   End If       

  .ende
  If ziel <= 6 And Feld%(ziel,5) = 0 Then
   Return ziel     
  End If

  Next
;--------------------------------------
End Function
;--------------------------------------

Function eintragen()                  ; Ziel wird ins "virtuelle" Feld eingetragen. Und das prozedere beginnt von vorn.
   For y = 0 To 5
    If vFeld%(ziel,y) = 0 Then
     vFeld%(ziel,y) = farbe%
    Return
    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
             
          ;//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...

           ;//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 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

;----------------------------------------------------------------------

Function TesteGegnerSieg()

  Local Reihe%, Spalte%

  For Spalte = 0 To 6
   For Reihe = 0 To 5

   ;Waagerechte Viererreihen:
     If Spalte + 3 <= 6 Then
      If vFeld%(Spalte, Reihe) = gegner% And vFeld%(Spalte+1, Reihe) = gegner% And vFeld%(Spalte+2, Reihe) = gegner% And vFeld%(Spalte+3, Reihe) = gegner% Then Return 1
     End If
       
   ;Senkrechte Viererreihen:
     If Reihe + 3 <= 5 Then
      If vFeld%(Spalte, Reihe) = gegner% And vFeld%(Spalte, Reihe+1) = gegner% And vFeld(Spalte, Reihe+2) = gegner% And vFeld%(Spalte, Reihe+3) = gegner% Then Return 1
     End If
   
   ;Diagonale Viererreihen (zwei Möglichkeiten):
        If Spalte - 3 >= 0 And Reihe + 3 <= 5 Then   
         If vFeld%(Spalte, Reihe) = gegner% And vFeld%(Spalte-1, Reihe+1) = gegner% And vFeld%(Spalte-2, Reihe+2) = gegner% And vFeld%(Spalte-3, Reihe+3) = gegner%  Then Return 1
      End If
      If Spalte + 3 <= 6 And Reihe + 3 <= 5 Then     
          If vFeld%(Spalte, Reihe) = gegner% And vFeld%(Spalte+1, Reihe+1) = gegner% And vFeld%(Spalte+2, Reihe+2) = gegner% And vFeld%(Spalte+3, Reihe+3) = gegner% Then Return 1
      End If
   
   Next
   Next

   ;Ansonsten gar nichts:
   Return 0

End Function

;-------------------------------------------------------------------------

Function TesteMeinSieg()

 Local Reihe%, Spalte%
 
   For Spalte = 0 To 6
    For Reihe = 0 To 5

   ;Waagerechte Viererreihen
    If Spalte + 3 <= 6 Then
      If vFeld%(Spalte, Reihe) = farbe% And vFeld%(Spalte+1, Reihe) = farbe% And vFeld%(Spalte+2, Reihe) = farbe% And vFeld%(Spalte+3, Reihe) = farbe% Then Return 1
     End If

     ;Senkrechte Viererreihen:
     If Reihe + 3 <= 5 Then    
       If vFeld%(Spalte, Reihe) = farbe% And vFeld%(Spalte, Reihe+1) = farbe% And vFeld%(Spalte, Reihe+2) = farbe% And vFeld%(Spalte, Reihe+3) = farbe% Then Return 1
     End If     

    ;Diagonale Viererreihen (zwei Möglichkeiten):
   If Spalte + 3 <= 6 And Reihe + 3 <= 5 Then
         If vFeld%(Spalte, Reihe) = farbe% And vFeld%(Spalte+1, Reihe+1) = farbe% And vFeld%(Spalte+2, Reihe+2) = farbe% And vFeld%(Spalte+3, Reihe+3) = farbe% Then Return 1
   End If
   
   If Spalte - 3 >= 0 And Reihe + 3 <= 5 Then       
           If vFeld%(Spalte, Reihe) = farbe% And vFeld%(Spalte-1, Reihe+1) = farbe% And vFeld%(Spalte-2, Reihe+2) = farbe% And vFeld%(Spalte-3, Reihe+3) = farbe% Then Return 1
   End If 
            
   Next
   Next

   ;Ansonsten gar nichts:
   Return 0

End Function
     


Exclamation WIE GESAGT DAS IST NICHT MEINE WETTBEWERBS KI!

Achso noch ein paar Ergebnisse:
Meine KI(nicht die gepostete) gegen AnniXas Ki : 16:4

Meine Ki( " " " ) gegen TimBo's neue: 4:16 Rolling Eyes

Meine gepostete Ki gegen TimBo's neue: 6:14

Ich denke ich bin an dem Punkt wo ich mit meinem können nichts mehr verbessern kann.

MFG
ComNIk
WIP: Vorx.Engine

TimBo

BeitragSa, Apr 11, 2009 12:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich könnte an meine KI noch rumspielen habe aber ehrlich gesagt keine Lust mehr . ^^

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.

Viele Grüße
TimBo

Edit: ich werde einen Knopf noch Coden wo man einstellen kann : schwer ; leicht ; mittel oder sowas
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

BeitragSo, Apr 12, 2009 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, Frohe Ostern!

nachdem ich nur am BCC#1 teilgenommen habe und jetzt schon der BCC#25 läuft, habe ich heute morgen auch mal was geschrieben, ist zwar nicht perfekt aber für mich schon schwierig zu gewinnen!

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("Vier-gewinnt-Gegner: Rallimen")
;--------------------------------------
Dim SpFe%(6,5)
Dim Schacht% (6)
Global Maxtiefe% = 5
Global AnzRekursiv%
Function BesteSpalte%()
Time =MilliSecs ()
SeedRnd (MilliSecs())
   ;Array kopieren
   AnzRekursiv%=0
   time = MilliSecs ()
   Local x%,y%,Tiefe%,Spalte%
   For x% = 0 To 6
      For y% = 0 To 5
         SpFe (x%,y%) = Feld (x%,y%)
      Next
   Next
   ;--------------------------------------
   For Spalte%= 0 To 6
      Schacht% (Spalte%) = Rekursiv(Spalte%,Tiefe%,Farbe,1)
   Next
   time = MilliSecs () -time
   ;Print  time
   Return Schachtauswaehlen()
End Function

Function Schachtauswaehlen%()
   ;Print AnzRekursiv%
    ;Mitte bevorzugen
   Schacht(1)=Schacht(1)+Rand (1)
   Schacht(2)=Schacht(2)+Rand (2)
   Schacht(3)=Schacht(3)+Rand (3)
   Schacht(4)=Schacht(4)+Rand (2)
   Schacht(5)=Schacht(5)+Rand (1)

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


Function Rekursiv%(Spalte%,Tiefe%,Player,PosNeg)
   ;
   AnzRekursiv%=AnzRekursiv%+1
   For Reihe% = 0 To 5
      If SpFe (Spalte%,Reihe%) = 0 Then
         SpFe (Spalte%,Reihe%) = Player
         SteinSpalte% = Spalte%
         SteinReihe% = Reihe%
         Steingesetzt = True
         If CheckGewinn(SteinSpalte%,SteinReihe%,Player%) = True Then
         ;::::ShowField()
         ::::If Steingesetzt = False Then Stop
            SpFe (SteinSpalte%,SteinReihe%) = 0 ;Stein rausnehmen
            Punkte =  10^(MaxTiefe - Tiefe) ; gewinn/VerlustPunkte zurück schicken#
            ;Punkte =  100 - Tiefe
            If PosNeg  = 1 Then Return  Punkte Else Return -Punkte
         ::Else
            Exit
         End If
      End If
   Next
   If Steingesetzt = False Then Return
   ;
   If Tiefe% => Maxtiefe% Then
      SpFe (SteinSpalte%,SteinReihe%) = 0
      Return
   End If
   ;
   Tiefe% = Tiefe% +1
   Player% = Player% Xor 3; Wechsel 1 zu 2 und umgekehrt
   PosNeg% = PosNeg% Xor 1; Wechsel 0 zu 1 und umgekehrt
   ;
   For Spalte%= 0 To 6
      Punkte% = Punkte% +  Rekursiv(Spalte%,Tiefe%,Player%,PosNeg%)
   Next
   ;
   SpFe (SteinSpalte%,SteinReihe%) = 0
   ;
   Return Punkte
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 Return True
            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 True
               End If
            End If
         End If
      End If
   Next
   For Spalte = 0 To 3
      For Reihe = 0 To 2
         If SpFe(Spalte, Reihe) = Player%
            If SpFe(Spalte+1, Reihe+1) = Player%
               If SpFe(Spalte+2, Reihe+2) = Player%
                      If SpFe(Spalte+3, Reihe+3) = Player% Then Return True
                End If
            End If
         End If
         If SpFe(Spalte, Reihe+3) = Player%
            If SpFe(Spalte+1, Reihe+2) = Player%
               If SpFe(Spalte+2, Reihe+1) = Player%
                  If SpFe(Spalte+3, Reihe) = Player% Then Return True
               End If
            End If
         End If
      Next
   Next
End Function

Function ShowField()

   Print"ShowField"
   For y = 5 To 0 Step -1
      For x = 0 To 6
         Write  SpFe (x%,y%)
      Next
      Print ""
   Next

   For t= 0 To 6 Print Schacht(t) Next
End Function
[BB2D | BB3D | BB+]

TimBo

BeitragSo, Apr 12, 2009 12:54
Antworten mit Zitat
Benutzer-Profile anzeigen
TimBo : Rallim = 57:43 gewonnen , was ein luck Rolling Eyes (suchtiefe 4)

dafür hat meine 11 weniger überlegt .

Deine 19.37
meine 8.15 (Suchtiefe 4)

Ich erhöhe mal die Suchtiefe auf 6 und teste.

Auf Suchtiefe 6 gewinne ich 100:0 , dafür überlegt meine 17 mal solange Embarassed
ok derjenige, bei dem die exe als letztes Startet überlegt bei meinem PC ewig , das heißt das oben nehme ich zurück.


Edit 2 :
unsere KI's arbeiten zu 99% gleich ^^
nur meine macht bei der "stellungsanalyse" 2 faktoren mehr , so wie ich das sehe , das macht wahrscheinlich den Zeituntschied und das quäntchen luck am ende aus.

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.

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

Neue Antwort erstellen


Übersicht Sonstiges Projekte

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group