AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Schach - Fehlerbeseitigung

Ein Thema von Danny92 · begonnen am 21. Mär 2019 · letzter Beitrag vom 25. Mär 2019
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Danny92
Danny92

Registriert seit: 18. Aug 2014
55 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Schach - Fehlerbeseitigung

  Alt 21. Mär 2019, 22:00
Ich habe im Anhang mein geschriebenes Schachprogramm angehängt. Leider funktioniert es nicht so ganz perfekt. Manchmal zieht die KI einen meiner Figuren, oder sie folgt nicht den Regeln. Zum Beispiel kam es vor, dass die KI hin und wieder das Schach nicht parierte.

Dass es nicht gerade effizient programmiert ist, kann ich mir aufgrund der Langsamkeit (Schwierigkeitsstufe höchstens auf 2 Züge vorraus) schon denken. Auch sind ein paar Einzelheiten, wie beispielsweise die Rochade oder die Bauernumwandlung, noch nicht programmiert. Ich sitze schon sehr lange nur an der KI und bekomme sie einfach nicht schnell, oder zumindest fehlerfrei, programmiert.

Ich würde mich freuen, wenn jemand den einen oder anderen Fehler darin erkennen und ihn mir mitteilen würde. Ich kann nämlich echt nichts mehr finden. Auch über hilfreiche Tipps freue ich mich!

Vielen Dank!
Angehängte Dateien
Dateityp: zip Schach.zip (916,0 KB, 28x aufgerufen)

Geändert von Danny92 (21. Mär 2019 um 22:02 Uhr)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.127 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Schach - Fehlerbeseitigung

  Alt 22. Mär 2019, 07:55
Hallo,
habe nur kurz reingeschaut. Erster Tpp: dokumentiere mal alles. Da machst du es erstens anderne leichter den Code zu verstehen und zum anderen kommst du dann eher selber drauf was falsch läuft.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.003 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Schach - Fehlerbeseitigung

  Alt 22. Mär 2019, 14:18
Nutze dazu am besten xmldoc Kommentare. Vor einer Methoden Deklaration Strg-J daran s und summary auswählen. Enter und Kommentar schreiben. Mit der Maus dann über einen Aufruf der Methode fahren...
Gibt es auch als param und return
  Mit Zitat antworten Zitat
Benutzerbild von Danny92
Danny92

Registriert seit: 18. Aug 2014
55 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Schach - Fehlerbeseitigung

  Alt 23. Mär 2019, 12:25
Ja ich war noch nie ein großer Fan von Kommentaren, der Code ist ohnehin schon lange genug. Ich verstehe dass Kommentare zur Verständlichkeit beitragen mögen. Ich habe aber versucht, den Funktionen, Prozeduren und Variablen sprechende Namen zu geben, die eigentlich schon für sich sprechen. Also was die boolesche Funktion "IstSchach" macht oder was in vkoenigweisskoordinate vom Typ TPoint gespeichert ist, muss ich ja wohl nicht groß erläutern. Aber ich beantworte gerne jede unklare Frage.

Ich habe das Programm nochmal bearbeitet und bin auch schon viel weiter gekommen: Das Programm ist jetzt spielbar und die KI sollte keine Fehler mehr machen; Schach, Patt und Matt wird erkannt und en passant sollte ebenfalls funktionieren. Bauernumwandlung und Rochade muss ich immer noch implementieren. Mir ging es aber wie gesagt zunächst um die Fehlerbehebung, damit es überhaupt spielbar ist. Ob die KI auch als schwarz fehlerfrei arbeitet, habe ich noch nicht getestet.

Nun geht es mir nur noch um die Spielstärke und dann zuletzt noch um die Effizienz bzw. Schnelligkeit. Selbst bei acht vorausberechnenden Zügen (wo die KI hier schon (zu) lange rechnen muss) gewinnt man immer noch spielend leicht, was eigentlich gar nicht sein dürfte/sollte. Daraus schließe ich, dass in dem Quellcode, genauer gesagt im Alpha-Beta-Algorithmus (welcher für solche Spiele gängig ist) oder vielleicht auch in der Bewertungsfunktion, ein Fehler stecken muss. Und den zu finden, finde ich fast unmöglich in Anbetracht der Komplexität des Programms. Kann mir da irgendwer weiterhelfen?

Ansonsten macht es jetzt schon echt Spaß mit dem Programm rumzuspielen..

Danke.
Angehängte Dateien
Dateityp: zip Schach.zip (922,3 KB, 18x aufgerufen)

Geändert von Danny92 (23. Mär 2019 um 12:31 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.948 Beiträge
 
#5

AW: Schach - Fehlerbeseitigung

  Alt 23. Mär 2019, 13:19
Zitat:
Selbst bei acht vorausberechnenden Zügen (wo die KI hier schon (zu) lange rechnen muss)
Alles eine Frage der Codeeffizienz. Hier gibt es bestimmt Optimierungsmöglichkeiten (habe nicht in deinen Code reingeguckt).
Vielleicht hilft dir diese Seite https://www.chess.com/de/analysis
  Mit Zitat antworten Zitat
Benutzerbild von Danny92
Danny92

Registriert seit: 18. Aug 2014
55 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Schach - Fehlerbeseitigung

  Alt 23. Mär 2019, 17:34
Wie macht man denn zum Beispiel den Code effizient? Ich könnte u. a. ausschließlich Referenzparameter in den Methoden übergeben, um zeit-intensives Kopieren der Variablen zu sparen. Außerdem verwende ich mit Mergesort schon einen Sortieralgorithmus mit bester asymptotischer Laufzeit. Die Vorsortierung der Züge anhand ihrer Bewertungen wird ja beim Alpha-Beta-Algorithmus ohnehin empfohlen. Aber viel mehr weiß ich dann auch nichts effizienter zu machen...

Die Website ist echt interessant, aber ob mir das viel weiterhelfen wird...

Geändert von Danny92 (23. Mär 2019 um 17:36 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.948 Beiträge
 
#7

AW: Schach - Fehlerbeseitigung

  Alt 23. Mär 2019, 17:48
Zitat:
Ich könnte u. a. ausschließlich Referenzparameter in den Methoden übergeben, um zeit-intensives Kopieren der Variablen zu sparen.
Wirklich zeitintensiv ist das nicht. komplexere Datentypen werden soweit ich weiß ohnehin referenziert und nicht kopiert.

Mit Optimierungen meinte eigentlich, besseren Code im Allgemeinen.

PS.: ich denke es würden dir wesentlich mehr Leute helfen, wenn dein Projekt ein vernünftiges Delphiprojekt () wäre und keines von Lazurus ()
Die Emotes bitte nicht ernst nehmen.
  Mit Zitat antworten Zitat
hanvas

Registriert seit: 28. Okt 2010
139 Beiträge
 
#8

AW: Schach - Fehlerbeseitigung

  Alt 23. Mär 2019, 19:26
Wie macht man denn zum Beispiel den Code effizient? Ich könnte u. a. ausschließlich Referenzparameter in den Methoden übergeben, um zeit-intensives Kopieren der Variablen zu sparen.
Das bringt bei bestimmten Datentypen (zb. Arrays und Pascal - Strings) mehr Effizienz, aber nicht var sondern const verwenden.

Zitat:
Außerdem verwende ich mit Mergesort schon einen Sortieralgorithmus mit bester asymptotischer Laufzeit.
Ein besserer/effizienter/schnellerer Algorithmus, sofern es einen gibt ist sicher die beste Lösung. Dein Sortierverfahren ist ja nur ein Teil des Algos.

Falls es keinen besseren Algorithmus gibt fängt man an zu optimieren. Dabei würde ich Dir zunächst einen Profiler empfehlen um zu sehen wo es eigentlich hakt.

Oft fressen ein paar "kleine" Codeteile den größten Teil der Zeit.

Makros - also mit Inline deklarierte Methoden - sind für kurze Methoden oft eine gute Möglichkeit den Overhead der durch den Aufruf einer Methode erzeugt wird zu minimieren. Das macht aber nur Sinn wenn die Methode relativ klein ist und sehr häufig aufgerufen wird. Je öfter eine Methode / Prozedur / Funktion aufgerufen wird umso größer ist der Gewinn.

Man kann Laufzeit durch Speicher ersetzen.

Also soviel wie möglich im voraus berechnen. Nachschlage und Sprungtabellen erstellen usw.

Insbesondere dann wenn sich die Berechnungen in einer Schleife, oder im inneren von inneren von inneren (usw) Schleifen befinden. Jede Ebene die man Berechnungen nach oben bringt spart Rechenzeit. Dabei darf man, wenn es um Optimierung geht, auch nicht unbedingt Angst vor globalen Variablen haben.

Of werden am Anfang und Ende von Schleifen Initialisierungsarbeiten durchgeführt, also Speicher allokiert und freigegeben, Werte berechnet und Variablen initialisiert. Manchmal sind solche Initialisierungen ganz oder teilweise nur ein mal notwendig, werden aber dennoch jedesmal durchgeführt, manchmal kann man Variablen in Tabellen aufnehmen und auf diese zugreifen anstatt diese jedesmal in einer Schleife erneut zu berechnen. Im Zweifelsfall führt man einmal eine Schleife mit den Initialisierungsarbeiten (und gleichen Indexen) aus, und ein zweitesmal eine Art "Arbeitsschleife"

Wichtig ist, alles was man macht ausgiebig zu dokumentieren. Optimierter Code wird schnell unleserlich, weil man Stil zu Gunsten von Geschwindigkeit aufgibt. Diesen Nachteil sollte man durch ausgiebiges Dokumentieren ausgleichen. Variablennamen zu kürzen macht bei einer Compilersprache aber keinen Sinn.

Eine weitere Möglichkeit ist die parallele Verarbeitung. Wenn Du das vor hast, solltest Du deinen Code aber paralellisieren bevor Du dich daran machst ihn wie oben beschrieben zu optimieren. Bei paralellisierten Code ist Lesbarkeit zunächst oberstes Gebot.

hth

Ha-Joe
  Mit Zitat antworten Zitat
Benutzerbild von Danny92
Danny92

Registriert seit: 18. Aug 2014
55 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: Schach - Fehlerbeseitigung

  Alt 25. Mär 2019, 07:33
Gibt es denn einen Profiler für Lazarus? Soweit ich was gefunden habe gibt es welche nur für Delphi.


Auf jeden Fall spielt er jetzt so gut wie einwandfrei. Alles sollte jetzt funktionieren! Nur an der Performance muss ich noch ein wenig arbeiten!

https://www.file-upload.net/download...chach.zip.html

Hier der Downloadlink zur zip, welcher wegen der enthaltenen project.exe größer war als 5 MB.
  Mit Zitat antworten Zitat
hanvas

Registriert seit: 28. Okt 2010
139 Beiträge
 
#10

AW: Schach - Fehlerbeseitigung

  Alt 25. Mär 2019, 07:55
Gibt es denn einen Profiler für Lazarus? Soweit ich was gefunden habe gibt es welche nur für Delphi.
http://wiki.lazarus.freepascal.org/Profiling

http://wiki.freepascal.org/LazProfiler
http://wiki.lazarus.freepascal.org/FPProfiler
http://www.prodelphi.de/detailLinux.html

hth Ha-Joe
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf