Autor |
Beitrag |
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mo 22.10.12 10:30
Hallo,
bevor ich in 3 Stunden zu einem Kurzurlaub verschwinde , gibt's von mir noch ein weiteres Programm, da kaum jemand mein Digger und schon gar nicht meinen Addiator mag.
Jetzt ist es ein Schachprogramm.
An diesem arbeite ich schon seit mehreren Jahren und bin daher etwas egoistisch: Dieses Mal nur als Freeware und ohne den Quelltext.
Während ich mich von dem anstrengenden Programmieren erhole, dürft Ihr gern mein Programm mit konstruktiven, kritischen Anmerkungen versehen.
Gezogen werden die Figuren mit der Maus, wie sonst.
Man kann gegen den Computer spielen, was ganz gut geht. Die Wahl der Spielstufe gibt an, wie viele Halbzüge der Computer voraus denkt. Da mit jeder höheren Spielstufe der Berechnungsaufwand für den Computer exponentiell steigt, wird die "Denkzeit" des PCs auch schnell größer.
Auf einem hinreichend schnellen Computer dürfte Stufe = schwer noch machbar sein. Darüber hinaus braucht man schon viel Geduld, bis das Programm den nächsten Zug macht.
Um ein Spiel nachzuverfolgen, kann man in der Zugliste einen Halbzug auswählen, so dass die Figuren auf diese Spielsituation positioniert werden. Durch Auswahl des nächsten Listeneintrags oder über die Schalter kann dann die Partie weiter verfolgt werden.
Wichtig ist noch, dass in meinem Schachprogramm keine Eröffnungsbibliothek enthalten ist. Alle Züge werden je nach Situation vom Computer berechnet. Durch einen meiner Schüler (Elo-Zahl 1840, ist das viel?) wurde mir gesagt, dass mein Programm am Anfang daher schwächelt.
Verrückt ist, dass ich trotzdem gegen mein eigenes Programm (Stufe: normal) nur noch verliere. Aber unter Euch wird es ja bessere Schachspieler als mich geben.
Beste Grüße
Mathematiker
Rev 1: Die Zugliste wird jetzt in besserer Notation, d.h. mit Figur und evtl. Schlagen angegeben.
Rev 2: Auch die Rochade und Schachgebote werden notiert. Die Zugliste kann als Txt gespeichert werden.
Rev 3: Der Spielstand einer Partie kann gespeichert und später wieder geladen werden.
Rev 4: Mit Möglichkeit eines Zugvorschlages, außerdem verbesserte Speichermöglichkeit.
Rev 5: In der Zugliste wird immer zum letzten Zug gescrollt.
Rev 6: Anfangs- und Zielfeld des Zugvorschlages werden mit einem Rahmen markiert.
Rev 7/8: Auf Wunsch Tonausgabe bei einem Computerzug.
Rev 9: Der letzte Zug der Partie kann hervorgehoben werden. (Voreinstellung)
Rev 10: Grundeinstellungen werden gespeichert und wieder geladen.
Rev 11: Verschiedene Änderungen an der Oberfläche, besserer Zugvorschlag und 2 neue Varianten.
Rev 12: Über das Menü können im Moment 15 verschiedene Standarderöffnungen geladen werden.
Rev 13: mit 26 Eröffnungsvarianten.
Rev 0: schach2.zip enthält zusätzlich Programmteil zum Problemschach, siehe entsprechenden Beitrag
Rev 1: in schach2.zip Verzeichnisfehler beseitigt.
Rev 2: schach2.zip: application.processmessages stark reduziert, beim Programmstart wird die Zugsuche nicht sofort gestartet.
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von Mathematiker am Do 06.02.14 10:58, insgesamt 19-mal bearbeitet
Für diesen Beitrag haben gedankt: Anika, kaufmax, kolibri95, Symbroson
|
|
Dr. Hallo
Beiträge: 110
Erhaltene Danke: 13
XP
C/C++/C#
|
Verfasst: Mo 22.10.12 12:50
Hi, ich bin kein großer Schachspieler. Soweit ich das aber nach bischen testen beurteile, funktionierts sehr gut.
Was mich (im Computermodus) wundert: Die CPU-Auslastung ist auf meinem Rechner ständig um 30%-45%, obwohl ich an der Reihe bin (da könnte der Computer sich doch eigendlich mal ausruhen). Laufen da Berechnungen? Aber was soll berechnet werden, wenn ich doch noch garnicht gezogen hab?
Gruß!
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 22.10.12 13:00
Auch wenn ich nicht weiß wie es hier ist: In meinem Schachprogramm mache ich in der Zeit Vorausberechnungen, das macht durchaus Sinn.
Was ein wenig schade ist, ist, dass nur ein Kern benutzt wird, so dass der größte Teil der Rechnerleistung brach liegt.
|
|
gerd8888
Beiträge: 205
Erhaltene Danke: 3
Win7
Delphi 10.1 Starter (kostenlos) Lazarus
|
Verfasst: Mo 22.10.12 14:44
Habe gerade eine Partie gespielt. Dass keine Eroeffnungsbibliothek eingebaut ist, habe ich schnell nach Se7 statt Sg6 in der Aljechin Verteidigung gemerkt.
Das Brett ist schön gross und positiv aufgefallen ist mir ausserdem, dass wenn man eine Figur ziehen will z.B. auf ein falsches Feld, man ein Verbotsschild in dem Mauszeiger bekommt. Der Gesamteindruck ist, wenn man das mit Fritz und Rybka vergleicht, eher bescheiden. Da ist man Variantenangabe (die Züge, die er gerade berechnet usw.) und Datenbanken gewohnt. Aber der Vergleich ist bei so einem absichtlich einfachen Programm auch schlecht. Gerade für Schachanfänger ist es glaube ich das richtige Schachprogramm.
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mo 22.10.12 14:47
Hallo,
ich bin schon fast im Auto und weg ...
Deshalb noch ganz kurz:
Dr. Hallo hat folgendes geschrieben : | Die CPU-Auslastung ist auf meinem Rechner ständig um 30%-45%, obwohl ich an der Reihe bin (da könnte der Computer sich doch eigendlich mal ausruhen). |
Die Berechnung des Computerzuges läuft in einem eigenen Thread. Ständig wird die Situation analysiert. Das ist auch fair, da der Spieler ja auch weiter denkt, während sein Gegner nach einem Zug sucht.
jaenicke hat folgendes geschrieben : | Was ein wenig schade ist, ist, dass nur ein Kern benutzt wird, so dass der größte Teil der Rechnerleistung brach liegt. |
Mit meinem Delphi 5 wüsste ich gar nicht, wie man zwei oder mehr Kerne ansprechen kann.
Beste Grüße und jetzt im Urlaub
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 22.10.12 15:16
Moin!
Mathematiker hat folgendes geschrieben : | Mit meinem Delphi 5 wüsste ich gar nicht, wie man zwei oder mehr Kerne ansprechen kann. |
Wenn ich mal kurz dazwischen grätschen darf: mehrere Threads? Wenn du es nicht explizit verbietest (in den PE-Flags des EXE-Images), dann werden Threads immer möglichst automatisch auf verschiedene Kerne verteilt.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
Zuletzt bearbeitet von Narses am Do 21.08.14 12:03, insgesamt 1-mal bearbeitet
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Mo 22.10.12 17:43
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mo 22.10.12 18:24
Hallo,
ich bin im Urlaub und kann nicht aufhören, ins Forum zu sehen?! Ich brauche Urlaub!
Narses hat folgendes geschrieben : | Wenn ich mal kurz dazwischen grätschen darf: mehrere Threads? |
Keine Ahnung, warum es nicht auf zwei Kerne verteilt wird. Zum "Beweis", dass es zwei Threads sind, füge ich den Kommentar des Prozess-Explorers an.
So, morgen gehe ich wandern durch die schöne Sächsische Schweiz. Und dann ignoriere ich die EE! Versprochen!
Beste Grüße aus Königstein mit einem wunderschönen Blick auf die Elbe
Mathematiker
Nachtrag: Abbildung des Prozess-Explorers gelöscht, da sie nichts aussagt, wie ich jetzt weiß.
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Zuletzt bearbeitet von Mathematiker am Mi 24.10.12 18:07, insgesamt 1-mal bearbeitet
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 22.10.12 19:45
Moin!
Mathematiker hat folgendes geschrieben : | Narses hat folgendes geschrieben : | Wenn ich mal kurz dazwischen grätschen darf: mehrere Threads? |
Keine Ahnung, warum es nicht auf zwei Kerne verteilt wird. Zum "Beweis", dass es zwei Threads sind, füge ich den Kommentar des Prozess-Explorers an. |
Was soll der Screeenshot beweisen? Du hast den Main- und einen Worker-Thread. Der Witz an jaenickes (An-)Frage/Hinweis dürfte aber doch wohl sein, mehrere Worker-Threads zu haben (was voraussetzt, dass der Algorithmus parallelisierbar ist, OK)!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Mo 22.10.12 20:42
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mo 22.10.12 23:01
Hallo Gerd8888,
gerd8888 hat folgendes geschrieben : | Der Gesamteindruck ist, wenn man das mit Fritz und Rybka vergleicht, eher bescheiden. |
Ich hätte nie vermutet, dass mein kleines Programm mit diesen Schachgrößen verglichen wird. Allein der Vergleich ist ja schon fast ein Ritterschlag. Danke. An diese Superprogramme werde ich nie herankommen.
Narses hat folgendes geschrieben : | Du hast den Main- und einen Worker-Thread. Der Witz an jaenickes (An-)Frage/Hinweis dürfte aber doch wohl sein, mehrere Worker-Threads zu haben (was voraussetzt, dass der Algorithmus parallelisierbar ist, OK)! |
Ebenfalls Danke. Wieder etwas gelernt. Als Freizeitprogrammierer habe ich von so etwas keine Ahnung. Ich war schon froh einen zusätzlichen Thread hinbekommen zu haben. Für mich waren das zwei "parallele" Threads. Da das falsch ist, war der Stolz auf mein Ergebnis wohl verfrüht.
Delphi-Laie hat folgendes geschrieben : | Narses hat folgendes geschrieben : | (was voraussetzt, dass der Algorithmus parallelisierbar ist, OK)! |
Ist er. |
Stimme ich Dir zu. Das wird aber meine Fähigkeiten überschreiten. Es war schon schwierig, die wahrscheinlich schlechten Halbzüge schnell auszusortieren und die besseren vernünftig zu bewerten. Wie das mit zwei parallelen Prozessen, die sich nicht behindern dürfen, gehen soll, ist mir schleierhaft. Ich habe noch viel zu lernen.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 23.10.12 05:11
Mathematiker hat folgendes geschrieben : | Für mich waren das zwei "parallele" Threads. Da das falsch ist, war der Stolz auf mein Ergebnis wohl verfrüht. |
Das war ja auch schon wichtig, denn sonst würden die Berechnungen die GUI blockieren. Und dass das so gut läuft, ist auch schon viel wert und nicht selbstverständlich. Auch nicht bei professionell entwickelten Programmen.
Mathematiker hat folgendes geschrieben : | Stimme ich Dir zu. Das wird aber meine Fähigkeiten überschreiten. Es war schon schwierig, die wahrscheinlich schlechten Halbzüge schnell auszusortieren und die besseren vernünftig zu bewerten. Wie das mit zwei parallelen Prozessen, die sich nicht behindern dürfen, gehen soll, ist mir schleierhaft. |
Die Grundidee wäre, dass du nach den ersten Zugberechnungen die Verschachtelungen an weitere Threads auslagerst.
Dass das nicht einfach ist, ist sicher richtig. Tipps könnte ich/wir dir geben, wenn du uns (oder mir per PN) Teile des Quelltextes zeigst. Speziell den Teil, der die Rekursionen macht, und wie du dazu die Daten ablegst. Natürlich nur, wenn du das möchtest.
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 23.10.12 07:54
Hallo Jaenicke,
jaenicke hat folgendes geschrieben : | Dass das nicht einfach ist, ist sicher richtig. Tipps könnte ich/wir dir geben, wenn du uns (oder mir per PN) Teile des Quelltextes zeigst. |
Danke für das Angebot. Gegebenenfalls werde ich dies gern annehmen.
Allerdings müsste ich meinen Quelltext erst einmal auf ein lesbares Format bringen. In seiner jetzigen Form kann man ihn keinem zumuten.
Ich gestehe, dass ich zu den "Chaoten" gehöre, die nie Kommentare schreiben, Objekten und Variablen selten Bezeichnungen geben, die ihren Inhalt erkennen lassen, und die Formatierung der Quelltexte ...
Wenn ich in der EE Quelltexte veröffentliche, überarbeite ich sie jedes Mal. Andernfalls würden alle (berechtigterweise) meckern.
Ich weiß: Damit bin ich ein abschreckendes Beispiel. Ich versuche mich ja zu bessern.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 23.10.12 12:53
Was die Formatierung angeht drücke ich ohnehin als erstes nach dem Öffnen fremder Quelltexte in der Regel Strg + D um den delphiinternen Codeformatter drüberlaufen zu lassen. (Ich selbst formatiere ohnehin in der Regel genauso wie der. )
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mi 24.10.12 12:18
Hallo,
ich habe erste Änderungen am Programm (Rev 1/2) vorgenommen.
Die Zugliste enthält jetzt auch die ziehende Figur. Außerdem wird angegeben, ob eine gegnerische Figur geschlagen wird. Eine Rochade und Schachdrohung wird auch notiert.
Ich bin verwundert, dass mir das erste heute aufgefallen ist.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 26.12.12 12:38
Hallo!
@ Mathematiker: Kannst du vielleicht eine Zug-Tipp-Funktion einbauen? Vielleicht auch eine Möglichkeit, das laufende Spiel zu speichern, um es zu einem späteren Zeitpunkt wieder zu laden und weiter zu spielen!
Ich bin erst vor Kurzem auf das Schachprogramm gestossen und muss sagen: Hut ab! Habe gleich verloren!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mi 26.12.12 22:22
Hallo galagher,
galagher hat folgendes geschrieben : | Kannst du vielleicht eine Zug-Tipp-Funktion einbauen? Vielleicht auch eine Möglichkeit, das laufende Spiel zu speichern, um es zu einem späteren Zeitpunkt wieder zu laden und weiter zu spielen! |
Werde ich sehen. Das wird aber nicht so schnell, da ich mich erst wieder in den etwas komplexeren Quelltext hineindenken muss. Gib mir mal 1-2 Wochen Zeit.
Beste Grüße
Mathematiker
Nachtrag: Manches geht doch schneller.
In der Revision 3 kannst Du eine Partie speichern und zu einem späteren Zeitpunkt wieder laden. Allerdings werden nur vollständige Züge gespeichert, d.h. Weiß und Schwarz müssen beide gezogen haben.
Das Problem mit dem Zugvorschlag dauert aber doch einige Zeit.
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 27.12.12 18:37
Mathematiker hat folgendes geschrieben : | In der Revision 3 kannst Du eine Partie speichern und zu einem späteren Zeitpunkt wieder laden. Allerdings werden nur vollständige Züge gespeichert, d.h. Weiß und Schwarz müssen beide gezogen haben.
Das Problem mit dem Zugvorschlag dauert aber doch einige Zeit. |
Danke! Da warte ich doch gerne drauf!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Fr 28.12.12 14:05
galagher hat folgendes geschrieben : | @Mathematiker: Kannst du vielleicht eine Zug-Tipp-Funktion einbauen? |
Jeder gute oder zumindest sorgfältige Schachspieler schläft nicht, wenn er nicht am Zuge ist, sondern denkt mit. Tut sein Gegenüber (Gegner) den erwarteten Zug, ist er im Vorteil, sowohl zeitlich als auch in bezug auf den weiteren Spielverlauf. Jedes fortgeschrittene Schachprogramm verfährt genauso, insofern sind Zugvorschläge nur ein "Abfallprodukt" des Vorausdenkens.
Ob Mathematikers Programm dieses Mitdenken schon implementiert hat, weiß ich nicht, ich stelle mir aber nicht allzu schwierig vor, das "einzupflegen", weil grundsätzlich die gleiche Minimaxstrategie, als wenn man am Zuge wäre, angewandt werden muß (müßte). Nur finalisiert das eben nicht ein einen Zug.
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Fr 28.12.12 22:10
Hallo,
so, jetzt glaube ich auch den 2.galagher-Wunsch gelöst zu haben.
Das Programm gibt nun (bis auf den allerersten Zug) auf Wunsch auch einen Zugvorschlag. Dazu analysiert ein zweiter Thread die aktuelle Spielsituation. Dieser wird aber nur aktiv, wenn erstmals ein Zugvorschlag abgerufen wird.
Ich hoffe, dass es jetzt wirklich als zweiter "richtiger" Thread durchgeht. Wenn ja, habe ich das erste Mal so etwas geschafft und gebe zu, dass ich etwas stolz bin. Einfach die bisherige Zuganalyse zu nutzen, war nicht möglich, da diese ja gerade für den nächsten Computerzug rechnet.
Rätselhaft ist mir noch, ob nun tatsächlich zwei CPU-Kerne beschäftigt sind. Wie kann ich so etwas prüfen? Im Task-Manager sehe ich nur, dass die CPU-Auslastung steigt.
Der Zugvorschlag ist im Normalfall relativ gut, natürlich nicht immer optimal; aber mein Programm ist ja auch kein Profischachprogramm.
Bei den ersten Zügen der Partie sollte man sich aber nicht auf den Vorschlag verlassen (keine Eröffnungsbibliothek, wird auch nicht, da zuviel Aufwand). Mit fortschreitender Spielentwicklung wird der Zugvorschlag kontinuierlich besser. Ist man allerdings schon am Verlieren, kann der Tipp auch nicht mehr viel nutzen.
Schön ist, dass man in der Zugliste auch einen Zug auswählen kann, zu dem die Partie zurückspringt, sich einen Vorschlag holt und damit weiter spielen kann.
Geändert habe ich auch das Speichern und Laden der Spielstände von Partien. Auch wenn im letzten Zug Schwarz noch nicht gezogen hat, wird jetzt korrekt gespeichert und geladen. Nach dem Laden kann man, wie gewohnt, weiterspielen.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
|