BCC#25 (Künstliche Intelligenz)
Übersicht

Gehe zu Seite Zurück 1, 2, 3, 4
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
@TimBo: könnte der Ansatz sinnvooll sein?
Ich wollte in meiner Ki kein Algorithmen wie Minimax oder so benutzen... Und ich hatte auch keine Lust mir den näher anzugucken ![]() MFG ComNik |
||
WIP: Vorx.Engine |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es könnte daran liegen das bei mir auch RAND![]() also nicht immer optimal gespielt wird da es sonst langweillig wird! die Analyse beruht zur Zeit nur auf 4-gewinnt, was nicht optimal ist! Die Speed der KI ist noch ausbaufähig! |
||
[BB2D | BB3D | BB+]
|
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sollte nichts mehr kommen von meiner Seite aus , dann ist dies meine Wettbewerbs KI .
https://www.blitzforum.de/upload/file.php?id=5281 Sourcecode enthalten , bitte den Ordner Media selber noch hineinkopieren, man muss das Portal nicht unnötig vollstopfen. Was kann diese KI ? ![]() ![]() ![]() ------------------------------------------------------------------------------- Hi, bei dem es wird langweilig kann ich nur soviel sagen , wer immer den gleichen Mist baut, wird immer verlieren. ![]() ok das ist jetzt arrogant .. ![]() ich werde vll. noch schnell eine Schwierigkeitsstufe mit Rand machen , wie ich das einbaue weiß ich noch nicht so genau. Den Speed wird man immer weiter ausbauen können ![]() Eine Frage , wie machst du die Verweise auf die Hilfe? Da ich übermorgen bis zum 18. weg bin , werde ich meine KI gleich Posten. Meine KI hat 4 Faktoren , die bei der Stellungsanalyse eine Rolle spielen, das war mehr arbeit sich diese auszudenken als sie zu code. ![]() Viele Grüße TimBo @ Comnik , der ansatz ist nicht schlecht aber der Optimale für ein solches Problem ist der , den Rallimen und ich wohl geählt haben. eine Rekursive (??) Funktion , das sind Funktionen , die sich selber aufrufen. Das ist immer von nutzen wenn man kombinationssachen lösen will. |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Eine Frage , wie machst du die Verweise auf die Hilfe?
einfach das Basic Schlüsselwort in Doppelt eckigen Klamern setzten! [ [Beispiel] ] hier noch die Leerzeichen weglassen und fertig |
||
[BB2D | BB3D | BB+]
|
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Lieber FirstDeathmaker, herzlichen Dank für die BM-Version des Netzwerk-Codes! ![]() Ich weiß nicht ob's jemandem aufgefallen ist, aber ein kleiner Fehler steckt in beiden Versionen, in denen die Remis noch nicht richtig gezählt werden. Bitte korrigiert folgende Function, in der nicht etwa die 0, sondern die 3 die Kennzahl für "Remis" ist: Code: [AUSKLAPPEN] 'Update die Statistik
'sieg: 3 = remis, 1=gewonnen, 2=verloren Function STAT_Update(sieg%) If sieg = 3 STAT_Remis = STAT_Remis+1 ElseIf sieg = 1 STAT_Gewonnen = STAT_Gewonnen + 1 ElseIf sieg = 2 STAT_Verloren = STAT_Verloren + 1 EndIf STAT_Gespielt = STAT_Gespielt + 1 End Function Außerdem sollten bitte alle daran denken, irgendwo SeedRnd = Millisecs() o.ä. zu benutzen. Ich hab's bisher bei einigen Beiträgen ergänzen müssen. Nebenbei: Bisher sind alle Beiträge in BB geschrieben. Wo bleibt hier eigentlich die "BlitzMax-Fraktion"? Der Contest geht jetzt in die heiße Phase - noch 3 Tage Zeit. Erfreut stelle ich fest, dass bereits fünf Wettbewerbsteilnehmer dabei sind (anscheinend ist die Themenstellung doch nicht ganz schlecht gewesen): ![]() AnniXa, FirstDeathmaker, TimBo, ComNik und Rallinen. Und es wäre toll, wenn noch mehr dazukämen, aber ich nehme an, dass das tolle Frühlingswetter berechtigter Weise viele davon abhält, sich in einer dunklen Stube mit vertrackten Algorithmen abzuquälen. ComNik bitte ich noch, nicht zu vergessen, seinen endgültigen Beitrag zu posten. Gleiches gilt für Rallinen. TimBos KI dauert im Netzwerkspiel (mit der höchsten Spieltiefe) wirklich seeehr lange, ich mein' ja nur - vielleicht haben später einige Tester einfach zu wenig Geduld, die Ergebnisse abzuwarten... Da die Aufgabe auch mich ungemein gereizt hat (sonst hätte ich sie ja nicht gestellt), habe ich nun selbst ebenfalls eine KI entwickelt. Sie ist ziemlich anders aufgebaut als die meisten bisherigen Ansätze. Das sieht man schon an der (relativ geringen) Berechnungszeit, die sie benötigt. Der Code ist aber leider ziemlich ungenießbar, denn auf der Suche nach geeigneten Strategien habe ich mich immer tiefer in Verzweigungen begeben und musste schließlich irgendwann bewundernd vor dem menschlichen Geist kapitulieren, dessen vielfältige logische Überlegungen tatsächlich ungemein schwer nachzuahmen sind. Meine KI ist im Downloadpaket des Abstimmungs-Threads zu finden. Beim Testen muss ich Rallinens Bemerkung bestätigen: Zitat: Es könnte daran liegen das bei mir auch RAND eine kleine Rolle spielt, also nicht immer optimal gespielt wird, da es sonst langweillig wird!
Bei einigen Gegenüberstellungen muss man tatsächlich feststellen, dass auch nach 100 Testläufen immer nur das gleiche Spiel gespielt wird. Oder nur zwei, je nachdem, wer anfängt. In gewissem Sinne ist das ja auch verständlich: Jeder will unbedingt gewinnen und möchte nur die (nach seinem Algorithmus) einzig beste Spalte verwenden. Ich stelle mir etwas problematisch vor, wie man in diesem Zusammenhang bewerten soll, wenn ein Algo aus Abwechslungsgründen zwischenzeitlich eine weniger gute Spalte ausspuckt, wie Rallinen andeutet. Auch mein eigener Algo war anfangs nur optimal eingestellt und hat mit mehreren anderen KI's immer nur die gleichen ein oder zwei Partien gespielt. Daher habe ich jetzt auch weniger gute Spaltenentscheidungen zugelassen, denn letzten Endes soll ja später ein Mensch mit der KI spielen und Freude an der Abwechslung haben. Außerdem sehe ich ansonsten noch ein anderes Manko: Wenn der Mensch (oder auch eine KI) eine ewig gleichförmig entscheidende KI, so gut sie auch sein möge, zu "knacken" verstünde, würde die KI nie mehr gewinnen und der Mensch nie mehr eine andere Partie spielen (müssen). Darum wird sich eine Entscheidungs-Varianz letzten Endes doch wieder gut auswirken, auch wenn rein statistisch die Anzahl der Niederlagen im Netzwerkspiel steigen wird. Hinsichtlich der Abwechslung hätte ich da noch eine gute Idee: Wenn Ihr nichts dagegen habt, würde ich gerne nach Beendigung des Contests alle Beiträge in einem Programm zusammenfassen, bei dem man sich den Gegner aus sämtlichen Beiträgen auswählen kann, denn wie TimBo sehr richtig anmerkt, sind die Vorgehensweisen sehr verschieden, was dann die Abwechslung beim Spielen garantieren würde: Zitat: Deine KI hat ein komplett anderes Grundschema als meine , aber genau das finde ich an dem Wettbewerb voll cool , das man sehen kann , wie andere KI's arbeiten.
|
||
- Zuletzt bearbeitet von BlitzMoritz am Do, Apr 23, 2009 21:29, insgesamt einmal bearbeitet
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe das Netztwerk-Programm mal getestet, und mir ist da ein Fehler aufgefallen wenn es einer ist!!
Dazu habe ich mein neuen Code (Spielstärke angepasst) gegen den von TimBo Soldier 50 mal laufen lassen. Und das kam dabei heraus Rallimen : TimBo Soldier 23:27 TimBo Soldier : Rallimen 23:27 das bedeutet an Host 0 verliere ich immer gegen ihn! Die neue Version kommt auf jeden Fall, da die gepostete noch einen erheblichen Bug hat! |
||
[BB2D | BB3D | BB+]
|
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Tadaaa Ich präsentiere den ersten von unten:
![]() ![]() Code: [AUSKLAPPEN] AppTitle("Vier-gewinnt-Gegner: ComNik")
Global gegner% ; DER GEGNER... ...wer hätte das gedacht... Dim gefahr%(6) ; LISTE DER SPALTEN IN DIE !KEIN! STEIN GEWORFEN WERDEN DARF!!! ...unter keinen umständen... ;-------------------------------------- Function BesteSpalte%() ;-------------------------------------- ;Zur Erinnerung: 0 = leer, 1 = rot, 2 = gelb ;Mit diesen Werten wird das Spielbrett in dem globalen Array "Feld%(6,5)" gespeichert. ;Die unterste Reihe ist die Reihe 0, die oberste Reihe ist die Reihe 5. ;Ebenso laufen die Spalten von 0 bis 6 von Links nach Rechts For versuch = 0 To 6000 SeedRnd MilliSecs() If farbe% = 1 Then gegner% = 2 ;gegner und farbe bestimmen... If farbe% = 2 Then gegner% = 1 ; " " " " """ For nogo = 0 To 6 ;ZIEMLICH WICHTIG!!! HAB ICH AUCH ERST SPÄT GEMERKT!!! gefahr%(nogo) = 0 ;NOGOS IMMER AUF NULL SETZEN!!! Next ;puhh... ziel = ki_sieg() If ziel <= 6 And ziel >= 0 Then If Feld%(ziel,5) = 0 Then Return ziel End If End If Next ;-------------------------------------- End Function ;-------------------------------------- ;//PRÜFEN OB ICH/KI IN DIESEM ZUG GEWINNEN KANN\\ Function ki_sieg() ;prüfen ob drei in |, /, \, -> oder <- liegen... For x = 0 To 6 ;spalten For y = 0 To 5 ;reihen If Feld%(x,y) = farbe% Then ;wenn auf dem Feld mein stein liegt... ;//HOCH\\ If y + 3 <= 5 Then ;wenn 3 in einer reihe liegen können^^ If Feld%(x,y+1) = farbe% And Feld%(x,y+2) = farbe% And Feld%(x,y+3) = 0 Then If gefahr%(x) = 0 Then Return x End If End If ;//RECHTS\\ und //LINKS\\ If x + 3 <= 6 Then ; 3 können in einer Reihe liegen... If Feld%(x+1,y) = farbe% And Feld%(x+2,y) = farbe% And Feld%(x+3,y) = 0 Then If y = 0 Then Return x + 3 ElseIf Feld%(x+3,y-1) <> 0 Then Return x + 3 Else gefahr%(x+3) = 1 End If End If End If If x - 1 >= 0 Then If x - 1 + 3 <= 6 Then If Feld%(x-1,y) = 0 And Feld%(x+1,y) = farbe% And Feld%(x+2,y) = farbe% Then If y = 0 Then Return x - 1 ElseIf y > 0 Then If Feld%(x-1,y-1) <> 0 Then Return x - 1 End If Else gefahr%(x-1) = 1 End If End If End If End If ;//RECHTS und LINKS mit LÜCKEN\\ ;1011 If x + 3 <= 6 Then If Feld%(x+1,y) = 0 And Feld%(x+2,y) = farbe% And Feld%(x+3,y) = farbe% Then If y = 0 Then Return x + 1 ElseIf Feld%(x+1,y-1) <> 0 Then Return x + 1 Else gefahr%(x+1) = 1 End If End If ;1101 If Feld%(x+1,y) = farbe% And Feld%(x+2,y) = 0 And Feld%(x+3,y) = farbe% Then If y = 0 Then Return x + 2 ElseIf Feld%(x+2,y-1) <> 0 Then Return x + 2 Else gefahr%(x+2) = 1 End If End If End If ;//SCHRÄG: OBEN RECHTS\\ If x + 3 <= 6 And y + 3 <= 5 Then If Feld%(x+1,y+1) = farbe% And Feld%(x+2,y+2) = farbe% And Feld%(x+3,y+3) = 0 Then If Feld%(x+3,y+2) <> 0 Then Return x + 3 Else gefahr%(x+3) = 1 End If End If End If ;//SCHRÄG: OBEN LINKS\\ If y < 3 And x > 2 Then If Feld%(x-1,y+1) = farbe% And Feld%(x-2,y+2) = farbe% And Feld%(x-3,y+3) = 0 Then If Feld%(x-3,y+2) <> 0 Then Return x - 3 Else gefahr%(x-3) = 1 End If End If End If ;//SCHRÄG: UNTEN RECHTS\\ If x + 3 <= 6 And y - 3 >= 0 Then If Feld%(x+1,y-1) = farbe% And Feld%(x+2,y-2) = farbe% And Feld%(x+3,y-3) = 0 Then If y - 3 = 0 Then Return x + 3 ElseIf y - 4 >= 0 Then If Feld%(x+3,y-4) <> 0 Then Return x + 3 End If Else gefahr%(x+3) = 1 End If End If End If ;//SCHRÄG: UNTEN LINKS\\ If x - 3 >= 0 And y - 3 >= 0 Then If Feld%(x-1,y-1) = farbe% And Feld%(x-2,y-2) = fareb% And Feld%(x-3,y-3) = 0 Then If y - 3 = 0 Then Return x - 3 ElseIf y - 4 >= 0 Then If Feld%(x-3,y-4) <> 0 Then Return x - 3 End If Else gefahr%(x-3) = 1 End If End If End If ;//SCHRÄG: OBEN LINKS(mit LÜCKEN)\\ ;1011 If y < 3 And x > 2 Then If Feld%(x-1,y+1) = 0 And Feld%(x-2,y+2) = farbe% And Feld%(x-3,y+3) = farbe% Then If Feld%(x-1,y) <> 0 Then Return x-1 Else gefahr%(x-1) = 1 End If End If End If ;1101 If y < 3 And x > 2 Then If Feld%(x-1,y+1) = farbe% And Feld%(x-2,y+2) = 0 And Feld%(x-3,y+3) = farbe% Then If Feld%(x-2,y+1) <> 0 Then Return x-2 Else gefahr%(x-2) = 1 End If End If End If ;//SCHRÄG: OBEN RECHTS(mit LÜCKEN)\\ ;1101 If x + 3 <= 6 And y + 3 <= 5 Then If Feld%(x+1,y+1) = farbe% And Feld%(x+2,y+2) = 0 And Feld%(x+3,y+3) = farbe% Then If Feld%(x+2,y+1) <> 0 Then Return x + 2 Else gefahr%(x+2) = 1 End If End If End If ;1011 If x + 3 <= 6 And y + 3 <= 5 Then If Feld%(x+1,y+1) = 0 And Feld%(x+2,y+2) = farbe% And Feld%(x+3,y+3) = farbe% Then If Feld%(x+1,y) <> 0 Then Return x + 1 Else gefahr%(x+1) = 1 End If End If End If End If Next Next spalte = gegner_sieg() Return spalte End Function ;//SCHADE, MAL SEHEN OB DER GEGNER IN DIESEM ZUG GEWINNEN KANN\\ Function gegner_sieg() ;prüfen ob 3 in |, /, \, -> oder <- liegen... For x = 0 To 6 ;spalten For y = 0 To 5 ;reihen If Feld%(x,y) = gegner% Then ;wenn auf dem Feld mein stein liegt... ;//HOCH\\ If y + 3 <= 5 Then ;wenn 4 in einer reihe liegen können^^ If Feld%(x,y+1) = gegner% And Feld%(x,y+2) = gegner% And Feld%(x,y+3) = 0 Then Return x End If ;//RECHTS\\ und //LINKS\\ If x + 3 <= 6 Then ; 4 können in einer Reihe liegen... If Feld%(x+1,y) = gegner% And Feld%(x+2,y) = gegner% And Feld%(x+3,y) = 0 Then If y = 0 Then Return x + 3 ElseIf Feld%(x+3,y-1) <> 0 Then Return x + 3 Else gefahr%(x+3) = 1 End If End If End If If x - 1 >= 0 Then If x - 1 + 3 <= 6 Then If Feld%(x-1,y) = 0 And Feld%(x+1,y) = gegner% And Feld%(x+2,y) = gegner% Then If y = 0 Then Return x - 1 ElseIf y > 0 Then If Feld%(x-1,y-1) <> 0 Then Return x - 1 Else gefahr%(x-1) = 1 End If End If End If End If End If ;//SCHRÄG: OBEN RECHTS\\ If x + 3 <= 6 And y + 3 <= 5 Then If Feld%(x+1,y+1) = gegner% And Feld%(x+2,y+2) = gegner% And Feld%(x+3,y+3) = 0 Then If Feld%(x+3,y+2) <> 0 Then Return x + 3 Else gefahr%(x+3) = 1 End If End If End If ;//SCHRÄG: OBEN LINKS\\ If y < 3 And x > 2 Then If Feld%(x-1,y+1) = gegner% And Feld%(x-2,y+2) = gegner% And Feld%(x-3,y+3) = 0 Then If Feld%(x-3,y+2) <> 0 Then Return x - 3 Else gefahr%(x-3) = 1 End If End If End If ;//SCHRÄG: UNTEN RECHTS\\ If x + 3 <= 6 And y - 3 >= 0 Then If Feld%(x+1,y-1) = gegner% And Feld%(x+2,y-2) = gegner% And Feld%(x+3,y-3) = 0 Then If y - 3 = 0 Then Return x + 3 ElseIf y - 4 >= 0 Then If Feld%(x+3,y-4) <> 0 Then Return x + 3 End If Else gefahr%(x+3) = 1 End If End If End If ;//SCHRÄG: UNTEN LINKS\\ If x - 3 >= 0 And y - 3 >= 0 Then If Feld%(x-1,y-1) = gegner% And Feld%(x-2,y-2) = gegner% And Feld%(x-3,y-3) = 0 Then If y - 3 = 0 Then Return x - 3 ElseIf y - 4 >= 0 Then If Feld%(x-3,y-4) <> 0 Then Return x - 3 End If Else gefahr%(x-3) = 1 End If End If End If ;//RECHTS und LINKS mit LÜCKEN\\ ;1011 If x + 3 <= 6 Then If Feld%(x+1,y) = 0 And Feld%(x+2,y) = gegner% And Feld%(x+3,y) = gegner% Then If y = 0 Then Return x + 1 ElseIf Feld%(x+1,y-1) <> 0 Then Return x + 1 Else gefahr%(x+1) = 1 End If End If ;1101 If Feld%(x+1,y) = gegner% And Feld%(x+2,y) = 0 And Feld%(x+3,y) = gegner% Then If y = 0 Then Return x + 2 ElseIf Feld%(x+2,y-1) <> 0 Then Return x + 2 Else gefahr%(x + 2) = 1 End If End If End If ;//SCHRÄG: OBEN LINKS(mit LÜCKEN)\\ ;1011 If y < 3 And x > 2 Then If Feld%(x-1,y+1) = 0 And Feld%(x-2,y+2) = gegner% And Feld%(x-3,y+3) = gegner% Then If Feld%(x-1,y) <> 0 Then Return x-1 Else gefahr%(x-1) = 1 End If End If End If ;1101 If y < 3 And x > 2 Then If Feld%(x-1,y+1) = gegner% And Feld%(x-2,y+2) = 0 And Feld%(x-3,y+3) = gegner% Then If Feld%(x-2,y+1) <> 0 Then Return x-2 Else gefahr%(x-2) = 1 End If End If End If ;//SCHRÄG: OBEN RECHTS(mit LÜCKEN)\\ ;1101 If x + 4 <= 6 And y + 3 <= 5 Then If Feld%(x+1,y+1) = gegner% And Feld%(x+2,y+2) = 0 And Feld%(x+3,y+3) = gegner% Then If Feld%(x+2,y+1) <> 0 Then Return x + 2 Else gefahr%(x+2) = 1 End If End If End If ;1011 If x + 3 <= 6 And y + 3 <= 5 Then If Feld%(x+1,y+1) = 0 And Feld%(x+2,y+2) = gegner% And Feld%(x+3,y+3) = gegner% Then If Feld%(x+1,y) <> 0 Then Return x + 1 Else gefahr%(x+1) = 1 End If End If End If End If Next Next spalte = zwei_bedrohung() Return spalte End Function ;//UND WIE SIEHTS MIT DEM STÖREN DES AUFBAUS DES GEGNERS AUS(satzbau??!!)??\\ Function zwei_bedrohung() For x = 0 To 6 ;spalten For y = 0 To 5 ;reihen If Feld%(x,y) = gegner% Then ;wenn auf dem Feld mein stein liegt... ;//RECHTS\\ und //LINKS\\ If x + 2 <= 6 Then ; 3 können in einer Reihe liegen... If x - 1 >= 0 Then If Feld%(x-1,y) = 0 Then If Feld%(x+1,y) = gegner% And Feld%(x+2,y) = 0 Then If y = 0 Then If gefahr%(x+2) = 0 Then Return x + 2 ElseIf Feld%(x+2,y-1) <> 0 Then Return x + 2 ElseIf Feld%(x-1,y) = 0 Then If y > 0 Then If Feld%(x-1,y-1) <> 0 Then If gefahr%(x-1) = 0 Then Return x - 1 End If End If End If End If End If End If End If ; 1 1 ;00000 (mir ist kein Name eingefallen...) If x + 3 <= 6 And x - 1 >= 0 Then If y = 0 Then If Feld%(x-1,y) = 0 And Feld%(x+1,y) = 0 And Feld%(x+2,y) = gegner% And Feld%(x+3,y) = 0 Then Return x + 1 Else If Feld%(x-1,y) = 0 And Feld%(x+1,y) = 0 And Feld%(x+2,y) = gegner% And Feld%(x+3,y) = 0 Then If Feld%(x-1,y-1) <> 0 And Feld%(x+1,y-1) <> 0 And Feld%(x+3,y-1) <> 0 Then Return x + 1 Else gefahr%(x+1) = 1 End If End If End If End If ;//SCHRÄG: OBEN RECHTS\\ If x + 3 <= 6 And y + 2 <= 5 Then If Feld%(x+1,y+1) = gegner% And Feld%(x+2,y+2) = 0 Then If Feld%(x+2,y+1) <> 0 Then If gefahr%(x+2) = 0 Then Return x + 2 End If End If End If ;//SCHRÄG: OBEN LINKS\\ If y < 2 And x > 1 Then If Feld%(x-1,y+1) = gegner% And Feld%(x-2,y+2) = 0 Then If Feld%(x-2,y+1) <> 0 Then If gefahr%(x-2) = 0 Then Return x - 2 End If End If End If End If Next Next spalte = bauen() Return spalte End Function ;//DANN KANN ICH/KI JA AUFBAUEN\\ Function bauen() For x = 0 To 6 ;spalten For y = 0 To 5 ;reihen If Feld%(x,y) = farbe% Then ;wenn auf dem Feld mein stein liegt... ; 1 1 ;00000 (mir ist kein Name eingefallen...) If x + 3 <= 6 And x - 1 >= 0 Then If y = 0 Then If Feld%(x-1,y) = 0 And Feld%(x+1,y) = 0 And Feld%(x+2,y) = farbe% And Feld%(x+3,y) = 0 Then Return x + 1 Else If Feld%(x-1,y) = 0 And Feld%(x+1,y) = 0 And Feld%(x+2,y) = farbe% And Feld%(x+3,y) = 0 Then If Feld%(x-1,y-1) <> 0 And Feld%(x+1,y-1) <> 0 And Feld%(x+3,y-1) <> 0 Then Return x + 1 Else gefahr%(x+1) = 1 End If End If End If End If ;//HOCH\\ If y + 3 <= 5 Then ;wenn 3 in einer reihe liegen können^^ If Feld%(x,y+1) = farbe% And Feld%(x,y+2) = 0 Then If gefahr%(x) = 0 Then Return x End If End If ;//RECHTS\\ und //LINKS\\ If x + 3 <= 6 Then ; 3 können in einer Reihe liegen... If Feld%(x+1,y) = farbe% And Feld%(x+2,y) = 0 Then If y = 0 Then If gefahr%(x+2) = 0 Then Return x + 2 ElseIf Feld%(x+2,y-1) <> 0 Then If gefahr%(x+2) = 0 Then Return x + 2 Else gefahr%(x+2) = 1 End If End If End If If x - 1 >= 0 Then If x - 1 + 3 <= 6 Then If Feld%(x-1,y) = 0 And Feld%(x+1,y) = farbe% Then If y = 0 Then If gefahr%(x-1) = 0 Then Return x - 1 ElseIf y > 0 Then If Feld%(x-1,y-1) <> 0 Then If gefahr%(x-1) = 0 Then Return x - 1 End If End If End If End If End If ;//SCHRÄG: OBEN RECHTS\\ If x + 4 <= 6 And y + 3 <= 5 Then If Feld%(x+1,y+1) = farbe% And Feld%(x+2,y+2) = 0 And Feld%(x+3,y+3) = 0 Then If Feld%(x+2,y+1) <> 0 Then If gefahr%(x+2) = 0 Then Return x + 2 Else gefahr%(x+2) = 1 End If End If End If ;//SCHRÄG: OBEN LINKS\\ If y < 3 And x > 2 Then If Feld%(x-1,y+1) = farbe% And Feld%(x-2,y+2) = 0 Then If Feld%(x-2,y+1) <> 0 Then If gefahr%(x-2) = 0 Then Return x - 2 Else gefahr%(x-2) = 1 End If End If End If End If Next Next spalte = no_plan_von_ki() Return spalte End Function Function no_plan_von_ki() ;yeah und so! Check the Flow und so... (-.-) If Feld%(3,0) = 0 Then If gefahr%(3) = 0 Then Return 3 End If For g = 0 To 255 ; Was für ein zufälliger Variablenname... spalte = Rnd(0,6) If Feld%(spalte,5) = 0 Then If gefahr%(spalte) = 0 Then Return spalte End If End If Next ;SCH**** Nichts gefunden... spalte = Rnd(0,6) Return spalte End Function gegen die blitz moritz ki hab ich 20 zu 0 verloren... also nur um die teilnehmerzahl mal zu erhöhen. mfg comnik [EDIT] Die ki benutzt keinerlei bestehende Algos... Das hheißt Suchtiefe erhöhen und alle plattmachen is nich-.-[EDIT ENDE] |
||
WIP: Vorx.Engine |
- Zuletzt bearbeitet von ComNik am Fr, Apr 17, 2009 23:39, insgesamt einmal bearbeitet
![]() |
AnniXa |
![]() Antworten mit Zitat ![]() |
---|---|---|
So die schlechteste KI von allen wurde nochmal leicht "verbessert".
(um etwas zu verbessern müste es ja erstmal gut sein ;D) https://www.blitzforum.de/upload/file.php?id=5325 |
||
|moonForge|
Ich bin Pokémon Meisterin seit 1998! |
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
was erlaubst du dir an meinem code rumzumachen?! ![]() |
||
WIP: Vorx.Engine |
![]() |
AnniXa |
![]() Antworten mit Zitat ![]() |
---|---|---|
ComNik hat Folgendes geschrieben: was erlaubst du dir an meinem code rumzumachen?!
![]() ? das müste ich wohl eher dich fragen :O |
||
|moonForge|
Ich bin Pokémon Meisterin seit 1998! |
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
wieso? | ||
WIP: Vorx.Engine |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mhh also das ist ja echt sehr auffällig, mich würde mal interressieren, wie das Netzwerktool entscheidet, wer welche Farbe hat.
Ich denke unsere KI's sind genau gleich stark.... ok mein Traum mal endlich oben zu sein wäre daran geowned XDD awas Spaß Viele Grüße TimBo |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
@timbo: meinst du unsere sind gleich stark?! ![]() |
||
WIP: Vorx.Engine |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
oh sry, komisch ausgedrückt, ich meinte Rallimen
Zitat: Rallimen : TimBo Soldier 23:27
TimBo Soldier : Rallimen 23:27 |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier meine aktuelle Beste Spalte!
Es ist noch einiges an Performance möglich, aber die Zeit ist bei mir um! ![]() Code: [AUSKLAPPEN] ;-Bitte ergänze im Folgenden "Nickname?" durch deinen eigenen, damit man später beim
;Gegeneinanderspielen mehrerer Gegner die Fenster anhand der Titelleisten unterscheiden kann: AppTitle("Rallimen ") ;-------------------------------------- Dim SpFe%(6,5) Dim Slot% (6) Global Maxtiefe% = 6 Global Min%,Max% Function BesteSpalte%() Dim Slot% (6) Local x%,y%,Tiefe%,Spalte% For x% = 0 To 6 For y% = 0 To 5 SpFe (x%,y%) = Feld (x%,y%) zz=zz+Feld (x%,y%) Next Next For Spalte = 0 To 6 For Reihe% = 0 To 5 If SpFe (Spalte%,Reihe%) = 0 Then SpFe (Spalte%,Reihe%) = Farbe% If CheckGewinn%(Spalte%,Reihe%,farbe%) Then Return spalte SpFe (Spalte%,Reihe%) = 0 Exit End If Next Next For Spalte = 0 To 6 For Reihe% = 0 To 5 If SpFe (Spalte%,Reihe%) = 0 Then SpFe (Spalte%,Reihe%) = Farbe% Xor 3 If CheckGewinn%(Spalte%,Reihe%,farbe% Xor 3) Then Return spalte SpFe (Spalte%,Reihe%) = 0 Exit End If Next Next For Spalte = 0 To 6 For Reihe% = 0 To 5 If SpFe (Spalte%,Reihe%) = 0 Then SpFe (Spalte%,Reihe%) = Farbe% gewinne =CheckGewinn%(Spalte%,Reihe%,farbe%) If gewinne Then SpFe (Spalte%,Reihe%) = 0 Slot(Spalte) = + (10000 + maxtiefe) Else wert = GetMinimierung(Maxtiefe, -1999990, +1999990) Slot(Spalte ) = wert SpFe (Spalte%,Reihe%) = 0 End If Exit End If Next Next Return Slotauswaehlen%() End Function Function getMaximierung(tiefe%,alpha%,beta%) If tiefe = 0 Then Return CheckGewinnNote% (Farbe) For nr = 0 To 6 Select Nr Case 0 Spalte = 3 Case 1 Spalte = 2 Case 2 Spalte = 4 Case 3 Spalte = 3 Case 4 Spalte = 5 Case 5 Spalte = 0 Case 6 Spalte = 6 End Select For Reihe% = 0 To 5 If SpFe (Spalte%,Reihe%) = 0 Then SpFe (Spalte%,Reihe%) = Farbe% gewinne= CheckGewinn%(Spalte%,Reihe%,farbe%) If gewinne Then SpFe (Spalte%,Reihe%) = 0 wert= (10000 +tiefe) Else wert = GetMinimierung(tiefe-1, alpha, beta) SpFe (Spalte%,Reihe%) = 0 End If If (wert => beta) Then Return beta If (wert > alpha) Then alpha = wert Exit End If Next Next Return alpha End Function Function getMinimierung (tiefe%,alpha%,beta%) If Tiefe = 0 Then Return CheckGewinnNote% (Farbe) For nr = 0 To 6 Select Nr Case 0 Spalte = 3 Case 1 Spalte = 2 Case 2 Spalte = 4 Case 3 Spalte = 3 Case 4 Spalte = 5 Case 5 Spalte = 0 Case 6 Spalte = 6 End Select For Reihe% = 0 To 5 If SpFe (Spalte%,Reihe%) = 0 Then SpFe (Spalte%,Reihe%) = Farbe Xor 3 Gewinne =CheckGewinn%(Spalte%,Reihe%,farbe% Xor 3) If gewinne Then wert= -(10000+tiefe) SpFe (Spalte%,Reihe%) = 0 Else wert = Getmaximierung(tiefe-1, alpha, beta) SpFe (Spalte%,Reihe%) = 0 End If If (wert <= alpha) Then Return alpha If (wert < beta) Then beta = wert Exit End If Next Next Return beta End Function Function Slotauswaehlen%() ;höchsten Wert emitteln For x% = 0 To 6 ;Slot ermitteln If Feld (x%,5) = 0 Then ; der Slot ist oben frei maxwert% = Slot(x%) maxindex% = x% For x1% = x%+1 To 6 If Feld (x1%,5) = 0 Then ; der Slot ist oben frei If maxwert% < Slot(x1%) Then maxindex% = x1% maxwert% = Slot(x1%) End If End If Next Exit End If Next Return maxindex% End Function Function CheckGewinnNote% (Player%) Return GewinnNote% (Player%) -GewinnNote% (Player%Xor 3) End Function Function GewinnNote% (Player%) gegner = Player% Xor 3 ;Waagerecht Wert=1:faktor =2 For x% = 0 To 3 For y% = 0 To 5 If SpFe (x,y) <> gegner% Then If SpFe (x+1,y%) <> gegner% Then If SpFe (x%+2,y%) <> gegner% Then If SpFe (x%+3,y%) <> gegner% Then If SpFe (x,y%) = Player Then Wert= Wert *faktor :faktor =faktor +1 If SpFe (x+1,y%) = Player Then Wert= Wert *faktor :faktor =faktor +1 If SpFe (x+2,y%) = Player Then Wert= Wert *faktor :faktor =faktor +1 If SpFe (x+3,y%) = Player Then Wert= Wert *faktor Point = Point + Wert Wert=1:faktor =2 End If End If End If End If Next Next ;senkrecht For x% = 0 To 6 For y% = 0 To 2 If SpFe (x,y) <> gegner% Then If SpFe (x,y%+1) <> gegner% Then If SpFe (x%,y%+2) <> gegner% Then If SpFe (x%,y%+3) <> gegner% Then If SpFe (x,y%) = Player Then Wert= Wert *faktor :faktor =faktor +1 If SpFe (x,y%+1) = Player Then Wert= Wert *faktor :faktor =faktor +1 If SpFe (x,y%+2) = Player Then Wert= Wert *faktor :faktor =faktor +1 If SpFe (x,y%+3) = Player Then Wert= Wert *faktor Point = Point + Wert Wert=1:faktor =2 End If End If End If End If Next Next For x% = 0 To 3 For y% = 0 To 2 If SpFe (x,y) <> gegner% Then If SpFe (x+1,y%+1) <> gegner% Then If SpFe (x%+2,y%+2) <> gegner% Then If SpFe (x%+3,y%+2) <> gegner% Then If SpFe (x,y%) = Player Then Wert= Wert *faktor :faktor =faktor +1 If SpFe (x+1,y%+1) = Player Then Wert= Wert *faktor :faktor =faktor +1 If SpFe (x+2,y%+2) = Player Then Wert= Wert *faktor :faktor =faktor +1 If SpFe (x+3,y%+3) = Player Then Wert= Wert *faktor Point = Point + Wert Wert=1:faktor =2 End If End If End If End If Next Next For x% = 0 To 3 For y% = 0 To 2 If SpFe(x%, y%+3) <> gegner% If SpFe(x%+1, y%+2) <> gegner% If SpFe(x%+2, y%+1) <> gegner% If SpFe(x%+3, y%) <> gegner% If SpFe(x%, y%+3) = Player Then Wert= Wert *faktor :faktor =faktor +1 If SpFe(x%+1, y%+2) = Player Then Wert= Wert *faktor :faktor =faktor +1 If SpFe(x%+2, y%+1) = Player Then Wert= Wert *faktor :faktor =faktor +1 If SpFe(x%+3, y% ) = Player Then Wert= Wert *faktor Point = Point + Wert Wert=1:faktor =2 End If End If End If End If Next Next Return Point End Function Function CheckGewinn%(SteinSpalte%,SteinReihe%,Player%) ;Waagerecht For Spalte% = 0 To 3 If SpFe (Spalte%,SteinReihe%) = Player% Then If SpFe (Spalte%+1,SteinReihe%) = Player% Then If SpFe (Spalte%+2,SteinReihe%) = Player% Then If SpFe (Spalte%+3,SteinReihe%) = Player% Then reture =1 End If End If End If Next ;senkrecht For Reihe% = 0 To 2 If SpFe (SteinSpalte%,Reihe%) = Player% Then If SpFe (SteinSpalte%,Reihe%+1) = Player% Then If SpFe (SteinSpalte%,Reihe%+2) = Player% Then If SpFe (SteinSpalte%,Reihe%+3) = Player% Then Return reture =reture +1 End If End If End If Next ; x=SteinSpalte% : y=SteinReihe : If x < y Then y=y-x :x=0 ElseIf y<x x=x-y :y=0 Else x=0 :y=0 For x = x To 3 If x+3 >6 Or y+3 >5 Then Exit If SpFe(x , y)=Player% If SpFe(x +1, y+1)=Player% If SpFe(x +2, y+2)=Player% If SpFe(x +3, y+3)=Player% Return reture =reture +1 EndIf EndIf EndIf y=y+1 Next ; y1%=SteinSpalte + SteinReihe If y1 < 3 Then Return If y1 > 5 Then x1 = y1-5 : y1=5 For x1 = x1 To x1+2 If x1>3 Or y1<3 Then Exit If SpFe(x1,y1) =Player% If SpFe(x1+1, y1-1) =Player% If SpFe(x1+2, y1-2) =Player% If SpFe(x1+3, y1-3) =Player% Then Return reture =reture +1 End If End If End If y1=y1-1 Next Return reture End Function |
||
[BB2D | BB3D | BB+]
|
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hoi,
bin mal auf das Endergebnis gespannt ![]() Hatte auch angefangen, aber aus Zeitgründen abgebrochen. Vllt reich ich noch was nach, nur der Vollständigkeit halber ![]() Meine Implementation hat sich dem alpha-beta Algo bedient, der sich rekursiv aufruft und dann die Blätter bewertet hat, was aber Probleme bereitete, weil vorher schon eine Sieg/Niederlage Situation eintreten konnte. Ich hab deswegen den Beta-Cutoff rausgenommen, was zwar etwas an Performance ausmacht, aber so hab ich halt alle Wege bewertet und diese nach der Bewertung nach Sieg/Niederlage durchforstet. Naja so 100% zufrieden war ich noch nicht, weil es noch zu Fehlbewertungen kam, aber um das auszubügeln muss ich die Einzelknoten nach Sieg/Niederlage bewerten, dafür hab ich aber jetzt keine Zeit mehr Oo Vllt mach ichs noch fertig, vllt auch nicht. Jedenfalls ein sehr geiler Wettbewerb, ich gratulier schon mal dem Sieger ![]() L8er, PSY |
||
PSY LABS Games
Coders don't die, they just gosub without return |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja genau das war (ist) meine Vorgehensweise, das mit den einzelknoten habe ich so gelöst:
ich gehe ja jeden zug durch und bewerte nur den letzten ast, denn davor wäre es ja total energie fressend ![]() wenn es beim letzten ast eine möglichkeit gibt , dass ich verlieren sollte, dann wird dieser komplette erste zug also schlecht bewertet. Zitat: 1. 2. 3. 4. 5. 6. 7.
....| 1. 2. 3. 4. 5. 6. 7. .. / ./ 1. 2. 3. 4. 5. 6. 7. wenn der zug (1 (letzter zug)) verlust fpr mich als folge hätte, dann wäre Zug 2(ausgangszug) mit einer Stärke von #-10000 oder so bewertet worden. Viele Grüße TimBo |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Timbo
das problem bei der blätterbewertung ist, dass es -je grösser die suchtiefe ist- öfter vorkommt, dass es für gelb und rot mehrere gewinnstellungen gibt, das verursacht probleme bei der bewertung...werd mal dran schrauben wenn ich zeit hab. gib mal die stellung in deine KI ein: Vier-gewinnt-Spielstellung, 0 = leer, 1 = rot, 2 = gelb: -------------------- 0000100 0000200 0122200 0111200 0212100 2111200 -------------------- 2 ist am Zug l8er, psy |
||
PSY LABS Games
Coders don't die, they just gosub without return |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja meine KI macht wie ich sehe in die erste Spalte,
erstmal musste ich mich wundern, aber jetzt sehe ich, dass meine KI doch seh Fair sein kann, sie gibt auf, denn sie hat sowieso verloren. Macht sie nicht in die erste , macht der gegner in die erste , dann muss ich auch in die erste machen , dann macht sie in die erste und hat gewonnen XD Ich denke mal das das die Begründung sein mag. Viele Grüße TimBo |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm,
das ist ne Möglichkeit. Aber schau Dir mal diese Stellung an (die von vorhin, bloss 2 Züge weiter): Vier-gewinnt-Spielstellung, 0 = leer, 1 = rot, 2 = gelb: -------------------- 0000100 0001200 0122200 0111200 0212100 2111220 -------------------- 2 ist am Zug Gelb wirft immer noch in den ersten Slot, obwohl er einfach in den 6. werfen muss, um zu gewinnen. Grüsse, PSY (Edit) So wie versprochen (nur der Vollständigkeit halber und falls jemand interessiert ist) meine KI, hab doch noch etwas Zeit gefunden. Die Grundstruktur ist ein rekursiver Alpha-Beta Algorithmus mit Beta Cut-Off, um Rechenzeit zu sparen. Alle 2 Halbzüge (also wenn jeder Spieler 1 Stein geworfen hat) wird die Stellung schnell auf Sieg/Niederlage bewertet, wird was gefunden, wird sofort eine entsprechende Bewertung zurückgeliefert. Wenn nicht, gehts tiefer. Wird das Ende eines Astes(Blatt) erreicht, wird die Stellung bewertet. Dabei werden alle 8 Richtungen um jeden Stein auf Nachbarn (eigene oder gegnerische) gecheckt. Je mehr eigene in einer Reihe, desto höher die Bewertung. Am Ende werden alle eigenen und gegnerischen jeweils addiert und die Gesamtwertung voneinander subtrahiert. Diese Endwertung wird dann zurückgeliefert. Die ersten Züge werden präferiert in die mittleren Slots geworfen. Es gibt noch einiges an Verbesserungspotential, z.B. Mittlere Spalten höher bewerten Defensiv, aggressiv oder neutral spielen (relativ einfach durch die Bewertung zu lösen) Bewertung verfeinern (ich hab bei eigenen Steinen Faktor 10 und bei gegnerischen Faktor 9, da werd ich bei Gelegenheit noch ein wenig mit den Werten rumspielen). Spielen tut die KI dennoch ziemlich gut. Der KI vs KI Netzwerk Test taugt in der jetzigen Form leider nicht. Erstmal hängts total davon ab, wer der Host ist, und sobald eine KI verhältnismässig hohe Rechenzeiten braucht, wirds total fehlerhaft. Teilweise wird mit viel niedrigerer Rechentiefe ein viel besseres Ergebnis erzielt Oo Die oben erwähnte Stellung wird übrigens korrekt gelöst ;P Code: [AUSKLAPPEN] AppTitle("Vier-gewinnt-Gegner: PSY'S EXTERMINATOR")
SeedRnd MilliSecs() Global searchDepth% = 6 ; DIFFICULTY LEVEL Dim movesLeft%(searchDepth) Dim slot%(6,searchDepth) Dim undoX%(searchDepth), undoY%(searchDepth) Global BESTMOVE% Global currentPlayer% ; PLAYER WHOSE TURN IT IS AT THE ACTUAL DEPTH Global player2rate% ; KI PLAYER Global EM% ; EVALUATION MODIFICATOR (-1 AT ODD SEARCHDEPTH, +1 AT EVEN SEARCHDEPTH) Global totalchips% ; TOTAL NUMBER OF CHIPS PLAYED Function BesteSpalte%() Local x%, y%, depth%, TOPRATING%=-9999999, TOPSLOT=-1 player2rate = farbe currentPlayer = 3 - farbe BESTMOVE = 0 totalchips = 0 If (searchDepth Mod 2) = 0 Then EM=1 Else EM=-1 For x=0 To 6 For y=0 To 5 If feld(x,y)>0 Then totalchips = totalchips+1 ; COUNT ALL CHIPS Next If searchDepth>42-totalchips Then searchDepth=42-totalchips ; LIMIT SEARCHDEPTH IF EXCEEDING FREE SLOTS For depth%=0 To searchDepth slot(x,depth%) = False undoX(depth)=0 : undoY(depth)=0 Next Next AlphaBeta (searchDepth, -9999999, 9999999) ; INVOKE ALPHA-BETA ALGO Return BESTMOVE End Function ; RECURSIVE ALPHA-BETA ALGORITHM WITH BETA CUT-OFF Function AlphaBeta(depth%, alpha%, beta%) Local rating%, mate%, center% currentPlayer=3-currentPlayer If totalchips<3 ;PREFER CENTER SLOTS AT THE BEGINNING center = Rand(1,10) If center>4 Then BESTMOVE=3 : Return ; 60% CENTER SLOT If center>2 Then BESTMOVE=4 : Return ; 20% RIGHT OF CENTER SLOT BESTMOVE=2 : Return ; 20% LEFT OF CENTER SLOT EndIf ;CHECK FOR WIN/LOSS EVERY 2 CHIPS If (depth<>searchDepth) And ((searchDepth-depth) Mod 2 = 0) mate=check4win(depth) : If mate<>0 Then Return mate EndIf If depth=0 Then Return RatePosition(depth) ; CALL EVALUATION FUNCTION WHEN DEPTH=0 (LEAF REACHED) FindValidMoves(depth) ; FIND ALL VALID MOVES AT THE CURRENT DEPTH While movesLeft(depth) > 0 ; ARE THERE ANY VALID MOVES LEFT? DoMove(depth) ; IF YES, DO NEXT MOVE rating = -AlphaBeta(depth-1, -beta, -alpha) ; RECURSIVE CALL OF ALPHA-BETA UndoMove(depth) currentPlayer=3-currentPlayer ; SWITCH PLAYER If rating >= beta ; BETA CUT-OFF TO SAVE TIME movesLeft(depth)=0 For x=0 To 6 slot(x,depth)=False Next Return beta EndIf If rating > alpha Then alpha = rating : If depth = searchDepth Then BESTMOVE = undoX(depth) ; BEST MOVE YET? Wend Return alpha End Function ; CHECK FOR WIN/LOSS ; PREFER EARLIER SITUATIONS BY CALCULAING WITH A DEPTH FACTOR Function check4win(depth) Local enemy%=3-player2rate Local lossflag%=0 Local x%,y% For x=0 To 6 For y=0 To 5 If x<4 And feld(x,y) = player2rate And feld(x+1,y) = player2rate And feld(x+2,y) = player2rate And feld(x+3,y) = player2rate Then Return depth*500001 ; - If y<3 And feld(x,y) = player2rate And feld(x,y+1) = player2rate And feld(x,y+2) = player2rate And feld(x,y+3) = player2rate Then Return depth*500001 ; | If y<3 And x<4 And feld(x,y) = player2rate And feld(x+1,y+1) = player2rate And feld(x+2,y+2) = player2rate And feld(x+3,y+3) = player2rate Then Return depth*500001 ; / If y>2 And x<4 And feld(x,y) = player2rate And feld(x+1,y-1) = player2rate And feld(x+2,y-2) = player2rate And feld(x+3,y-3) = player2rate Then Return depth*500001 ; \ If x<4 And feld(x,y) = enemy And feld(x+1,y) = enemy And feld(x+2,y) = enemy And feld(x+3,y) = enemy Then lossflag=lossflag-1 ; - If y<3 And feld(x,y) = enemy And feld(x,y+1) = enemy And feld(x,y+2) = enemy And feld(x,y+3) = enemy Then lossflag=lossflag-1 ; | If y<3 And x<4 And feld(x,y) = enemy And feld(x+1,y+1) = enemy And feld(x+2,y+2) = enemy And feld(x+3,y+3) = enemy Then lossflag=lossflag-1 ; / If y>2 And x<4 And feld(x,y) = enemy And feld(x+1,y-1) = enemy And feld(x+2,y-2) = enemy And feld(x+3,y-3) = enemy Then lossflag=lossflag-1 ; \ Next Next If lossflag<>0 Return depth*-500000 Return 0 End Function Function FindValidMoves(depth%) Local x%,y% For x=0 To 6 If feld(x,5)=0 ;SLOT NOT FULL YET? movesLeft(depth) = movesLeft(depth) + 1 slot(x,depth)=True EndIf Next End Function Function DoMove(depth%) Local x%,y% For x=0 To 6 If slot(x,depth)=True ; FIND NEXT MOVE slot(x,depth)=False ; MOVE FOUND, MARK SLOT movesLeft(depth) = movesLeft(depth) - 1 y=0 While feld(x,y)<>0 ; FIND FREE Y-POSITION y=y+1 Wend feld(x,y) = currentPlayer ; INSERT CHIP undoX(depth)=x : undoY(depth)=y ; REMEMBER X/Y POSITION Return EndIf Next End Function Function UndoMove(depth) feld(undoX(depth),undoY(depth))=0 End Function ; EVALUATE LEAF (DEPTH HAS REACHED ZERO) ; THE MORE CHIPS OF THE SAME COLOR ARE NEXT TO EACH OTHER, THE HIGHER THE RATING ; NEARBY ENEMY CHIPS LOWER THE RATING Function RatePosition(depth) Local enemy%=3-player2rate Local x%, y%, a%, b%, score_a%, score_b%, i%, finalrating% For x=0 To 6 For y=0 To 5 a=10 For i=0 To 3 If (x+i)<7 If feld(x+i,y)=player2rate Then a=a*10 ElseIf feld(x+i,y)=enemy Then a=10 : Exit Else Exit ; > EndIf Next If a>10 Then score_a=score_a+a a=10 For i=0 To 3 If (x-i)>=0 If feld(x-i,y)=player2rate Then a=a*10 ElseIf feld(x-i,y)=enemy Then a=10 : Exit Else Exit ; < EndIf Next If a>10 Then score_a=score_a+a a=10 For i=0 To 3 If (y+i)<6 If feld(x,y+i)=player2rate Then a=a*10 ElseIf feld(x,y+i)=enemy Then a=10 : Exit Else Exit ; ^ EndIf Next If a>10 Then score_a=score_a+a a=10 For i=0 To 3 If (y-i)>=0 If feld(x,y-i)=player2rate Then a=a*10 ElseIf feld(x,y-i)=enemy Then a=10 : Exit Else Exit ; v EndIf Next If a>10 Then score_a=score_a+a a=10 For i=0 To 3 If (x+i)<7 And (y+i)<6 If feld(x+i,y+i)=player2rate Then a=a*10 ElseIf feld(x+i,y+i)=enemy Then a=10 : Exit Else Exit ; ^> EndIf Next If a>10 Then score_a=score_a+a a=10 For i=0 To 3 If (x-i)>=0 And (y+i)<6 If feld(x-i,y+i)=player2rate Then a=a*10 ElseIf feld(x-i,y+i)=enemy Then a=10 : Exit Else Exit ; ^< EndIf Next If a>10 Then score_a=score_a+a a=10 For i=0 To 3 If (y-i)>=0 And (x+i)<7 If feld(x+i,y-i)=player2rate Then a=a*10 ElseIf feld(x+i,y-i)=enemy Then a=10 : Exit Else Exit ; v> EndIf Next If a>10 Then score_a=score_a+a a=10 For i=0 To 3 If (y-i)>=0 And (x-i)>=0 If feld(x-i,y-i)=player2rate Then a=a*10 ElseIf feld(x-i,y-i)=enemy Then a=10 : Exit Else Exit ;v< EndIf Next If a>10 Then score_a=score_a+a Next Next For x=0 To 6 For y=0 To 5 b=9 For i=0 To 3 If (x+i)<7 If feld(x+i,y)=enemy Then b=b*9 ElseIf feld(x+i,y)=player2rate Then b=9 : Exit Else Exit ; > EndIf Next If b>9 Then score_b=score_b+b b=9 For i=0 To 3 If (x-i)>=0 If feld(x-i,y)=enemy Then b=b*9 ElseIf feld(x-i,y)=player2rate Then b=9 : Exit Else Exit ; < EndIf Next If b>9 Then score_b=score_b+b b=9 For i=0 To 3 If (y+i)<6 If feld(x,y+i)=enemy Then b=b*9 ElseIf feld(x,y+i)=player2rate Then b=9 : Exit Else Exit ; ^ EndIf Next If b>9 Then score_b=score_b+b b=9 For i=0 To 3 If (y-i)>=0 If feld(x,y-i)=enemy Then b=b*9 ElseIf feld(x,y-i)=player2rate Then b=9 : Exit Else Exit ; v EndIf Next If b>9 Then score_b=score_b+b b=9 For i=0 To 3 If (x+i)<7 And (y+i)<6 If feld(x+i,y+i)=enemy Then b=b*9 ElseIf feld(x+i,y+i)=player2rate Then b=9 : Exit Else Exit ; ^> EndIf Next If b>9 Then score_b=score_b+b b=9 For i=0 To 3 If (x-i)>=0 And (y+i)<6 If feld(x-i,y+i)=enemy Then b=b*9 ElseIf feld(x-i,y+i)=player2rate Then b=9 : Exit Else Exit ; ^< EndIf Next If b>9 Then score_b=score_b+b b=9 For i=0 To 3 If (y-i)>=0 And (x+i)<7 If feld(x+i,y-i)=enemy Then b=b*9 ElseIf feld(x+i,y-i)=player2rate Then b=9 : Exit Else Exit ; v> EndIf Next If b>9 Then score_b=score_b+b b=9 For i=0 To 3 If (y-i)>=0 And (x-i)>=0 If feld(x-i,y-i)=enemy Then b=b*9 ElseIf feld(x-i,y-i)=player2rate Then b=9 : Exit Else Exit ;v< EndIf Next If b>9 Then score_b=score_b+b Next Next finalrating = (score_a-score_b) Return EM*finalrating End Function L8er, PSY |
||
PSY LABS Games
Coders don't die, they just gosub without return |
Gehe zu Seite Zurück 1, 2, 3, 4
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group