Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Parameterübergabe an externe .exe Datei
Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 22.11.2013, 02:20    Titel: Re: Schließen-Button des Fensters über INKEY abfragen Antworten mit Zitat

Sebastian hat Folgendes geschrieben:
ALWIM hat Folgendes geschrieben:
Nur habe ich noch keine Lösung gefunden, um das Programm mit einem Mausklick auf das X zu beenden.


Ein Klick auf das X ("Schließen-Knopf") wird als Tastenkombination an das Programm vermeldet und kann über die INKEY-Funktion erkannt werden. Siehe dazu: FreeBASIC-FAQ: Wie kann ich prüfen, ob Pfeiltasten / ESC / Enter / der Schließen-Knopf des Fensters gedrückt wurde?

In deinem Programm-Ausschnitt taucht die Variable taste auf. Hier muss natürlich sichergestellt sein, dass diese Variable vorher funktionstüchtig mit einem abgefragten Wert von INKEY belegt wird, damit das einen Sinn hat. Zudem ist die Zeile auskommentiert.

Wenn ich grindstones Code auf die Schnelle richtig überflogen habe, prüft er auf ESC-Tastendruck als Abbruchbedingung.


Die Internetseite über den Schließen-Knopf (X) kenne ich bereits! Nur funktioniert das ganze in meinem Programm noch nicht.

Geprüft, wird bei grindstones Code, aber es funktioniert nicht! Der hängt, wenn ich das richtig sehe, in einer Schleife drin! So wie bei meinem Quellcode. Deswegen die Abfrage mit dem Multikey!

Die eine Zeile habe ich bewusst auskommentiert! Ist bei meinem Programm noch funktionslos.

Man kann zwar mit den entsprechenden Bibliotheken zwischen Gui und Engine kommunizieren, aber nicht so bequem, wie bei C++? Mit C++ sollte es angeblich noch besser hinhauen? 2 Sachen die mir erst jetzt aufgefallen sind: Die Engines verwenden nur einen Kern auf dem Rechner. Können aber mehrere Kerne normalerweise verwenden. Stockfish ist eine Multiprozessorversion! Und wenn ich die Engine mit Bedenkzeit (5 Minuten pro Partie) spielen lassen will, muss ich extra was schreiben. Was natürlich sehr umständlich ist! Muss ich bei C++ wahrscheinlich auch, aber da ist es bestimmt einfacher?!

Ich muss auf jeden Fall mal ein wenig rumexperimentieren! Mal schauen was draus wird! Ich danke euch für die zahlreiche(n) Hilfe/Antworten!

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 22.11.2013, 02:29    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Noch ein kleiner Hinweis: Man kann das Programm nicht beenden, wenn es mal läuft!
Stimmt. Während der Entwicklungsphase kompiliere ich den Quelltext als Konsolenprogramm, dann kann ich es mit einem Klick auf das x im Konsolenfenster beenden.

Sebastian hat Folgendes geschrieben:
Wenn ich grindstones Code auf die Schnelle richtig überflogen habe, prüft er auf ESC-Tastendruck als Abbruchbedingung.
Eigentlich schon. Aber durch die Schleife, die nach dem Ende einer Partie eine neue startet, wird das Programm im Augenblick immer nur in die Runde geschickt. Ich werde das irgendwann noch beheben, versprochen!

ALWIM hat Folgendes geschrieben:
Die Figur wird jetzt umgewandelt, aber irgendwie schon bevor der Bauer zieht?
Ein kleiner Schönheitsfehler. Es war programmtechnisch wesentlich einfacher, das Figurenimage vor der Animation auszutauschen als am Ende bzw. danach. Aber du hast recht, es stört doch ein wenig die Optik.

Zitat:
Für das Problem mit dem Remis habe ich bereits eine Idee!
Lass mich an deinen Gedanken teilhaben. Von der Engine kommt nämlich keinerlei Hinweis.

Zitat:
3-fache Stellungswiederholung: Jede Schachstellung aufzeichnen und abfragen, wie oft jede Stellung schon vorhanden war
50-Züge-Regel: Variable immer eins hochzählen lassen.
Das ist eigentlich relativ einfach und der nächste Schritt auf meiner Liste. Ich wollte eine Funktion zum Erstellen von FEN-Strings einbauen, da kann man die Überprüfung gleich mit erledigen. Wenn man nach jedem Zug bzw. Halbzug den FEN-String in ein Array schreibt, braucht man nur jeden neuen String von hinten nach vorne mit den bereits vorhandenen Strings zu vergleichen. Bei 2 Übereinstimmungen ist dann die Partie beendet.
Ähnliches gilt für den Zügezähler, der wird für einen FEN-String ebenfalls gebraucht.

Außerdem habe ich beim Testen eine interessante Beobachtung gemacht: Bei vorgegebener Zugtiefe laufen alle Partien exakt identisch ab. Gibt man stattdessen die Zeit vor, ist jede Partie anders, was darauf schließen lässt, daß die Zuteilung der Rechenzeit nicht ganz präzise ist. Das bringt eine interessante Unschärfe in die ganze Angelegenheit und mich auf eine Idee für einen Spielmodus:
Wenn zwei Engines mit gleichen Vorgaben gegeneinander spielen, wird die bessere (fast) immer gewinnen, und man kann am Ende nichts anderes aussagen, als daß die bessere eben besser ist.
Aussagekräftiger wäre meiner bescheidenen Meinug nach fogendes Verfahren:
Die Zeit je Zug lässt sich für jede Engine einzeln einstellen. Zunächst beginnen beide Engines mit der gleichen Zeit von beispielsweise 100ms. Nach jeder Partie bekommt der Verlierer 100ms zusätzliche Zeit und wird damit stärker. Irgendwann wird sich dann ein Gleichgewicht einstellen, und am Verhältnis der Zeiten kann man dann die relative Stärke jeder Engine ablesen.

Ich habe auch noch einige Fragen:
1) Eine Schwierigkeit, mit der ich eigentlich nicht gerechnet hatte, ist die Kennzeichnung der Engines für "Matt". Stockfish gibt dann "(none)" zurück, Fruit "a1a1". Außerdem hängt Fruit an ihren letzten Zug, wenn dieser zum Matt führt, ein Chr(13,10) an. Haben andere Engines ähnliche Überraschungen parat? Dann müsste man das Programm an jede neue Engine extra anpassen.

2) Kann mir jemand sagen, warum die Fenster der Engines nicht zu sehen ist, obwohl das wShowWindow - Flag auf "SW_SHOW" steht?

3) Welche Funktion hat der Befehl
Code:
SetHandleInformation(hWritePipeWhite,HANDLE_FLAG_INHERIT,0)
Ich habe die Zeilen vorsichtshalber mal dringelassen, obwohl das Program (zumindest auf den ersten Blick) auch problemlos läuft, wenn ich sie auskommentiere.

4) Hat es einen besonderen Grund, daß VANYA den movestring ausgerechnet "hod" genannt hat?

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 22.11.2013, 02:47    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
3) Welche Funktion hat der Befehl
Code:
SetHandleInformation(hWritePipeWhite,HANDLE_FLAG_INHERIT,0)
Ich habe die Zeilen vorsichtshalber mal dringelassen, obwohl das Program (zumindest auf den ersten Blick) auch problemlos läuft, wenn ich sie auskommentiere.

Wenn du einen Kindprozess per CreateProcess erstellen würdest, könnte dieser das Pipe-Handle nicht erben. Das sollte Standardmäßig auch so sein, wenn man keine Security-Attribute beim Erstellen der Pipe angibt, und ist in dem Kontext höchstwahrscheinlich irrelevant (ich hab mir dein Programm nicht angeschaut, aber wie gesagt, wenn kein CreateProcess verwendet wird oder das Handle an keinen Kindprozess weitergereicht wird, ist es irrelevant)
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 22.11.2013, 13:11    Titel: Antworten mit Zitat

@Jojo: Vielen Dank für die schnelle Antwort.
Hilf bitte meinem fundierten Halbwissen auf die Sprünge: Was genau heißt hier "erben"? Die Engines werden beide mit "CreateProcess " gestartet, sind also -soweit ich es verstanden habe- Kindprozesse der "engine_vs_engine". Das Programm läuft -ich habe es gerade noch einmal ausprobiert- auch ohne die "SetHandleInformation"-Zeilen. Dann hieße "erben" also, daß die Engines das Handle ihrerseits an einen von ihnen gestarteten Kindprosess -also sozusagen einen "Enkelprozess" von "engine_vs_engine" weitergeben könnten, daß also der "Enkelprozess" über die Pipe direkt mit der "engine_vs_engine" kommunizieren könnte. Habe ich das richtig verstanden?

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 22.11.2013, 16:50    Titel: Antworten mit Zitat

Erben heißt in dem Fall, dass dem Kindprozess dasselbe Handle mit denselben Rechten zur Verfügung steht. In diesem Fall ist das explizite Angeben einer solchen Erlaubnis aber nicht nötig, da über den Parameter "siWhite" von CreateProcess (in connect_engines.bi") bereits festgelegt wird, dass das Programm auf bestimmten Pipes schreiben oder lesen soll, d.h. der Kindprozess braucht das Handle nicht zu kennen, Windows übernimmt das. Alternativ könnte aber der Elternprozess beispielsweise dem Kindprozess dies Pipe-Handles als Kommandozeilen-Parameter übergeben (ist ja nichts weiter als ein Integer) und der Kindprozess öffnet dann die Pipes anhand der übergebenen Handles öffnen. In diesem Fall müssten die Handles vererbbar sein.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 23.11.2013, 08:01    Titel: Antworten mit Zitat

Also heißt "vererben" im Grunde nichts anderes als die Vergabe von Nutzungsrechten - so wie die Lizenz bei einem Patent, richtig?
Dann müsste ich ja auch bInheritHandles bei den CreateProcess-Parametern auf FALSE bzw. 0 setzen können.

Außerdem:
grindstone hat Folgendes geschrieben:
2) Kann mir jemand sagen, warum die Fenster der Engines nicht zu sehen ist, obwohl das wShowWindow - Flag auf "SW_SHOW" steht?
Das habe ich inzwischen herausgefunden. In der verwendeten Konstellation wird nur dann etwas angezeigt, wenn das gestartete Programm eine eigene Windows-GUI hat (wie etwa Voltas TrackBar Demo). Ein Konsolenprogramm hat überhaupt kein Fenster (auch kein verstecktes). Um ein solches Fenster zu erzeugen, muß die Zeile
Code:
CreateProcess(0,engineWhite,0,0,TRUE,0,0,0,@siWhite,@pi)
in
Code:
CreateProcess(0,engineWhite,0,0,TRUE,CREATE_NEW_CONSOLE,0,0,@siWhite,@pi)
geändert werden. Allerdings macht das in diesem Programm wenig Sinn, da wegen der Umleitung durch die Pipes in dem Fenster nichts passiert.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 23.11.2013, 21:08    Titel: Antworten mit Zitat

Zitat:
Dann müsste ich ja auch bInheritHandles bei den CreateProcess-Parametern auf FALSE bzw. 0 setzen können.

Das sollte an sich möglich sein, ja. Den Wert sollte man nur auf TRUE setzen, wenn es tatsächlich benötigt wird.
Und ja, wenn du die Konsolenausgabe durch eigene pipes jagst, macht es keinen Sinn, dem Programm ein Konsolenfenster zu spendieren - die Ausgabe musst du dann schon in deinem Programm durchführen.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 24.11.2013, 01:42    Titel: Antworten mit Zitat

Zitat:
Dann müsste ich ja auch bInheritHandles bei den CreateProcess-Parametern auf FALSE bzw. 0 setzen können.
Mit dieser Annahme habe ich falsch gelegen. Mit bInheritHandles auf FALSE funktioniert die Kommunikation nicht mehr. Das Flag wirkt sich also auch auf die "stillschweigende" Vererbung durch das Betriebssystem aus.

Und noch eine Korrektur: Der von mir beschriebene Effekt mit dem wShowWindow - Flag tritt nur bei Kompilierung als Konsolenprogramm auf. Als GUI-Programm -also ohne daß zusätzlich noch ein Konsolenfenster erscheint- erscheinen die Fenster der Engines wie mit wShowWindow festgelegt. Das Flag muß also auf SW_HIDE gesetzt werden.

@ALWIM: Werden bei der 50-Züge-Regel Züge oder Halbzüge gezählt?

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 26.11.2013, 02:16    Titel: Antworten mit Zitat

Hier die neueste Version der chess_gui_engine_vs_engine (Entschuldigung für den verunglückten Titel, da war ich wohl etwas zu hastig). verlegen
Langsam nimmt die Sache Gestalt an. Das Programm kann FEN-Strings erzeugen, erkennt 3fache Stellungswiederholung, König-König, König-König-Läufer, König-König-Springer und die 50-Züge-Regel, nur die Remis - Erkennung für den Fall, daß der König sich ins Schach setzen muß, funktioniert noch nicht. Vielleicht weiss einer von den Schachexperten im Hintegrund ja, wie man das umsetzen könnte.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Roland Chastain



Anmeldungsdatum: 05.12.2011
Beiträge: 192
Wohnort: Frankreich

BeitragVerfasst am: 26.11.2013, 05:53    Titel: Antworten mit Zitat

Hallo grindstone !

Gute Arbeit, sehr interessant Beitrag. Daumen rauf!

grindstone hat Folgendes geschrieben:
nur die Remis - Erkennung für den Fall, daß der König sich ins Schach setzen muß, funktioniert noch nicht.


Es ist nicht möglich, zu kennen ab FEN Zeichenkette, ob es gibt ein Patt. Du muß ein Schachprogramm schreiben, und legale Züge berechnen.

Gibt es ein Problem mit TerminateProcess() ?

Zitat:
Command executed:
"C:\FreeBASIC\fbc.exe" "C:\Atelier\Basic\ChessProtocols\UCI\fbporticula1670.bas"

Compiler output:
C:\Atelier\Basic\ChessProtocols\UCI\fbporticula1670.bas(895) warning 2(1): Passing pointer to scalar, at parameter 2 of TERMINATEPROCESS()
C:\Atelier\Basic\ChessProtocols\UCI\fbporticula1670.bas(896) warning 2(1): Passing pointer to scalar, at parameter 2 of TERMINATEPROCESS()

Results:
Compilation successful
Generated executable: C:\Atelier\Basic\ChessProtocols\UCI\fbporticula1670.exe

System:
FBIde: 0.4.6
fbc: FreeBASIC Compiler - Version 0.90.0 (06-23-2013) for win32
OS: Windows NT 6.2 (build 9200)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 26.11.2013, 08:46    Titel: Antworten mit Zitat

Hallo Roland Chastain!

Roland Chastain hat Folgendes geschrieben:
Gute Arbeit, sehr interessant Beitrag. Daumen rauf!
Danke, das geht mir runter wie Öl happy

Zitat:
Es ist nicht möglich, zu kennen ab FEN Zeichenkette, ob es gibt ein Patt
Eigentlich schon. Zum Beispiel dieser hier (zugegeben, konstruiert):
    3b4/7r/K7/8/k7/8/8/8 w - - 3 26
Also weißer König auf A6, schwarzer König auf A4, schwarzer Turm auf H7 und schwarzer Läufer auf D8 mit Weiß am Zug. Jeder Zug, den Weiß ausführen kann, würde den König ins Schach setzen. Das müsste eine Engine erkennen können. Ich werde mal eine Engine mit diesem FEN-String füttern und mir ansehen, was sie zurückmeldet. Vielleicht lässt sich daraus ja etwas eindeutiges ableiten.
Die Erstellung des FEN-Strings ist eigentlich nur ein Abfallprodukt. Der vordere Teil des Strings mit der Figurenaufstellung ist ideal zur Überprüfung der Stellungswiederholung, da habe ich dann den Rest auch noch erstellt, ohne im Augenblick eine Verwendung dafür zu haben. Aber wer weiss, vielleicht ergibt sich ja noch etwas.
Die Engines arbeiten in diesem Programm mit der Liste aller Züge ab Spielbeginn, aus der sich der Verlauf der Partie eindeutig rekonstruieren lässt.

Zitat:
Gibt es ein Problem mit TerminateProcess()
Nein, diese Meldung gibt der Kompiler immer heraus, wenn ein Pointer explizit zugewiesen wird. Das ist nur eine Vorsichtsmaßnahme, da solche Zuweisungen schwer nachvollziehbare Programmabstürze verursachen können, wenn sie unabsichtlich erfolgen.

Und dann noch eine Frage:
Ist die Zählung der Halbzüge für die 50-Züge-Regel so richtig?

EDIT: Ich habe beiden Engines den o.g. FEN-String geschickt und sie dann ziehen lassen. Die Rückmeldungen sind dieselben wie bei Matt. traurig Ich fürchte, jetzt wird die Sache kompliziert.

EDIT2: Eigentlich doch nicht. Ich muß mir nur die Figur ansehen, die als letzte bewegt wurde und prüfen, ob diese mir gerade Schach bietet.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Roland Chastain



Anmeldungsdatum: 05.12.2011
Beiträge: 192
Wohnort: Frankreich

BeitragVerfasst am: 26.11.2013, 13:57    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Und dann noch eine Frage:
Ist die Zählung der Halbzüge für die 50-Züge-Regel so richtig?


Code:
if (movedPiece = pawn) or (targetSquare <> emptySquare) then
  count50 = 0
else
  count50 += 1
end if


Code:
if count50 = 50 then drawFlag = 3
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 27.11.2013, 09:54    Titel: Antworten mit Zitat

Hallo Roland Chastain!

In deinem Programmbeispiel zählst du nur die Halbzüge, es sei denn, dieser Programmabschnitt wird nur ausgeführt, wenn Weiß am Zug ist. Laut Wikipedia lautet die Regel
Zitat:
Die 50-Züge-Regel beim Schach besagt, dass eine Partie als remis (unentschieden) zu werten ist, wenn einer der beiden Spieler nachweist, dass die letzten 50 aufeinanderfolgenden Züge eines jeden Spielers geschehen sind, ohne dass ein Stein geschlagen oder ein Bauer gezogen wurde.
und in der Beschreibung des FEN-Strings (ebenfalls von Wikipedia) steht:
Zitat:
In der 5. Gruppe wird die Anzahl der Halbzüge seit dem letzten Bauernzug bzw. des Schlagens einer Figur angegeben. Dieser Wert ist wichtig, um die 50-Züge-Remisregel zu überwachen.
Das verstehe ich so, daß jeder Spieler 50mal gezogen haben muß (2 Spieler X 50 Halbzüge = 100 Halbzüge).

Damit wir nicht aneinander vorbeireden: Ein Halbzug ist, wenn einer der Spieler eine Figur gezogen hat, ein Zug ist, wenn erst der weiße und dann der schwarze Spieler je einmal ihre Figur gezogen haben.

Also denke ich, daß es richtig ist, die Halbzüge zu zählen. Ich bin mir nur nicht sicher, ob ich im Programm mit dem Zählen nicht einen Halbzug zu spät oder zu früh beginne.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 28.11.2013, 10:19    Titel: Antworten mit Zitat

Hier die nächste Version der chess_gui_engine_vs_engine mit kompletter (und hoffentlich korrekter) Remis-Erkennung. Die Zeitkonstanten sind diesmal auf Super-Turbo-Schnelltestmodus eingestellt, wem das zu hektisch ist, möge sie bitte entsprechend ändern.

grindstone hat Folgendes geschrieben:
Ich muß mir nur die Figur ansehen, die als letzte bewegt wurde und prüfen, ob diese mir gerade Schach bietet.
Ganz so einfach war es dann doch nicht, aber ich glaube, ich habe es ganz gut hingekriegt.

@Roland Chastain: Ist die Engine von deinem Eschecs UCI-fähig? Ich würde sie gerne einmal ausprobieren.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Roland Chastain



Anmeldungsdatum: 05.12.2011
Beiträge: 192
Wohnort: Frankreich

BeitragVerfasst am: 28.11.2013, 14:44    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
@Roland Chastain: Ist die Engine von deinem Eschecs UCI-fähig?


Nein. Ich beherrsche das UCI Protokoll nicht. Deswegen interessieren mich deine Beispiele. lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 28.11.2013, 16:57    Titel: Antworten mit Zitat

Ohne viel Kommentar zum Thema UCI:

http://de.wikipedia.org/wiki/Universal_Chess_Interface

Für genaue Details am besten einmal einen Wireshark-Mitschnitt (Tracefile) anfertigen -> bereits existierender Schach-Client verwenden und auf einen bestehenden Schachserver verbinden.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 29.11.2013, 11:13    Titel: Antworten mit Zitat

Die engine_vs_engine legt zu Beginn jeder Partie eine Protokolldatei namens "responselog.txt" an, in der alle Antworten der Engines aufgezeichnet werden, was mir beim Programmentwickeln sehr geholfen hat. In der nächsten Version heißt diese Datei "ucilog.txt" und zeichnet die gesamte Kommunikation zwischen Programm und Engines auf.

@Roland Chastain: Vielleicht können wir uns ja gemeinsam darum bemühen, Eschecs UCI-fähig zu machen. Ich habe das Programm nur einmal kurz überflogen, aber soweit ich sehen konnte, kommuniziert die Engine mit der GUI über normale Textein- und ausgabe. Da kann es doch eigentlich nicht allzu schwer sein, ein Interface zu programmieren, das die Meldungen entsprechend übersetzt.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Roland Chastain



Anmeldungsdatum: 05.12.2011
Beiträge: 192
Wohnort: Frankreich

BeitragVerfasst am: 29.11.2013, 13:39    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
@Roland Chastain: Vielleicht können wir uns ja gemeinsam darum bemühen, Eschecs UCI-fähig zu machen.


Ja, gern !

grindstone hat Folgendes geschrieben:
Ich habe das Programm nur einmal kurz überflogen, aber soweit ich sehen konnte, kommuniziert die Engine mit der GUI über normale Textein- und ausgabe.


Genau.

Code:
' .\engine\JSCP.bas

#include "engine.bas"

dim JSCP as tChessEngine

JSCP.Initialize(command(1))
print JSCP.EngineMove


Code:
' .\engine\test08.bas

const engine = "JSCP.exe"

dim as string FEN(1 to 5) = {_
  "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", _
  "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1", _
  "rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 0 2", _
  "rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2", _
  "4k3/8/8/8/8/8/4P3/4K3 w - - 5 39" _
}

declare function Exists(file as string) as integer
declare function EngineMove(exe as string, param as string) as string

dim move as string

open "test08.txt" for output as #1

if Exists(engine) then
  move = EngineMove(engine, FEN(1))
  print #1, left(move, 4)
else
  print #1, "Executable not found"
end if

close #1

function Exists(file as string) as integer
  return len(dir(file)) > 0
end function

function EngineMove(exe as string, param as string) as string
  dim n as ubyte = freefile
  open pipe exe & " " & """" & param & """" for input as #n
  dim as string s
  line input #n, s
  close #n
  function = s
end function
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 29.11.2013, 13:48    Titel: Antworten mit Zitat

Durch ein technisches Problem gab es gerade einen Triple-Post. Ist schon wieder weg.
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Roland Chastain



Anmeldungsdatum: 05.12.2011
Beiträge: 192
Wohnort: Frankreich

BeitragVerfasst am: 29.11.2013, 13:58    Titel: Antworten mit Zitat

Sebastian hat Folgendes geschrieben:
Durch ein technisches Problem gab es gerade einen Triple-Post. Ist schon wieder weg.


Danke, Sebastian.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
Seite 3 von 4

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz