Not logged inCSS-Forum
Forum CSS-Online Help Search Login
CSS-Shop Impressum Datenschutz
Up Topic Hauptforen / Schachprogrammierung / Erstes eigenes Schachprogramm schreiben
- - By Tommy Tulpe Date 2023-12-20 21:06 Upvotes 1
Hallo zusammen,
vor kurzem wurde ich nach Erreichen der gesetzlichen Altersgrenze in den Ruhestand versetzt und hatte mir eigentlich als Traum vorgenommen, eine eigene Schach-Engine zu entwickeln.
* Natürlich soll es eine UCI Engine werden. Ich möchte mich mit einer Gestaltung der GUI herum schlagen, wenn andere das schon entwickelt haben.
* Es kommt mir (zunächst mall) übedrhaupt nicht auf hohe Spielstärke an.
* Mathematik, Gleichungen lösen, Formeln umstellen usw. bereitet mir keine Schwierigkeiten. Habe Mathematik studiert.
* Vor rund 40(!) Jahren habe ich ein wenig in BASIC und Pascal programmiert, kurz auch noch in Delphi. Ganz kleine Sachen: Primzahlerkennung, Sortierverfahren, Kopfrechentrainer, ...   Seitdem überhaupt nichts mehr.
* Ich bin nicht bereit, sehr viel Geld auszugeben für das Programmiersprachen-Paket.

Wer möchte mir einen Rat geben, wie ich mein Projekt am besten anfangen soll? Welche Programmiersprache? Auf Spielstärke und damit auf Geschwindigkeit kommt es mir erst mal nicht an. Also eher eine einfache Sprache. Woher weiß ich, welche Parameter von der GUI an die Engine gegeben werden und welche zurück gegeben werden müssen, um den Zug auszuführen?

Fragen, Fragen, Fragen....  
Danke für Antworten.
Parent - - By Lothar Jung Date 2023-12-20 22:12 Upvotes 1
Ich würde dir C empfehlen.
Hier ein Schachprogramm dazu: http://www.tckerrigan.com/Chess/TSCP/
Dieses Unterforum bietet daneben eine Menge Beispiele und Anregungen mit Code.
Parent - - By Stefan Pohl Date 2024-01-30 06:31 Upvotes 1
Lothar Jung schrieb:

Ich würde dir C empfehlen.
Hier ein Schachprogramm dazu: <a class='ura' href='http://www.tckerrigan.com/Chess/TSCP/'>http://www.tckerrigan.com/Chess/TSCP/</a>
Dieses Unterforum bietet daneben eine Menge Beispiele und Anregungen mit Code.


Da stimme ich zu. C hat den großen Vorteil, daß man selbst entscheiden kann, wie maschinennah man programmiert. Einer meiner Professoren damals an der Uni sagte dazu: Man kann in C so sauber programmieren (und es gibt auch alle Befehle dafür), daß C fast richtigen Hochsprachen wie eben Pascal/Modula2 etc. entspricht. Aber man kann eben auch sehr maschinennah programmieren, da es auch diese Befehle gibt - C kann man auch so benutzen, daß das Programm schon (fast) wie ein Makroassembler-Code aussieht. Das ist dann alles schwer lesbar, aber eben auch sauschnell.
Aber: C erfordert "Disziplin". Denn die Compiler winken fast alles durch. Selbst fehlende Parameter bei einem Prozeduraufruf ergeben oft nur eine Warning, keinen Abbruch mit Fehlemeldung. Hat ein Parameter ein falsches Datenformat (Klassiker ist verwechslung von INT und Long INT), geht das vielen C-Compilern am Ar... vorbei. Das kann in der Praxis dann zu echt heftige Abstürzen führen, die dann schwer im Sourcecode zu lokalisieren sind. Und nutzt man die Pointer-Befehle (Zeiger auf eine Adresse im Speicher), die sich auch noch schachteln lassen (Pointer auf einen Pointer auf eine Adresse...), bekommt man schnell einen "Knoten im Gehirn".
Ich bin damals selbst von Pascal gekommen und konnte in C sofort losprogrammieren. Das war eigentlich gar keine so große Umstellung.
Parent - By Lothar Jung Date 2024-01-30 08:46 Edited 2024-01-30 09:11 Upvotes 1
Ich hatte damals von Tom Kerrigan schriftlich die Erlaubnis für das Forum erhalten sein C-Schachprogramm zu verwenden und Erweiterungen zu schreiben.

TSCP has the following features:
Only 2,248 lines of C code
Lots of comments!
Written for clarity (not speed or strength)
Observes all rules of chess
Opening book
xboard compatible
Requires less than 64KB of RAM

Dabei möchte ich 2 Punkte hervorheben:
Über die xboard Kompatibilität hat man sofort eine grafische Ausgabe und Bedienung des Schachbretts.
Die Größe des Programms paßt in den CPU-Cache!

Das Programm ist sehr gut dokumentiert und er macht Vorschläge für die Erweiterung.
Hier die bereits bestehen Erweiterungen: http://www.tckerrigan.com/Chess/TSCP/Community/
Es hat schon jetzt eine Spielstärke von rd. 2.000 Elo.
Ein bestehendes Rumpfprogramm läßt sich Schritt für Schritt viel leichter erweitern, als alles von Grund auf selber zu schreiben.
Man würde ohnehin die jeweiligen Algorithmen verwenden.
Kein Schachprogrammierer hat bei Null angefangen!
Wichtig sind die Verknüpfung der Programmabläufe.

Die derzeitigen Entwicklungsumgebungen (IDEs), können dabei helfen, fehlerfreien Code in C zu schreiben. Diese Tools bieten in der Regel Funktionen wie Syntaxhervorhebung, Code-Vervollständigung, Debugging-Tools und oft auch statische Code-Analyse, die helfen können, Fehler im Code zu identifizieren und zu korrigieren.
Parent - By Peter Martan Date 2023-12-20 22:44 Edited 2023-12-20 22:46 Upvotes 2
Parent - By Lothar Jung Date 2023-12-21 07:19 Upvotes 1
Natürlich auch Python.
Da es schon eine fertige allgemeine Codebasis gibt.
https://forum.computerschach.de/cgi-bin/mwf/topic_show.pl?tid=12459
Parent - - By Lars B. Date 2024-01-28 19:59 Upvotes 1
Falls es noch aktuell sein sollte: Wenn Du schon Pascal und sogar Delphi benutzt hast, könnte Lazarus was für Dich sein: https://www.lazarus-ide.org/. Das ist so eine Art quelloffenes und kostenloses Delphi, basierend auf FreePascal, es funktioniert systemübergreifend, gibt's also für Windows und Linux, und ich glaube sogar für Mac, und es ist schon länger auf einem Entwicklungsstand, der eine bedenkenlose Empfehlung rechtfertigt. Es ist natürlich besonders geeignet für Sachen, die auch eine GUI haben, aber man kann damit auch Kommandozeilenprogramme bauen, und die laufen sogar ziemlich schnell. Pascal ist auch eine recht angenehme Sprache, vermutlich die unterschätzteste; ich mache recht oft was damit, auch wenn ich für zeitkritische Sachen C vorziehe.

Python ist eine nette Sache, aber für Schachengines natürlich nicht besonders empfehlenswert; die Stärken liegen auf anderem Gebiet.
Parent - - By Frank Meißen Date 2025-03-09 10:33
Lars B. schrieb:

Falls es noch aktuell sein sollte: Wenn Du schon Pascal und sogar Delphi benutzt hast, könnte Lazarus was für Dich sein: <a class='ura' href='https://www.lazarus-ide.org/.'>https://www.lazarus-ide.org/.</a> Das ist so eine Art quelloffenes und kostenloses Delphi, basierend auf FreePascal, es funktioniert systemübergreifend, gibt's also für Windows und Linux, und ich glaube sogar für Mac, und es ist schon länger auf einem Entwicklungsstand, der eine bedenkenlose Empfehlung rechtfertigt. Es ist natürlich besonders geeignet für Sachen, die auch eine GUI haben, aber man kann damit auch Kommandozeilenprogramme bauen, und die laufen sogar ziemlich schnell. Pascal ist auch eine recht angenehme Sprache, vermutlich die unterschätzteste; ich mache recht oft was damit, auch wenn ich für zeitkritische Sachen C vorziehe.

Python ist eine nette Sache, aber für Schachengines natürlich nicht besonders empfehlenswert; die Stärken liegen auf anderem Gebiet.


Hallo Lars,

in der Tat gibt es Lazarus (aktuell Version 3.8) sowie FreePascal (Version 3.2.2) für macOS.
Hast du einen Tipp, wo ich Informationen finde, um ein Pascal-Programm mit UCI-Schnittstelle (für die HCEPro-GUI) zu entwickeln und zu starten? Ziel ist nicht unbedingt, ein besonders starkes Programm zu schreiben – ich wäre schon froh, wenn es überhaupt spielt und ich es über Bewertungsfunktionen tunen kann.

LG
Frank
Parent - - By Lothar Jung Date 2025-03-09 11:37 Upvotes 1
Vielleicht hilft das:
Ein Schachprogramm in Pascal mit einer UCI-Schnittstelle (Universal Chess Interface) ist möglich, erfordert aber einige wesentliche Komponenten:
  1.  Schach-Engine: Eine Implementierung der Spielmechanik mit Brettrepräsentation, legalen Zügen, Bewertung und Suchalgorithmen.
  2.  UCI-Parser: Ein System, das UCI-Befehle auswertet und entsprechend darauf reagiert.
  3.  Kommandozeilen-Interaktion: Ein einfacher Ein-/Ausgabe-Mechanismus zur Kommunikation mit einer Schach-GUI wie Arena oder Cute Chess.

Hier ist ein einfaches UCI-Schachprogramm in Pascal, das die grundlegende Kommunikation mit einer GUI ermöglicht. Die Engine macht zufällige Züge (statt einer echten Bewertung), aber sie kann als Basis für eine komplexere Engine dienen.



Schachprogramm mit UCI in Free Pascal

Dieses Beispiel kann mit Free Pascal (FPC) oder Lazarus kompiliert werden.

program SimpleUCI;

{$mode objfpc}  // Erlaubt moderne Pascal-Syntax

uses
  SysUtils;

var
  command: string;

procedure SendMove;
begin
  // Hier müsste eine echte Engine den besten Zug berechnen.
  // Zur Demonstration wird ein statischer Zug zurückgegeben.
  writeln('bestmove e2e4');
end;

begin
  writeln('id name SimpleUCI');
  writeln('id author PascalCoder');
  writeln('uciok');

  repeat
    readln(command);
   
    if command = 'uci' then
    begin
      writeln('id name SimpleUCI');
      writeln('id author PascalCoder');
      writeln('uciok');
    end
    else if command = 'isready' then
    begin
      writeln('readyok');
    end
    else if Pos('position', command) = 1 then
    begin
      // Eine echte Engine würde hier die Stellung analysieren.
    end
    else if Pos('go', command) = 1 then
    begin
      SendMove;
    end
    else if command = 'quit' then
    begin
      halt;
    end;
   
  until False;
end.



Erklärung des Codes
  •  Das Programm wartet auf UCI-Befehle und reagiert entsprechend.
  •  uci → Antwortet mit dem Namen und Autor der Engine.
  •  isready → Antwortet mit readyok.
  •  position ... → In einer echten Engine würde hier das Brett gesetzt.
  •  go → Berechnet und sendet einen Zug (aktuell nur e2e4 als Dummy-Zug).
  •  quit → Beendet das Programm.



Kompilieren und Testen
  1.  Speichere den Code als simpleuci.pas.
  2.  Kompiliere mit Free Pascal:

fpc simpleuci.pas -oSimpleUCI.exe

  3.  Teste es in einer Schach-GUI wie Arena oder Cute Chess:
  •  Füge die Engine als UCI-Engine hinzu.
  •  Starte ein Spiel und beobachte die Kommunikation.



Erweiterungsmöglichkeiten
  •  Legal Move Generator: Implementiere eine Funktion, die nur legale Züge zurückgibt.
  •  Alpha-Beta-Suche: Verbessere die Engine mit einem Suchalgorithmus.
  •  Zugbewertung: Füge eine Bewertungsfunktion hinzu, um stärkere Züge auszuwählen.
  •  Board Representation: Verwende eine effiziente Brettdarstellung (z. B. Bitboards).

Dieses Grundgerüst bietet eine solide Basis für eine Schach-Engine in Pascal mit UCI-Unterstützung.
Parent - By Frank Meißen Date 2025-03-10 18:20
Thx Lothar!
Lothar Jung schrieb:

...snip...
Parent - - By Lars B. Date 2025-03-10 07:41 Upvotes 1
Moin Frank,

ich an Deiner Stelle würde mir eine existierende Engine angucken, die in Pascal/Delphi/Lazarus geschrieben ist, um sowas zu verstehen und zu lernen. Muß es ja geben. Ein schnell gegoogeltes Beispiel: https://codeberg.org/rchastain/alouette
Gibt bestimmt noch viele mehr. www.chessprogramming.org ist auch immer ein guter Start für eigene Recherchen. Natürlich kannst Du Dir sowas sicherlich auch von irgendeiner "KI" auswerfen lassen, falls es Dich beglückt, der Realitätstentakel eines generativen Sprachmodells zu sein.

VG
Lars
Parent - By Frank Meißen Date 2025-03-10 18:19
Thx Lars!
Lars B. schrieb:

...snip...
Parent - By Jörg Oster Date 2025-03-25 18:20 Upvotes 1
Lars B. schrieb:

Falls es noch aktuell sein sollte: Wenn Du schon Pascal und sogar Delphi benutzt hast, könnte Lazarus was für Dich sein: <a class='ura' href='https://www.lazarus-ide.org/.'>https://www.lazarus-ide.org/.</a> Das ist so eine Art quelloffenes und kostenloses Delphi, basierend auf FreePascal, es funktioniert systemübergreifend, gibt's also für Windows und Linux, und ich glaube sogar für Mac, und es ist schon länger auf einem Entwicklungsstand, der eine bedenkenlose Empfehlung rechtfertigt. Es ist natürlich besonders geeignet für Sachen, die auch eine GUI haben, aber man kann damit auch Kommandozeilenprogramme bauen, und die laufen sogar ziemlich schnell. Pascal ist auch eine recht angenehme Sprache, vermutlich die unterschätzteste; ich mache recht oft was damit, auch wenn ich für zeitkritische Sachen C vorziehe.

Python ist eine nette Sache, aber für Schachengines natürlich nicht besonders empfehlenswert; die Stärken liegen auf anderem Gebiet.

Gerade für Python gibt es eine gute und ausgereifte Bibliothek mit python-chess, die einem vieles abnimmt.
Um mal erste Erfahrungen zu sammeln nicht die schlechteste Wahl, finde ich zumindest.
Sogar TB-Anbindung ist schon eingebaut. Siehe https://github.com/niklasf/python-chess
Als Beispielengine sei hier a0lite erwähnt.
Und die "Lernhürde" liegt hier wesentlich niedriger als z. B. für C++ ...
Parent - By Wolfram Bernhardt Date 2024-01-29 18:09 Upvotes 1
Hi!

Wenn es Dir darum ginge, zu verstehen, wie ein Computer funktioniert, würde ich auch C empfehlen. Aber willst Du ja nicht.

Pascal/Delphi/Lazars ist eine gute Empfehlung, der schliesse ich mich gerne an.

Selber programmiere ich vor allem in C# - das kann ich auch sehr empfehlen. Für ein Schachprogramm brauchst Du nur einen kleinen Teil der Möglichkeiten von C# - und das ist völlig im Ordnung. Nicht davon abschrecken lassen, dass so viel Weiteres in die Sprache eingebaut wurde, dass man gerade am Anfang den Wald vor lauter Bäumen aus den Augen verliert.

Viele Grüße
     Wolfram
Up Topic Hauptforen / Schachprogrammierung / Erstes eigenes Schachprogramm schreiben

Powered by mwForum 2.29.3 © 1999-2014 Markus Wichitill