Autor Beitrag
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 02.06.06 16:52 
Noch besser und schneller! Super! Ich komme mir vor wie ein Dieb, der fremden Code stiehlt und einbaut, denn wirklich verstehen kann ich ihn nicht. :oops: Fast alle meine Ansätze und Überlegungen waren falsch bzw. falsch umgesetzt... Das ist etwas ganz anderes als alles, was ich bisher kannte. Am besten finde ich die selbstlernende KI!

In der neuen Version erhalte ich allerdings die Fehlermeldung "Access violation ...", wenn ich sie aufrufe.

Noch eine Frage: Wie machst du die Schatten der "Figuren" so perfekt? Wirklich durch manuelles Zeichnen oder hast du da ein bestimmtes Grafikprogramm? Ich meine, man kann sie ja nicht mit ihrem Schatten einfach ausschneiden und auf ein neues Feld legen, der Schatten passt dann nicht.

Ich habe einmal eine Prozedur geschrieben, die aus einer Datei beliebig viele Bitmaps in eine ImageList einlesen kann. Dazu speichert man zuerst jedes Bitmap als Datei, und, vorausgesetzt, alle Bitmaps haben die selbe Dateigrösse, kann man sie alle zusammen in einer Datei abspeichern - man hängt die einzelnen Dateien an die Zieldatei einfach an. So könnte man ja mehrere Brett-Sätze anlegen und zur Laufzeit laden.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 02.06.06 17:36 
user profile icongalagher hat folgendes geschrieben:
Ich komme mir vor wie ein Dieb, der fremden Code stiehlt und einbaut,...

Nö, Geschenk ist Geschenk. Step doch einfach mal durch... Ich habe ja den einfachen Minimax dringelassen, der ist dann einfacher zu verstehen.
user profile icongalagher hat folgendes geschrieben:
... die selbstlernende KI! In der neuen Version erhalte ich allerdings die Fehlermeldung "Access violation ...", wenn ich sie aufrufe.

Check mal den Aufruf... Da wird bestimmt nicht die Form mit dem Memo korrekt instantiiert. Alternativ kannst Du die Form auch beim Programmbeginn erzeugen.
user profile icongalagher hat folgendes geschrieben:
Noch eine Frage: Wie machst du die Schatten der "Figuren"

CorelDraw. Ich habe 6 Bitmaps: 2 leere Felder, 2 Felder mit roten und 2 Felder mit blauen 'Steinen'.
user profile icongalagher hat folgendes geschrieben:
...So könnte man ja mehrere Brett-Sätze anlegen und zur Laufzeit laden.

Die Bitmaps sind in einer Imagelist (je 6 Bitmaps in der Reihenfolge: 2xBlau, 2xLeer, 2xRot). Du kannst beliebig viele solcher 6er Sätze in die Imagelist hinten ran beppen und dann über den Menüpunkt 'Spiefeld' ein neues Layut ranhängen. Die Property 'Layout' ist einfach eine Zahl >= 0.

Bei Gelegenheit prüfe ich mal die Fehler und verbessere vielleicht noch mal die KI oder baue noch ein Layout ein. Ich glaube aber, mit einem Alpha-Beta-Pruning und dem Lernen sind wir ganz schön weit gekommen...

Studiere ruhig den Quelltext.

_________________
Na denn, dann. Bis dann, denn.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 02.06.06 22:31 
user profile iconalzaimar hat folgendes geschrieben:
Nö, Geschenk ist Geschenk.

Also - dann danke nochmal! Nach dem Wochendende stelle ich mal meine aktuelle Version hier rein!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Balmung der blaue Gott
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 52

WinXP

BeitragVerfasst: Di 06.06.06 15:09 
user profile iconalzaimar hat folgendes geschrieben:
Testet doch mal.


hmm.. ok die KI ist besser geworden, aber sie behauptet einfach schon gewonnen zu haben, ohne dabei einzuberechnen, dass ich schneller gewinnen kann als sie.
//EDIT:
.. weitergetestet ... die KI ist doch nicht so gut :) war nur Zufall, dass sie gewonnen hat (ich vermute das liegt an der Evolution *ichdepp*)
und leider gehen die Schwierigkeitsstufen 9-12 nicht.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 06.06.06 15:17 
:gruebel: Ist mir auch schon aufgefallen... Leider ist das ziemlich schwer nachzuvollziehen, ich habe das dumpfe gefühl, das da ein wenig zu viel wegoptimiert wird. Außerdem hat die KI munter weiterprobiert, auch wenn beim Vorausberechnen eine Gewinnstellung erreicht wurde.

Ich habe in der neuesten Version, die ich heute Abend mal reinstellen wollte, einige Veränderungen vorgenommen. Die Wichtigste ist eine Funktion, die eine Stellung einlesen kann. Damit sollte man auch nachträglich eventuelle Fehler nachvollziehen können.

Bis später.

(Danke für den Hinweis)

_________________
Na denn, dann. Bis dann, denn.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 06.06.06 20:24 
Hallo!
Mir ist aufgefallen, dass die KI manchmal erst nach ein paar Zügen merkt, dass sie gewonnen hat; in der Zwischenzeit kann man normal weiterspielen!

Nachdem alzaimar an dem Problem arbeitet (ich kann's ja nicht :( ), warte ich noch ab und poste die neue Version erst dann. Inzwischen habe ich die Oberfläche komplett neu gestaltet.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 06.06.06 23:22 
Sooo..... Macht Spass, so ein Programm.

Hier die nächste Version. Ich weiss nicht, ob das Problem weiterhin besteht, ich vermute, das die Vorausberechnung Mist gebaut hat, weil sie munter weitersucht, auch wenn eine der Parteien in der Vorausberechnung gewonnen hat. Das kann nicht gut gehen. Das ist behoben

Aber das Programm kann jetzt mehr: Es zeichnet alle Züge auf und speichert sie bei Spielende als 'LastGamexxx.TXT' ab (xxx ist eine laufende Nummer). Sollte so ein Schwachsinnsfehler nochmal auftreten, spielt bitte bis zum Ende und schickt die Datei an mich. Alternativ könnt ihr auch (eben eingebaut :mrgreen: ) den Spielstand sofort abspeichern.

Die Zugliste kann man über das Menü (unter "Computer") sichtbar machen. Die Züge lassen sich Schritt für Schritt rückgängig machen. Mit dem 'GO' Button manifestiert man seine Feigheit :wink: kann dann weiter spielen.

Die Evolution wurde optisch etwas aufgepeppt. Jetzt kann man die Anzahl der Durchgänge sowie die Spielstärke einstellen. Wenn man sie beendet, kann man die Koeffizienten in einer Datei ('COEFFS.TXT') abspeichern. Diese Datei wird dann, wenn vorhanden, beim nächsten Programmstart geladen. So kann man mit den Koeffizienten ein wenig rumspielen.

Leider bin ich zu faul, die Modi 'Computer spielt gegen sich selbst', oder 'Farbe wechseln' oder 'Computer schlägt einen Zug vor' zu implementieren. Vielleicht erbarmt sich ja jemand.

Viel Spass.

[edit]Uses Liste erweitert[/edit]
[edit]KI noch "etwas" optimiert... [/edit]
Einloggen, um Attachments anzusehen!
_________________
Na denn, dann. Bis dann, denn.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 07.06.06 19:15 
@alzaimar: Ich verstehe die Evolution absolut nicht! Da werden doch lauter Nullen verwendet anstatt der aktuellen Koeffizinenten! Wenn man deinen Code zum Speichern der Koeffizionten korrigiert (der hat nämlich einen Bug, hähä, ich kann ja doch was! :mrgreen: ) werden diese ja auch abgespeichert und dann beim nächsten Programmstart geladen. Also, ich meine, mit 0 solche Berechnungen anstellen - da stimmt etwas nicht, oder?
Ich mache das einfach jetzt so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Procedure SaveCoeffs (C : TCoeffArray);
var
  fn: string;
  s: TStringList;
  i: Integer;
begin
  fn := ExtractFilePath(ParamStr(0)) + 'Coeffs.TXT';  //User-DIR verwenden!
  s := TStringlist.create;
  try
    for i := 0 to Length(c)-1 do
     s.Add(IntToStr(c[i]));
    s.saveToFile (Fn);
  finally
    s.free;
  end;
end;

Ich habe deine "neue" Evolution nicht mit übernommen, sondern klammere noch an der alten Version mit dem Memo.

Dann noch eine Frage: Darf man den Quelltext einer Komponente, die man irgendwann einmal downgeloadet hat, verändern, wenn man die Änderungen im Quelltext vermerkt und die Komponente nicht als eigene ausgibt?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 07.06.06 19:50 
Die Evolution fängt bewusst bei 0 an, so wie das Leben for 4 Mrd Jahren ja auch. Nach einigen 100 Durchgängen kristallisiert sich doch eine Tendenz heraus. Nach 500 Durchläufen spielt diese Demo dann gegen die aktuell gespeicherten Koeffizienten, nur um sicherzustellen, das sich der Algorithmus nicht irgendwie verrennt.

Ich werde aber noch eine Auswahl einbauen, um Startwerte für die Koeffizienten einzugeben.

Vergiss bitte nicht, das es sich um eine Demo handelt, die einfach nur zeigt, mit wie wenig Mitteln man eine selbstoptimierende KI schreiben kann. Das ist natürlich noch längst nicht das Ende der Fahnenstange, denn:
- I.d.R. verändert sich nicht ein Koeffizient, sondern mehrere
- erfolgt die zufällige Veränderung nach der Gaußschen Normalverteilung
- müsste man eine Population von vielen 100 Spielen erzeugen, die ALLE mutieren, um dann in einem 'Turnier des Lebens' das 'Survival of the Fittest' Prinzip nachzubilden. Gewinner 'paaren' sich, vermischen also ihre erwiesenermaßen überlegenen Koeffizienten

Wenn man ein wirklich ernsthaften Versuch starten möchte, ein gutes Spiel zu entwickeln, dann müsste man die Stellungsbewertung gewaltig aufbohren. Man müsste bestimmte Muster klassifizieren und, wie immer, mit Koeffizienten versehen. Wenn man so ca. 100-200 Koeffizienten hat, dann wirft man die Evolution an und lässt das System auf einer Rechner-Farm mit mehreren 100 PC einige Wochen rumrechnen. Jeder PC verwalten dann eine Insel mit einigen 100 Populationen. Zwischendurch treten die PC dann gegeneinander an und ermitteln, wer denn nun besser ist. Der Gewinner vererbt seine Koeffizienten an den Verlierer-PC.

Soviel erstmal zur Evolution.

Dieser blöde Fehler beim Speichern :oops: , ich weiss auch nicht, wie der da rein gekommen ist... Äh,... muss meine Frau äh.. gewesen sein. Oder der Hund. :bawling: Oh, wir haben ja gar keinen...

Sind noch mehr Korken drin?

... Ah, offensichtlich: Der blaue Gott ..: Ich habe da eine kleine Optimierung drin:
Ich messe am Anfang, wie viele Stellungen in 1,5 Sekunden analysiert werden können (=MAXSCAN).
Bei Level 8+, 10+ und 12+ passiert Folgendes:

Solange die Anzahl der analyiserten Stellungen < MAXSCAN erhöhe Level um 2 und wiederhole die Suche.

Nun, manchmal (gegen Ende) gibt es nicht mehr genug Stellungen, die man analysieren kann. Dann haben wir dann eine Endlosschleife...Das ist mittlerweile behoben.

Nun nochmal zum Vorschlag vom blauen Gott: Diese Idee wurde bei einem der ersten lernenden Spiele auf ähnliche Weise implementiert, soweit ich mich erinnere, war das ein Dame-spiel auf einem IBM Grossrechner. Hier befürchte ich aber, die Stellungsfunktion ist noch zu grob. Wie ich oben schon erwähnte, müsste man noch mehr Muster und Analysen einfließen lassen. Schließlich muss eine Stellungsfunktion ja irgendwie bewerten, das eine Stellung 'in Zukunft' zu einem Gewinn führen könnte. die paar Parameter (8 Stück) reichen einfach nicht aus.

So, genug für heute.

galagher: Ich probiere mal die ungeraden Level, ich ahne schon, woran das liegt...
Einloggen, um Attachments anzusehen!
_________________
Na denn, dann. Bis dann, denn.


Zuletzt bearbeitet von alzaimar am Mi 07.06.06 21:38, insgesamt 2-mal bearbeitet
Balmung der blaue Gott
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 52

WinXP

BeitragVerfasst: Mi 07.06.06 19:57 
Hi,

Respekt, das Programm wird ja immer besser!
Ich hätte garnicht gedacht, das sich dieses einfache Spiel so gut entwickeln könnte. :D
Ich werde mir sobald ich endlich mal etwas mehr Zeit aufwenden kann den Quelltext ansehen um die Algorithmen der KI zu verstehen.

Nur ein kleiner Bug, von dem ich vermute, dass er schon in den vorherigen Versionen vorhanden war:

Zitat:
Sollte so ein Schwachsinnsfehler nochmal auftreten, spielt bitte bis zum Ende und schickt die Datei an mich. Alternativ könnt ihr auch (eben eingebaut :mrgreen: ) den Spielstand sofort abspeichern.

Ich kann ja wenn das Spiel abgestürtzt ist nicht zuende spielen. Du solltest nach jedem Zug speichern!

Naja, mir ist der Bug aber eigentlich relativ, weil sich das Spiel trotzdem spielen lässt. Schließlich tritt der Fehler erst am Ende auf.
Ich mach mich dann mal wieder auf in die Sphären der letzten Levels,
cu
Einloggen, um Attachments anzusehen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 07.06.06 20:08 
Ich habe (mit "meiner" Version) immer noch das Problem, dass das Programm seinen Sieg weder vorraussieht (szIWillWin) noch den Sieg anzeigt (szIWin) - es spielt einfach weiter.

Ich lade mal die aktuelle Version hoch - wenn gewünscht, ersetze ich die Buttons auch durch Standard-Componenten.

Im Grunde ist es ja nur eine veränderte Oberfläche, die Funktionen kommen allesamt von alzaimar...

Trotzdem - wo liegt der Fehler in meinem Programm? Bei alzaimar's Programm tritt er nicht auf?! Bitte um Hilfe!
Einloggen, um Attachments anzusehen!
_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Balmung der blaue Gott
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 52

WinXP

BeitragVerfasst: Mi 07.06.06 20:09 
@alzaimar: Ach ja, noch ein Gedanke zu den Koeffizienten.. Ich weis zwar nicht wie du es machst, aber man könnte eine Bewertungsfunktion der Endstellung, also die Stellung, bei der bereits feststeht wer gewinnt, schreiben. Je schlechter das Ergebnis ausfiele, desto stärker die Veränderung der Koeffizienten. .... nicht das ich jetzt unbedingt will, dass du das einbaust. War mehr so ein spontaner Einfall :)
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 07.06.06 20:29 
Seltsam, das Nichterkennen tritt bei Level 4 nicht auf, bei level 5 schon. Muss noch weiter testen!

An dieser Stelle - ich kann es nicht oft genug sagen - ohne alzaimar gäbe es mein Programm gar nicht! Und hier ein Nachschlag an erforderlichen Dateien:
//Edit: Bei geraden Levels klappt es, bei ungeraden nicht... *später darum kümmer und versuch herauszufinden wieso*
Einloggen, um Attachments anzusehen!
_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 07.06.06 21:43 
Oh... alle Antworten in dem umfangreichen Post weiter oben... :oops:

Testen, testen, testen. Danke!

_________________
Na denn, dann. Bis dann, denn.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 09.06.06 16:50 
Ich habe alzaimar's Evolution so umgeschrieben (die Version mit dem Memo), dass sie nun nicht mehr in einem eigenen Fenster läuft, sondern im Hauptprogramm-Fenster. Nun habe ich den seltsamen Effekt, dass nach Abbruch der Evolution das Spiel nicht mehr normal funktioniert. Image1 reagiert zunächst gar nicht auf Mausklicks und zeigt dann nach einigen Mausklickes den Spielstand, der beim Abbruch der Evolution war, an.

Um weiterspielen zu können, muss man "Neues Spiel" anklicken. Der OnClick-Aufruf des "Neues Spiel"-Buttons bewirkt nichts! Man muss manuell mit der Maus darauf klicken! So etwas hatte ich ja noch nie! :eyecrazy: Ich meine, mehr als Click geht nicht, und wer es auslöst (der User oder das Programm selbst) müsste doch egal sein - ist es aber nicht!

Ok, man kann das so machen, das man den User zwingt, auf "Neues Spiel" zu klicken, indem man Image1.Enabled := False setzt oder es unsichtbar macht. Aber das ist ja eher die Holzhammer-Methode!

Was kann das denn sein?

/Edit: Und nein, das Programm "evolutioniert" nicht weiter. Der Abbruch der Evolution ist definitiv, aber der Zustand des Programms ist irgendwie nicht wie erwartet! Und noch etwas: Wenn das Programm den Spielstand zeigt und man nochmal auf "Evolution" klickt, werden die Züge dann auch tatsächlich in Image1 angezeigt...

//Edit: Behoben! Es ist nicht egal, an welcher Stelle der Abbruch erfolgt!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 12.06.06 18:27 
Ich kriege keine sinnvolle Funktion Zugvorschlag hin! Ich stelle mal die neue Version hier rein, muss aber sagen, ihr müsst dafür folgende Komponenten installieren:

ColorTrackBar, IAeverButton, ColorProgressbar, BigIni

Ich packe diese in eine extra Zip-Datei und lade sie hoch; weiss nicht mehr, woher ich sie habe und ob es sie überhaupt noch gibt. (BigIni gibt's noch).

Ich würde gerne mehrere Spielbretter erstellen, aber mit meinen Grafikprogrammen kriege ich das nicht hin, so wie alzaimar mit den Schatteneffekten - versucht das mal manuell zu zeichnen! In verschiedenen Farbtönen, passend zum Hintergrund, ohne scharfe Übergänge - da wirst du alt und es wird doch nichts!

Die Prozedur InitCoeffs funktioniert nicht, wenn sie aus dem initialization-Abschnitt aufgerufen wird. Daher hab ich sie kurzerhand deaktiviert und lade die Koeffizienten nun aus der Create-Prozedur.

Naja, und da ist noch das Problem mit den ungeraden Zahlen bei der Spielstärke und dem Erkennen, dass das Programm gewonnen hat...

//Edit:
Das Interesse ist ja nicht gereade extrem...
Trotzdem - hat jamend Abhilfe bei dem ENORMEN DoubleClick-Bug (Zielfeld) ?

//Edit:
Das Problem mit den ungeraden Zahlen ist behelfsmässig behoben, der Klick-Bug sollte vollständig behoben sein!
Einloggen, um Attachments anzusehen!
_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 20.06.06 12:48 
Hallo!
Hier die aktuelle Version. Es ist ein Zugvorschlag eingebaut, der allerdings ab Level 5 zu lange braucht - hängt aber sicherlich vom Computer ab. Ist derzeit auf maximal Level 4 eingestellt.

Ausserdem kann man den Spielstand selbst setzen und die Farben tauschen.

Die Evolution läuft gerade mal auf Level 1 in akzeptabler Geschwindigkeit, ab Level 2 wird's elendig lansam. Ist daher auf Level 1 fix eingestellt.

Zugrücknahme hab ich (noch) nicht hingekriegt!

ToDo: Bessere Stellungsbewertung, schnellere Evolution und Zugvorschlag, den Bug mit den ungeraden Levels beheben.

@alzaimar: Könnte ein wenig Hilfe dringend und gut gebrauchen, was diese ToDo's betrifft!
Einloggen, um Attachments anzusehen!
_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 22.06.06 19:50 
Und hier auch schon die neue Version mit (vorläufigen) Bugfixes (ausser das Problem mit den ungeraden Levels - das kapiere ich einfach nicht!) - und ***Laut ruf nach alzaimar oder nach sonstwem der's kann*** eine verbesserte Stellungsbewertung, denn:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function Score(const aBoard: TBoard; aPlayer, aOpponent: TPlayer): Integer;
(******************************************************************************
 * Das ist das Herz der KI: Hier wird die Stellung bewertet.                  *
 * >0 bedeutet, gut für aPlayer, <0 bedeutet, schlecht für aPlayer            *
 *                                                                            *
 * Diese Funktion ist grauenhaft und zählt nur die Steine sowie ein wenig     *
 * Stellung (gedeckte Steine, Schlagmöglichkeiten). Ein 'Durchmarsch' eines   *
 * Spielers wird ignoriert, ebenso wie andere Stellungen. Ab einer Spieltiefe *
 * von 4 spielt es aber trotzdem ziemlich gut.                                *
 *                                                                            *
 * Je besser und genauer diese Funktion die Stellung wiederspiegelt, desto    *
 * stärker spielt das Programm.                                               *
 ******************************************************************************)

  function _Score(aPlayer, aOpponent: TPlayer): Integer;
  var

//Edit: Der "Zufalls"zug als 1. Zug musste wieder 'raus - dadurch stimmte die gesamte Rechentiefe nicht mehr...
Zugrücknahme ist nun eingebaut.
Einloggen, um Attachments anzusehen!
_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 26.06.06 19:58 
Hallo!

Nachdem sich ja doch zumindest 3 Leute für das Programm interessieren, hier die neue Version.

Neu ist u.a.:
-> Der Zufallszug als 1. Zug ist wieder drin.
-> Das Spielstand-Speichern wurde korrigiert, allerdings ist es nun nicht mehr möglich, nach dem Laden einer Partie den Computer den 1. Zug machen zu lassen. Kommt aber vielliecht wieder (wenn ich's hinkriege!).
-> Zugvorschlag wurde korrigiert.
-> Pause-Funktion eingebaut.
-> Zugrücknahme korrigiert.
-> Den Bug mit den ungeraden Levels konnte ich nicht beheben, also gibt's eben nur gerade ausser 1: 2=2, 3=4, 4=6 usw.
-> Es gibt nun 3 Koeffizienten mehr: Nächster Zug wird Gegner bedrohen, Nächster Zug wird eigenen Stein decken,
2 Felder vor Grundlinie bei freiem, ungefährdetem Zug.
-> Ich habe versucht, die maximale Rechendauer auf ca. 5 min. zu begrenzen. Ich habe vor, dass man den Wert selbst einstellen können wird. Vielleicht kommt noch ein "Einstellungen"-Button.

Wichtig: Für diese Version muss in Bauernspiel.ini (im User-Ordner) der Abschnitt Coeffs entweder um 3 Werte erweitert oder entfernt werden!

Bitte testen und kritisieren (aber konstruktiv, wenn ich bitten darf :mrgreen: )!

//Edit:
Es gibt nun 4 Koeffizienten mehr: Nächster Zug wird Gegner bedrohen, Nächster Zug wird eigenen Stein decken,
2 Felder vor Grundlinie bei freiem, ungefährdeten Zug und blockierte Linien.

Die max. Rechendauer und einige andere Dinge kann man nun selbst einstellen.
Der Abschnitt Coeffs in Bauernspiel.ini muss angepasst/gelöscht werden!

//Edit:
Auf wundersame Weise hat sich der Bug mit den ungeraden Levels von selbst erledigt(?!) - es funktioniert! Diverse Bugs wurden behoben, die Einstellungen-Option erweitert und das Programm ist nun wieder schneller. Es interessiert sich nur kein Schw... dafür.
Einloggen, um Attachments anzusehen!
_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 03.07.06 21:39 
Hallo!

Ich habe jetzt zusätzlich einen 13. Koeffizienten eingebaut, der prüft, ob die nächsten 3 Felder links oder rechts frei sind, wenn dann eine eigene Figur folgt. Das soll dazu dienen, Lücken in der Stellung zu erkennen, durch die der Gegner hindurch kann. Das ist mir bei 2 Spielen gelungen - das Programm ignoriert solche Lücken offenbar.

Rein logischerweise stimmt der Code, aber ich weiss nicht, ob das etwas nützt bzw. sogar das Programm verschlechtert. Vielleicht sollte man die Bedingung, dass nach 3 leeren Feldern eine eigene Figur (aPlayer) folgt, weg lassen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
// Coeff[12]
          {Lücken in der Stellung erkennen}

//r ist die senkrechte, j die waagrechte Koordinate der aktuellen Position

          {Die nächsten 3 Felder links sind frei, dann folgt eine eigene Figur}
          if (aBoard[r, j-4] = aPlayer) then
           if (aBoard[r, j-1] = plEmpty) and
              (aBoard[r, j-2] = plEmpty) and
              (aBoard[r, j-3] = plEmpty) then
           inc(c);

          {Die nächsten 3 Felder rechts sind frei, dann folgt eine eigene Figur}
          if (aBoard[r, j+4] = aPlayer) then
           if (aBoard[r, j+1] = plEmpty) and
              (aBoard[r, j+2] = plEmpty) and
              (aBoard[r, j+3] = plEmpty) then
           inc(c);


Für Meinungen, Tipps und Hinweise etc. wäre ich echt dankbar! :flehan:

//Edit: Code auf "Prüfung auf 3 leere Felder" korrigiert

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!