Autor Beitrag
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 18.03.08 15:27 
Hallo,

Hach ja... mal wieder das Thema ;)

Es gibt ja schon ein sehr interessantes Thema dazu von user profile icongalagher und user profile iconalzaimar (www.delphi-forum.de/viewtopic.php?t=59658), aber irgendwe will der nicht so ganz.

Also 1. ist meine Bewertungsfunktion Müll :roll: , und 2. wird, ich vermute damit zusammenhängend, die KI ständig in Endlosschleifen eingesperrt. Sprich die gleichen n (n<=2) Züge werden immer hintereinander ausgeführt. Die hab ich zwar per 'mach nicht einen Zug den du in deinen letzten 2 hattest nochmal' ausgesperrt, aber sinnvoll ist anders...

Erstmal zum Spiel: Das Spiel an sich ist Schach-Ähnlich. Es gibt 2 Läufer, 2 Türme und einen König, der bei mir wie die Dame bei Schach laufen kann (also unbegrenzt diagonal und gerade), aber nur diagonal schlägt. Ach ja, das Ziel: den gegnerischen König schlagen. Was im Gegensatz zu Schach sogar geht ;)
Und dann hab ich noch was drin, was die Sache (später) komplizierter macht: die Aufstellung ist nicht statisch, sondern wird vor Spielbeginn ähnlich wie bei Go erst gesetzt. Hab ich aber zum Testen per Eröffnungsbuch mit einem Eintrag gemacht ;)

Die Frage ist jetzt also, wie ich eine Stellung am genauesten bewerte. Im Moment habe ich nur 'Gegner verliert'->MaxScore, ich kann was schlagen: 500+Figurwert. Das resultiert in extrem vielen Null-Werten, die natürlich genau nix bringen. Außer dass AlphaBeta noch mehr quatsch macht als so schon...

Möchte mir wer helfen? ;)

mfg
Martok

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 18.03.08 17:56 
Du mußt bei schachähnlichen Spielen nicht nur das Schlagen von Figuren bewerten, sondern besonders die Zugmöglichkeiten des Königs. Du solltest also alle möglichen Zugfelder des gegnerischen Königs bewerten. Je mehr davon im "Schach" sind, umso besser...

Trotzdem verstehe ich noch nicht, wie bei deinem Spiel jemals der König geschlagen werden kann, wenn er sich immer (wie die Dame beim Schach) beliebig weit bewegen kann (8x8 Felder, oder wie groß ist das Brett?)
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 18.03.08 18:08 
10x10... Und ja, es geht. Jedenfalls gegen Menschliche Spieler.

Hast mich aber wirklich ins grübeln gebracht... ich werde mal etwas testen (Mensch/Mensch), mal sehen ob das wirklich stimmt. Wenn ja, wird der wohl reduziert werden auf normale 1-Feld-Bewegung, Schlagen aber trotzdem nur diagonal.

Fakt ist aber, dass das schlagen (eigentlich) fast nie vorkommen dürfte, weil der Gegner ja vorher aufgeben müsste...

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 18.03.08 18:17 
Deine Bewertungsfunktion soll ja Stellungen bewerten, und nicht die Züge. Du nimmst Dir also eine beliebige Stellung und zählst z.B. die von deinen Steinen bedrohten Felder.

Dann zählst Du Deine Steine und gibst den einzelnen Steinen auch unterschiedliche Gewichte.

Dann zählst Du, wie viele gegnerische Steine Du mit deinen Steinen bedrohst.

Dann zählst Du, wie viele eigene Steine, die vom Gegner bedroht sind, von deinen eigenen gedeckt sind.

Dann zählst Du, wie viele eigene Steine von deinen Steinen gedeckt sind.

Hast Du Stellungsmuster erkannt, die einen Vorteil bieten? Such nach denen...

usw.


Du bekommst also einen Vektor von Zahlen. Die gewichtest du nun und summierst, fertig ist deine Bewertungsfunktion (lineare Gleichung). Vielleicht reicht bei einigen Werten eine linare Abhängigkeit nicht, also kannst Du vielleicht eine exponentielle Funktion entwickeln...
In meinem Beispiel für galagher (Dein Link) habe ich auch einen Evolutionsalgorithmus, der mit den Gewichten rumspielt, sodaß sie einigermaßen Sinn ergeben. Letztendlich ist die Erstellung einer Bewertungsfunktion Friemelarbeit, sollte aber zu einem entscheidend besser spielenden Programm führen.

_________________
Na denn, dann. Bis dann, denn.
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 18.03.08 20:05 
Ahhhhh... jetzt versteh ich auch deinen Bauernspiel-Source. Eigentlich ganz logisch :oops:

Ich hab das jetzt mal so hingefrickelt und festgestellt, dass 1. meine Figuren für die Überprüfung wo sie hinkönnen zu lange brauchen und 2. das Spiel tatsächlich 'häufig' gewinnbar ist (5 Tests KI gegen KI, alle gewonnen, aufgeben will das Ding grade nicht...). Ist ja eigentlich auch nichts anderes als beim Schach die Dame zu schlagen.


Edit: ich bin jetzt mal n paar Stunden weg vom PC, da lass ich mal 2 KIs gegeneinander antreten mit Suchtiefe 3...
EDIT2: 4:18 Stunden CPU-Zeit später ist die Partie immer noch nicht zuende. WTF? :nut:

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 19.03.08 04:52 
Och Mensch, ich versteh die Sache nicht. Er stellt fest, dass der übernächste Halbzug zum Verlust führt, aber wehrt sich einfach nicht. Statt den König in Sicherheit zu bringen, schlägt er lieber einen Turm, da der aus irgend einem Grund die MinScore-Bewertung nicht durchgereicht kriegt...

Wer den Effekt sehen möchte, AlphaBeta gegen AlphaBeta spielen lassen, und Start drücken... in der Konsole kann man mitverfolgen, was passiert. Die ist gleichzeitig auch der Not-Aus, wenn man die schließt terminiert zwangsläufig auch die VCL-Seite, auch wenn die grade rechnet...

Ich hoffe, es weiß wer was ich verbockt habe, ich hab jetzt 3 Stunden gesucht, jetzt reichts mir ;)
Einloggen, um Attachments anzusehen!
_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 19.03.08 11:35 
Hi, ich weiß, der Alpha-Beta Algo ist ziemlich kompliziert, wenn man ihn ausprogrammieren muß, d.h. mit Spielbrettern und evtl. weiteren Variablen.
Ich hatte vor Jahren (Jahrzehnten -) auch mal ein Schach-Programm (mit Delphi 2) und genau dieselben Probleme.
(erst als ich es mit C++ programmiert hatte, konnte ich die Probleme lösen...)

Ich denke, je mehr du an dem Code rumfrickels, um so schlimmer wird es.

Am besten, du versuchst deinen Code so umzuschreiben, daß er zwischen Algorithmus und deiner Spiellogik trennt.

Erzeuge dir am besten eine (abstrakte) Klasse mit virtuellen Methoden, welche den Algorithmus implementiert (quasi Pseudocode).
Dann leitest du davon eine Klasse für deine Spiellogik ab und schreibst für jede Teilaufgabe eine einzelne Funktion.
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 19.03.08 16:27 
Hehe... manchmal hilft drüber schlafen wirklich.

Ich hab mir jetzt den Wiki-Artikel noch 2 mal durchgelesen, und den ab nochmal neu implementiert. Funktioniert alles, und ich hab was festegestellt: es ist nicht die Tatsache, dass der König immer wegrennen kann... ein anderes Problem verhindert das Gewinnen.
Und zwar verliert in der Standardaufstellung der 2. Spieler immer beide Türme... und kann in dem Moment nicht mehr gewinnen. Allerdings kann er auch nicht verlieren, die beschäftigen sich hier schon ne weile. Keine Endlosschleifen, aber trotzdem hindern die sich schön am gewinnen. Und aufgeben will auch keiner ;)

Ich glaube, der König wird wirklich etwas runtergestuft...

Edit: warum war euer verdammtes Programm so schnell!? Evolution würde bei mir Tage bis Wochen dauern...
Angehängt mal die aktuelle Version. 10 Sekunden pro Zug sind aber doch etwas Lahm. Hab den jetzt aber mal 400 Züge spielen lassen, also zumindest AB vs AB spielt unentschieden... ;)
Edit2: aber nur bei Level 3. Level 2 gewinnt der Eröffnende, weil der andere nicht weit genug sieht...
Einloggen, um Attachments anzusehen!
_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."