Chaos Chess [Working Title]
6.Renovierung
Sonntag, 2. August 2009 von ComNik
Moin moin mal wieder nach langer Zeit
Viel tat sich seit dem letzten "Eintrag" allerdings nicht im Bezug auf ChaosChess
Die im letzten Eintrag erwähnte GUI gedeiht prächtig und sollte auch demnächst fertig sein. Hinzu kamen noch ein zwei andere Projekte die mich irgendwie mehr reizten als Schach Dafür sind die auch bald fertig.
So zu ChaosChess:
Ich wagte heute wieder mal einen Blick in den Code vom Mai dieses Jahres. - und konnte mich grade noch zusammenreissen nicht aus dem Fenster zu springen...
Selten habe ich so einen unstukturierten, unmodularen, vermüllten sowie absolut unoptimierten Code sehen müssen -.-
Nach einer kurzen Pause der Selbstfassung, machte ich mich dran, den Code aufzuräumen. Lange Rede, kurzer Sinn:
Modularer OOP orientierter Aufbau
Schöner eleganter Code
ca 40kb coderedzuzierung. Ich wusste nicht wie wenig man mit viel Code machen kann...
viele Optimierungen
Da der Code nun meinem "neuen Codestandard" entsprach, konnte ich mich schnell wieder einarbeiten
Der Zuggenerator funktioniert schon wieder so wie er soll, und das noch ein bisschen schneller als vorher.
Soweit so gut, ab dem nächsten Eintrag geht es nur noch um den Schach-Algorithmus, den ich hier auch ein bisschen (oder auch mehr, je nach Nachfrage) erklären werde. - sollte ihn Jemand noch nicht so genau kennen.
Das wars für heute.
lg
ComNik
Viel tat sich seit dem letzten "Eintrag" allerdings nicht im Bezug auf ChaosChess
Die im letzten Eintrag erwähnte GUI gedeiht prächtig und sollte auch demnächst fertig sein. Hinzu kamen noch ein zwei andere Projekte die mich irgendwie mehr reizten als Schach Dafür sind die auch bald fertig.
So zu ChaosChess:
Ich wagte heute wieder mal einen Blick in den Code vom Mai dieses Jahres. - und konnte mich grade noch zusammenreissen nicht aus dem Fenster zu springen...
Selten habe ich so einen unstukturierten, unmodularen, vermüllten sowie absolut unoptimierten Code sehen müssen -.-
Nach einer kurzen Pause der Selbstfassung, machte ich mich dran, den Code aufzuräumen. Lange Rede, kurzer Sinn:
Modularer OOP orientierter Aufbau
Schöner eleganter Code
ca 40kb coderedzuzierung. Ich wusste nicht wie wenig man mit viel Code machen kann...
viele Optimierungen
Da der Code nun meinem "neuen Codestandard" entsprach, konnte ich mich schnell wieder einarbeiten
Der Zuggenerator funktioniert schon wieder so wie er soll, und das noch ein bisschen schneller als vorher.
Soweit so gut, ab dem nächsten Eintrag geht es nur noch um den Schach-Algorithmus, den ich hier auch ein bisschen (oder auch mehr, je nach Nachfrage) erklären werde. - sollte ihn Jemand noch nicht so genau kennen.
Das wars für heute.
lg
ComNik
5.Was stellt sich einem doch so alles in den Weg...
Freitag, 3. Juli 2009 von ComNik
Guten Abend liebe Worklogleser/innen,
lange liegt der letzte Eintrag zurück.
Sollt ihn jemand gelesen haben so sprach ich dort von einer simplen GUI die ich noch "kurz" zuende bringen müsste.
Nun inzwischen ist diese GUI weder simpel noch ist sie "kurz" zuende zu bringen. Einige Ideen haben mich dann doch länger daran festgehalten. Ich hoffe sie in den nächsten wochen fertigstellen zu können. Mehr zu der GUI gibts dann wahrscheinlich bald in einem Worklog.
Zu Chaos Chess:
Fürs erste ist das Projekt pausiert. In den anstehenden Sommerferien werde ich mich aber wieder dransetzen und die anfänge der ki etwas weiter nach vorn bringen. Seit dem letzten Eintrag habe ich nur ein bisschen an der Bewertungsfunktion geschraubt. Und muss sagen es klappt besser als erwartet. Mehr dazu in den Ferien.
Danke für die erneute Aufmerksamkeit.
lg
ComNik
lange liegt der letzte Eintrag zurück.
Sollt ihn jemand gelesen haben so sprach ich dort von einer simplen GUI die ich noch "kurz" zuende bringen müsste.
Nun inzwischen ist diese GUI weder simpel noch ist sie "kurz" zuende zu bringen. Einige Ideen haben mich dann doch länger daran festgehalten. Ich hoffe sie in den nächsten wochen fertigstellen zu können. Mehr zu der GUI gibts dann wahrscheinlich bald in einem Worklog.
Zu Chaos Chess:
Fürs erste ist das Projekt pausiert. In den anstehenden Sommerferien werde ich mich aber wieder dransetzen und die anfänge der ki etwas weiter nach vorn bringen. Seit dem letzten Eintrag habe ich nur ein bisschen an der Bewertungsfunktion geschraubt. Und muss sagen es klappt besser als erwartet. Mehr dazu in den Ferien.
Danke für die erneute Aufmerksamkeit.
lg
ComNik
4. Die Ki <.<
Mittwoch, 3. Juni 2009 von ComNik
Guten Morgen allerseits!
Nachdem ich nun schon kriD mit abgehobenen KI Theorien vollgequatscht hab, sind nun die werten Leser dieses Worklogs an der Reihe:
Ich möchte mich heute mal gedanklich sowie codlich(?) mit der Bewertungsfunktion befassen.
Die Bewertungsfunktion dient dazu, einer Situation im Spiel einen Wert zu verpassen. (oder 2 je nach suchalgo;))
Bei Tic Tac Toe mag sowas ja einfach sein, bei Shcah jedoch gibt es SEHR viele Faktoren die die Bewertung beeinflussen. Die Grundliegensten wären:
Materialwert <-- die werte aller figuren einer farbe addiert
Bedrohte, wichtige Figuren <-- ala König, Dame
Schachmatt Situationen^^ <-- König kann isch nicht mehr bewegen, keine Züge mehr in seiner "Zug Liste"
Damit liesse sich schon mal etwas (nichts gutes) anfangen. Wie könnte man diese Funktion also erweitern?
Meine Ideen wären folgende:
Zum Materialwert einer Figur noch die werte der Figuren hinzuzählen, die sie bedroht
jeder Figur einen Bonus geben, je nachdem wie sie gedeckt ist
bewegungsfreiheit!
Zugmöglichkeiten, anzahl aller möglichen züge
Position! ein Bauer am Rand kann getrost vergessen werden, sollte er nicht gerade eine dame bedrohen
Und noch viele andere. Man fragt sich warum man nicht einfach ALLES einbauen sollte, und somit eine (fast) perfekte Bewertung hätte? Nun je mehr Zeit (also For Next schleifen^^) eine Bewertungsfunktion braucht, desto weniger Züge können in angenehmer Zeit vorraus berechnet werden. Und das ist noch wichtiger. Je mehr Züge die Maschiene im Vorraus berechnen kann, desto besser ist sie.
Man darf also keines von Beiden vernachlässigen.
Ich werde mal probieren im Laufe des Tages eine einfache Bewertungsfunktion (Materialwerte, bedrohte Damen/Könige) einzubauen.
Sollte sich damit spielen lassen, wird sie immer weiter ausgebaut. Ich habe ein paar Ideen ausgearbeitet, um die Laufzeit der Bewertungsfunktion zu verringern. Der eigentliche Suchalgorithmus ist nicht allzu schwer.
Ich entschuldige mich für soviel Theorie, aber es lässt sich nicht vermeiden
Bis demnächst,
ComNik
[EDIT:]
Ich wollte keinen neuen Eintrag für diese Neuerung schreiben:
Der Zuggenerator arbeitet nun für ALLE Figuren. Endlich...
Nochmal ein großes dank an ToeB der mir hier entscheidend auf die Sprünge geholfen hat!
[EDIT ENDE]
Nachdem ich nun schon kriD mit abgehobenen KI Theorien vollgequatscht hab, sind nun die werten Leser dieses Worklogs an der Reihe:
Ich möchte mich heute mal gedanklich sowie codlich(?) mit der Bewertungsfunktion befassen.
Die Bewertungsfunktion dient dazu, einer Situation im Spiel einen Wert zu verpassen. (oder 2 je nach suchalgo;))
Bei Tic Tac Toe mag sowas ja einfach sein, bei Shcah jedoch gibt es SEHR viele Faktoren die die Bewertung beeinflussen. Die Grundliegensten wären:
Materialwert <-- die werte aller figuren einer farbe addiert
Bedrohte, wichtige Figuren <-- ala König, Dame
Schachmatt Situationen^^ <-- König kann isch nicht mehr bewegen, keine Züge mehr in seiner "Zug Liste"
Damit liesse sich schon mal etwas (nichts gutes) anfangen. Wie könnte man diese Funktion also erweitern?
Meine Ideen wären folgende:
Zum Materialwert einer Figur noch die werte der Figuren hinzuzählen, die sie bedroht
jeder Figur einen Bonus geben, je nachdem wie sie gedeckt ist
bewegungsfreiheit!
Zugmöglichkeiten, anzahl aller möglichen züge
Position! ein Bauer am Rand kann getrost vergessen werden, sollte er nicht gerade eine dame bedrohen
Und noch viele andere. Man fragt sich warum man nicht einfach ALLES einbauen sollte, und somit eine (fast) perfekte Bewertung hätte? Nun je mehr Zeit (also For Next schleifen^^) eine Bewertungsfunktion braucht, desto weniger Züge können in angenehmer Zeit vorraus berechnet werden. Und das ist noch wichtiger. Je mehr Züge die Maschiene im Vorraus berechnen kann, desto besser ist sie.
Man darf also keines von Beiden vernachlässigen.
Ich werde mal probieren im Laufe des Tages eine einfache Bewertungsfunktion (Materialwerte, bedrohte Damen/Könige) einzubauen.
Sollte sich damit spielen lassen, wird sie immer weiter ausgebaut. Ich habe ein paar Ideen ausgearbeitet, um die Laufzeit der Bewertungsfunktion zu verringern. Der eigentliche Suchalgorithmus ist nicht allzu schwer.
Ich entschuldige mich für soviel Theorie, aber es lässt sich nicht vermeiden
Bis demnächst,
ComNik
[EDIT:]
Ich wollte keinen neuen Eintrag für diese Neuerung schreiben:
Der Zuggenerator arbeitet nun für ALLE Figuren. Endlich...
Nochmal ein großes dank an ToeB der mir hier entscheidend auf die Sprünge geholfen hat!
[EDIT ENDE]
3. Feinschliff
Dienstag, 2. Juni 2009 von ComNik
Moin,
ausgeschlafen habe ich mich heute wieder an ChaosChess gesetzt. Bin allerdings aufgrind von Zeitmangel nicht üüüübermäßig weit gekommen. Figuren schlagen klappt jetzt endlich, nachdem ein sehr merkwürdiger Bug umgangen wurde und das Zugsystem geht auch. Wie auf dem Screen zusehen ist, "laufen" die Figuren fröhlich durch die Gegend.
Das Menü habe ich heute nicht mehr geschafft, dafür steht die GUI soweit, dass eine Implementierung eigentlich kein Problem mehr ist.
Sobald der Zuggenerator sauber arbeitet, lade ich mal eine Demo hoch (siehe Eintrag 2.^^). Bis dahin erstmal nur der Screen sowie ein Auszug aus der (erweiterten) To Do liste.
ToDo:
Zuggenerator komplettieren!
Menü
Funktion die prüft, ob ein Schachmatt vorliegt
Bewertungsfunktion (erläutere ich im nächsten Eintrag)
Da die Bewertungsfunktion mit das komplexeste ist, schriebe ich morgen oder so mal ein paar Gedanken dazu auf.
Und hier der Screen:
In dieser Situation ist der Springer ausgewählt. Die ausgewählte Figur wird noch nicht hervorgehoben, kommt aber noch^^
Bis demnächst!
ausgeschlafen habe ich mich heute wieder an ChaosChess gesetzt. Bin allerdings aufgrind von Zeitmangel nicht üüüübermäßig weit gekommen. Figuren schlagen klappt jetzt endlich, nachdem ein sehr merkwürdiger Bug umgangen wurde und das Zugsystem geht auch. Wie auf dem Screen zusehen ist, "laufen" die Figuren fröhlich durch die Gegend.
Das Menü habe ich heute nicht mehr geschafft, dafür steht die GUI soweit, dass eine Implementierung eigentlich kein Problem mehr ist.
Sobald der Zuggenerator sauber arbeitet, lade ich mal eine Demo hoch (siehe Eintrag 2.^^). Bis dahin erstmal nur der Screen sowie ein Auszug aus der (erweiterten) To Do liste.
ToDo:
Zuggenerator komplettieren!
Menü
Funktion die prüft, ob ein Schachmatt vorliegt
Bewertungsfunktion (erläutere ich im nächsten Eintrag)
Da die Bewertungsfunktion mit das komplexeste ist, schriebe ich morgen oder so mal ein paar Gedanken dazu auf.
Und hier der Screen:
In dieser Situation ist der Springer ausgewählt. Die ausgewählte Figur wird noch nicht hervorgehoben, kommt aber noch^^
Bis demnächst!
2. KAMPF! ...
Montag, 1. Juni 2009 von ComNik
Guten Abend,
Blöderweise habe ich seit 24 Stunden nicht geschlafen (dvd "abend" -.- ... von wegen).
Dadurch gestaltet sich das entwerfen und implementieren einer Schach Ki nicht gerade einfacher als sowieso schon...
Trotzdem möchte ich einige kleine Erfolge vermelden:
Figuren hauen sich jetzt visuell vom Schlachtfeld...
Der Zuggenerator arbeitet jetzt für: Bauern, Springer, Türme und Könige
Das "Kampfsystem" (schach - kampfsystem??? -.-') muss noch leicht erweitert werden. Dann müssen noch Züge rein, also erst Spieler1 dann Spieler 2 usw... das ist natürlich nicht so die herausforderung
Dann sollte Mensch vs. Mensch soweit fertig sein und hier zum Download bereitstehen.
To DO ( nur Mensch vs. Mensch)
Zug System
"kampfsystem"
ein kleines Menü
( grafiken bleiben aber erstmal )
Dann kommt der Download. ( auch wenns ohne ki nix großes is )
Screen gibts dann vom Menü (welches hoffentlich in meiner halbgaren GUI geschrieben werden kann ).
Ich bedanke mich ein weiteres mal für die Aufmerksamkeit
Blöderweise habe ich seit 24 Stunden nicht geschlafen (dvd "abend" -.- ... von wegen).
Dadurch gestaltet sich das entwerfen und implementieren einer Schach Ki nicht gerade einfacher als sowieso schon...
Trotzdem möchte ich einige kleine Erfolge vermelden:
Figuren hauen sich jetzt visuell vom Schlachtfeld...
Der Zuggenerator arbeitet jetzt für: Bauern, Springer, Türme und Könige
Das "Kampfsystem" (schach - kampfsystem??? -.-') muss noch leicht erweitert werden. Dann müssen noch Züge rein, also erst Spieler1 dann Spieler 2 usw... das ist natürlich nicht so die herausforderung
Dann sollte Mensch vs. Mensch soweit fertig sein und hier zum Download bereitstehen.
To DO ( nur Mensch vs. Mensch)
Zug System
"kampfsystem"
ein kleines Menü
( grafiken bleiben aber erstmal )
Dann kommt der Download. ( auch wenns ohne ki nix großes is )
Screen gibts dann vom Menü (welches hoffentlich in meiner halbgaren GUI geschrieben werden kann ).
Ich bedanke mich ein weiteres mal für die Aufmerksamkeit
1. Vorstellung
Samstag, 30. Mai 2009 von ComNik
Guten Morgen,
nach meinem ersten nicht so erfolgreichem Projekt/Worklog ( ) präsentiere ich hier mal wieder etwas, in einem etwas weiterem Stadium.
Erst einmal vorneweg: Chaos Chess ist nur der Arbeitstitel, sollte unser allseits bekanntes "Chaos Interactive" etwas gegen den Namen haben, so möge es mir eine PN schreiben.
Nun gut:
Chaos Chess wird in BlitzMax geschrieben und ist wie der Name schon sagt ein Schachspiel. Im moment bin ich noch dabei, das (sorgfältig geplante ) Mensch vs. Mensch einzubauen. Also zwei Menschen vor einem Pc. Mein eigentliches Ziel ist es jedoch eine (einfache) Schach KI einzubauen. Ich weiß, dass das sehr überheblich ist und eigentlich viel zu umfangreich, aber ich machs trotzdem...
Chaos Chess soll etwa so werden wie "Don't get Angry" nur eben in Schach und in 2D. Es soll mehrere "Themes" geben, also zum Beispiel Mittelalter, Futuristisch etc... ( deshalb auch Chaos )
Da dies allerdings grafischer Schnick Schnack ist, möchte ich mich erst gaaaaanz am Ende darum kümmern, weswegen auf dem Screen auch nur Wikipedia Grafiken zu bewundern sind. Diese werden natürlcih ersetzt, aber es geht mir mehr um das spielerische und (natürlich) die KI.
Der Worklog soll mir auch dazu dienen meine "Gedankengänge" aufzuschreiben. Deswegen verzeihe man mir hier auch viel Theorie.
Zuerst überlegte ich mir (und las mir an) was denn die essentielen Teile enes Schachspiels sind.
Da wäre:
1. Figuren auswählen.
2. Zuggenerator.
3. Zug ausführen.
In einer Mensch vs. Mensch Partie, dient der Zuggenerator natürlich nur dazu, dass keiner einen nicht möglichen Zug ausführt. Zur veranschaulichung mal ein Beispiel Zug:
Spieler1 wählt einen weißen Bauern. Für diesen Bauern werden nun alle möglichen Züge berechnet. Bei einem Bauern also sehr einfach: 1 Feld nach vorne. Wenn auf einem der beiden Felder lins oder rechtsoben von ihm eine gegnerische Figur steht, so ist das auch noch eine Zugmöglichkeit.
Wenn Spieler1 nun auf einem der möglichen Felder die rechte Maustaste drückt, so wird die Figur bewegt. Wenn NICHT: die Figur wird abgewählt und die Züge werden gelöscht.
Für eine Schach KI muss natürlich noch einiges mehr dazu (unter anderem der eigentliche Suchalgorithmus^^).
Aber darüber möchte ich jetzt nicht schreiben.
Folgende Umsetzingsmöglichkeit habe ich mir überlegt:
In einem 2 dimensionalen Array werden die ID's der Figuren gespeichert. Diese gelten gleichzeitig als Framenummer(^^). Somit geht das zeichnen der Figuren schneller, als wenn man in dem Array Objekte speichern würde, die man dann erst auslesen muss.
Das zeichnen der Figuren funktionierte wunderbar, nur brauchte ich noch eine Möglichkeit das Objekt unter der Maus an den Zuggenerator zu übergeben.
Dies natürlich mit möglichst wenigen For/Next EachIn Loops. kriD überzeugte mich dann von der Array Methode. Auch zweidimensional, nur eben mit Objekten, anstatt mit ID's.
Danke nochmal kriD!
Nun hatte ich was ich wollte, schnelles zeichnen und nur minimal For/Next!
Genug Theorie, "Feature" list sowie Screen:
Drinne is:
Figuren ziehen
Zuggenerator (noch nicht für alle Figuren, kann aber leicht erweitert werden)
keine unmöhlichen züge möglich (...)
To Do:
Zuggenerator erweitern
Figuren schlagen
und in weiter Ferne () noch die KI sowie gute Grafiken...
Ich verabschiede mich mit Dank für die Aufmerksamkeit und einem Screen:
PS: Wie man erkennen kann, ignoriert der Zuggenerator Felder auf denen eine Figur steht egal ob schwarz oder weiß.
Das kommt natürlich noch, mitsamt dem Figuren schlagen.
nach meinem ersten nicht so erfolgreichem Projekt/Worklog ( ) präsentiere ich hier mal wieder etwas, in einem etwas weiterem Stadium.
Erst einmal vorneweg: Chaos Chess ist nur der Arbeitstitel, sollte unser allseits bekanntes "Chaos Interactive" etwas gegen den Namen haben, so möge es mir eine PN schreiben.
Nun gut:
Chaos Chess wird in BlitzMax geschrieben und ist wie der Name schon sagt ein Schachspiel. Im moment bin ich noch dabei, das (sorgfältig geplante ) Mensch vs. Mensch einzubauen. Also zwei Menschen vor einem Pc. Mein eigentliches Ziel ist es jedoch eine (einfache) Schach KI einzubauen. Ich weiß, dass das sehr überheblich ist und eigentlich viel zu umfangreich, aber ich machs trotzdem...
Chaos Chess soll etwa so werden wie "Don't get Angry" nur eben in Schach und in 2D. Es soll mehrere "Themes" geben, also zum Beispiel Mittelalter, Futuristisch etc... ( deshalb auch Chaos )
Da dies allerdings grafischer Schnick Schnack ist, möchte ich mich erst gaaaaanz am Ende darum kümmern, weswegen auf dem Screen auch nur Wikipedia Grafiken zu bewundern sind. Diese werden natürlcih ersetzt, aber es geht mir mehr um das spielerische und (natürlich) die KI.
Der Worklog soll mir auch dazu dienen meine "Gedankengänge" aufzuschreiben. Deswegen verzeihe man mir hier auch viel Theorie.
Zuerst überlegte ich mir (und las mir an) was denn die essentielen Teile enes Schachspiels sind.
Da wäre:
1. Figuren auswählen.
2. Zuggenerator.
3. Zug ausführen.
In einer Mensch vs. Mensch Partie, dient der Zuggenerator natürlich nur dazu, dass keiner einen nicht möglichen Zug ausführt. Zur veranschaulichung mal ein Beispiel Zug:
Spieler1 wählt einen weißen Bauern. Für diesen Bauern werden nun alle möglichen Züge berechnet. Bei einem Bauern also sehr einfach: 1 Feld nach vorne. Wenn auf einem der beiden Felder lins oder rechtsoben von ihm eine gegnerische Figur steht, so ist das auch noch eine Zugmöglichkeit.
Wenn Spieler1 nun auf einem der möglichen Felder die rechte Maustaste drückt, so wird die Figur bewegt. Wenn NICHT: die Figur wird abgewählt und die Züge werden gelöscht.
Für eine Schach KI muss natürlich noch einiges mehr dazu (unter anderem der eigentliche Suchalgorithmus^^).
Aber darüber möchte ich jetzt nicht schreiben.
Folgende Umsetzingsmöglichkeit habe ich mir überlegt:
In einem 2 dimensionalen Array werden die ID's der Figuren gespeichert. Diese gelten gleichzeitig als Framenummer(^^). Somit geht das zeichnen der Figuren schneller, als wenn man in dem Array Objekte speichern würde, die man dann erst auslesen muss.
Das zeichnen der Figuren funktionierte wunderbar, nur brauchte ich noch eine Möglichkeit das Objekt unter der Maus an den Zuggenerator zu übergeben.
Dies natürlich mit möglichst wenigen For/Next EachIn Loops. kriD überzeugte mich dann von der Array Methode. Auch zweidimensional, nur eben mit Objekten, anstatt mit ID's.
Danke nochmal kriD!
Nun hatte ich was ich wollte, schnelles zeichnen und nur minimal For/Next!
Genug Theorie, "Feature" list sowie Screen:
Drinne is:
Figuren ziehen
Zuggenerator (noch nicht für alle Figuren, kann aber leicht erweitert werden)
keine unmöhlichen züge möglich (...)
To Do:
Zuggenerator erweitern
Figuren schlagen
und in weiter Ferne () noch die KI sowie gute Grafiken...
Ich verabschiede mich mit Dank für die Aufmerksamkeit und einem Screen:
PS: Wie man erkennen kann, ignoriert der Zuggenerator Felder auf denen eine Figur steht egal ob schwarz oder weiß.
Das kommt natürlich noch, mitsamt dem Figuren schlagen.