|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 15.12.2013, 19:37 Titel: Colochessum Schach-GUI |
|
|
Hallo allerseits,
nachdem ich nun mehere Wochen an einem Programm mit dem wenig phantasievollen Namen engine_vs_engine gewerkelt habe, habe ich mich nun, nachdem es einigermaßen rund läuft, entschlossen, es unter dem Namen Colochessum zum Projekt zu erheben.
Der Thread, der zu diesem Projekt geführt hat, ist hier zu finden.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 31.12.2013, 13:01 Titel: |
|
|
Hallo, liebe Schachfreunde!
Hier die neueste Version Colochessum 0.2.
Es hat einen neuen Spielmodus "gametime", bei dem -wie bei einem "richtigen" Schachturnier- jeder Gegner eine bestimmte Spielzeit bekommt, die herunterläuft, solange er am Zug ist.
Die Handicap - Funktion wurde dahingehend verändert, daß nicht nur der Verlierer mehr Rechenzeit bekommt, sondern gleichzeitig diese Zeit dem Gewinner abgezogen wird. Damit wird verhindert, daß die Partien immer länger werden. Außerdem wird der Prozentwert des Handicaps angezeigt, so daß man daran -sobald er sich nach einigen Partien eingependelt hat- direkt das Stärkeverhältnis der Engines ablesen kann.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 10.01.2014, 21:14 Titel: |
|
|
Hier Colochessum 0.3.
Es lassen sich jetzt die Optionen der gegeneinander spielenden Engines einstellen. Die Einstellungen werden in der setup.ini gespeichert, und zwar abhängig davon, ob die Engine als engine1 oder engine2 bei der GUI angemeldet ist, so daß dieselbe Engine mit unterschiedlichen Setups gegen sich selbst spielen kann.
Außerdem wurde der Darstellungsfehler beim 'en passant' - Schlagen behoben. Der geschlagene Bauer wird jetzt vom Brett entfernt.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Roland Chastain
Anmeldungsdatum: 05.12.2011 Beiträge: 192 Wohnort: Frankreich
|
Verfasst am: 11.01.2014, 14:14 Titel: |
|
|
Immer sehr interessant, aber... 99 ko !
Wäre es nicht möglich, das Code leichter zu machen ?
Gruß
Roland |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 12.01.2014, 01:38 Titel: |
|
|
Roland Chastain hat Folgendes geschrieben: | Wäre es nicht möglich, das Code leichter zu machen ? | Der Programmcode lässt sich sicher noch optimieren, wenn beispielsweise nach Abschluß der Entwicklungsphase die ganzen Teststrings und Kontrollmeldungen überflüssig werden, aber die Vielzahl an Funktionen hat halt ihren Preis.
Das Programm ist ja nicht als Bedienoberfläche zum Schachspielen gedacht (auch wenn ein "human interface" der nächste Punkt in meiner Planung ist, insofern wird das mit der Dateigröße eher noch schlimmer), sondern als Testwerkzeug, das mit jeder (UCI-fähigen) Schachengine zurechtkommen soll (und das gleich zweimal). Und auf die Kommentierung möchte ich auch nicht verzichten, schließlich ist es die Grundlage des Open Source - Gedankens, daß die Funktionsweise eines Programms auch für Außenstehende nachvollziehbar ist.
Außerdem: Bei den heutigen Speichergrößen und Übertragungsraten dürften 100 kB doch nun wirklich kein Problem darstellen.
Gruß
grindstone
PS: Ich habe in Colochessum 0.3 einen (weiteren) Fehler entdeckt: Eine Partie wird bereits nach zweimaliger Stellungswiederholung Remis gewertet. Die Zeile Code: | For x = UBound(fen) To 1 Step -1 | im Hauptprogramm im Programmblock "'check for threefold repetition" muß geändert werden in Code: | For x = UBound(fen) - 1 To 1 Step -1 | Dann funktioniert die Erkennung korrekt. _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 29.01.2014, 10:29 Titel: |
|
|
Hier Colochessum 0.4.
Ich habe einige Fehler behoben, wie die schon erwähnte falsche Auswertung der Stellungswiederholung, außerdem fühlt der König sich bei der Prüfung auf Schach jetzt nicht mehr von seinem eigenen Springer bedroht.
Dazu gibt es jetzt als Zusatzprogramm ein Human interface, mit dem man gegen jede Engine spielen kann, die sich in Colochessum einhängen lässt. Das Human interface muß als Konsolenprogramm kompiliert und unter dem Namen "human.exe" im "engines" - Ordner von Colochessum abgelegt werden.
Es ist noch nicht ganz komplett, beispielsweise lässt sich das Schachbrett (noch) nicht umdrehen, wenn man mit Schwarz spielt, und es gibt auch noch keine Zugzurücknahme (schließlich will man ja auch mal gewinnen ).
Außerdem scheint die Erkennung der erlaubten Züge - speziell bei Königszügen - nicht immer korrekt zu funktionieren, auch wenn sich bei mir bis jetzt keiner der Fehler reproduzieren liess.
@Roland Chastain:
Das Human interface ist eine gute Basis für ein UCI - Interface für Eschecs, genauer gesagt für JSCP (nein, ich habe es nicht vergessen ), darum habe ich in dem Interface schon einmal alle UCI-Befehle implementiert, auch wenn die meisten noch ohne Funktion sind.
Nachdem ich mir nämlich die JSCP einmal näher angesehen habe, bin ich zu dem Schluß gekommen, daß es (zumindest für mich) nicht ratsam wäre, darin herumzuprogrammieren. Stattdessen habe ich mir überlegt, daß man besser ein Interface als eigenständiges Programm erstellen kann, das JSCP als Kindprozess startet und dann gegenüber der GUI als UCI - Engine auftritt, quasi als Dolmetscher. Wenn alles funktioniert, kann man ja eventuell überlegen, wie man beide Programme in einer .exe zusammenfassen kann.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 30.01.2014, 03:34 Titel: |
|
|
Ein paar Fehler sind mir auf die schnelle Testphase aufgefallen!
1. Einen Zug vorm Matt, wurde die Partie abgebrochen! Angeblich sei es schon Matt.
2. Die Zug-zurück-Funktion im Analysemodus funktioniert bei mir nicht. Gui hängt sich auf, bzw. Schachbrett wird nach links verschoben und nur schwarze Figuren ohne Bauern werden angezeigt!
3. Code: | Missing closing quote in literal string |
wird bei der Compilierung angezeigt.
4. Code: | Passing pointer to scalar, at parameter 2 of TERMINATEPROCESS() |
wird bei der Compilierung angezeigt.
5. diverse Mausklicks auf etwas, lassen das Programm einfrieren. Vor allem, wenn keine Engine geladen wurde!
Mein Programmierprojekt (Schach) wurde für unbestimmte Zeit "ad acta" gelegt!
Bin mit etwas anderem Beschäftigt, was zur Zeit mangels Französisch/Spanischkenntnisse ebenfalls "ad acta" gelegt wurde!
Ein größerer Test meinerseits wird noch folgen!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 30.01.2014, 07:58 Titel: |
|
|
Hallo ALWIM!
Zunächst einmal vielen Dank für deinen Schnelltest
Zu 1.:
Ja, genau das meinte ich mit der nicht korrekt funktionierenden Zugerkennung. Kannst du mir sagen, welcher Zug da eigentlich noch möglich gewesen wäre? Vielleicht hilft mir das, den Fehler aufzuspüren. Noch besser wäre die gesamte "moves"-Liste der Partie, wie sie in "turnamentlog.txt" abgespeichert wird. Dann könnte ich alles Schritt für Schritt analysieren.
EDIT 2:
Einen Fehler habe ich gefunden: In "human.bas" muß es in der Function "testForCheck" statt Code: | Case 6 'king
If (Abs(kingcol - col) < 2) Or (Abs(kingrow - row) < 2) Then
Return 1
EndIf | richtig heißen: Code: | Case 6 'king
If (Abs(kingcol - col) < 2) And (Abs(kingrow - row) < 2) Then
Return 1
EndIf | Kleine Ursache, große Wirkung. Aber ganz korrekt arbeitet die Function immer noch nicht.
Zu 2.:
Upps! Da habe ich offenbar irgendwo nachträglich einen Fehler eingebaut. Ich werde mich mal auf die Suche machen.
EDIT 1:
In der Function "makeFen" habe ich versehentlich eine Zeile gelöscht, daher werden die FEN-Strings nicht korrekt erstellt. Statt Code: | Function makeFen() As String
Dim As Integer x, col, lin, countFree, first, last
Dim As String fenPcs, g, fptest
For col = 2 To 9 'column
For lin = 2 To 9 'line
fenpcs += Mid("kqbnrp0PRNBQK ",board(lin,col) + 7,1) 'convert internal board to fen-string
Next
Next | muß es richtig heißen: Code: | Function makeFen() As String
Dim As Integer x, col, lin, countFree, first, last
Dim As String fenPcs, g, fptest
For col = 2 To 9 'column
For lin = 2 To 9 'line
fenpcs += Mid("kqbnrp0PRNBQK ",board(lin,col) + 7,1) 'convert internal board to fen-string
Next
fenpcs += "/" '<--###################
Next |
Zu 3.:
Da habe ich in einer Zeile die Anführungszeichen am Stringende vergessen. Das hat aber auf das Programm keinen Einfluss.
Zu 4.:
Das ist nur eine vorsorgliche Warnmeldung, die der Compiler immer ausgibt, wenn ein Pointer explizit gesetzt wird, hier beim Beenden der Engine - Prozesse. Das ist aber in Ordnung so.
Zu 5.:
Gegen Bedienungsfehler ist das Programm zur Zeit so gut wie gar nicht abgesichert.
Zitat: | Ein größerer Test meinerseits wird noch folgen! | Vielen Dank im Voraus. Ich blicke dem Ergebnis mit Spannung entgegen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 30.01.2014, 17:53 Titel: |
|
|
Zitat: | Zu 4.:
Das ist nur eine vorsorgliche Warnmeldung, die der Compiler immer ausgibt, wenn ein Pointer explizit gesetzt wird, hier beim Beenden der Engine - Prozesse. Das ist aber in Ordnung so. |
Ich habe mir den Qellcode nicht angesehen, aber
Du solltest die Warnmeldung mit einem CAST(INTEGER PTR, wert) vermeiden können (bzw. was für eine Art von Pointer du halt brauchst). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Roland Chastain
Anmeldungsdatum: 05.12.2011 Beiträge: 192 Wohnort: Frankreich
|
Verfasst am: 30.01.2014, 18:06 Titel: |
|
|
grindstone hat Folgendes geschrieben: |
@Roland Chastain:
Das Human interface ist eine gute Basis für ein UCI - Interface für Eschecs, genauer gesagt für JSCP (nein, ich habe es nicht vergessen ), darum habe ich in dem Interface schon einmal alle UCI-Befehle implementiert, auch wenn die meisten noch ohne Funktion sind.
Nachdem ich mir nämlich die JSCP einmal näher angesehen habe, bin ich zu dem Schluß gekommen, daß es (zumindest für mich) nicht ratsam wäre, darin herumzuprogrammieren. Stattdessen habe ich mir überlegt, daß man besser ein Interface als eigenständiges Programm erstellen kann, das JSCP als Kindprozess startet und dann gegenüber der GUI als UCI - Engine auftritt, quasi als Dolmetscher.
|
Sehr interessant ! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 31.01.2014, 10:02 Titel: |
|
|
nemored hat Folgendes geschrieben: | Du solltest die Warnmeldung mit einem CAST(INTEGER PTR, wert) vermeiden können | Ich habe es -nur aus Neugierde- einmal ausprobiert (der übergebene Pointer ist übrigens ein Prozesshandle). Der Code wird zwar (weiterhin) korrekt kompiliert, die Warnmeldung bleibt aber.
Irgendwo habe ich gelesen, daß das Absicht ist, um den Programmierer davor zu bewahren, versehentlich einen Pointer zu setzen und damit einen nur schwer aufzuspürenden Bug zu produzieren. Ansonsten könne die Warnmeldung ignoriert werden.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 31.01.2014, 14:30 Titel: |
|
|
In deinem Fall wäre es ein
Code: | TerminateProcess(hProcessHandleWhite, Cast(UINT, @ExitCode)) |
Natürlich soll die Meldung vor versehentlichen Programmierfehler bewahren, aber mit dem CAST teilst du ja mit, dass dir bewusst ist, was du tust. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 01.02.2014, 00:52 Titel: |
|
|
Aua! Man sollte keine Programme redigieren, wenn man eigentlich gerade ins Bett gehen will. Ich hatte nur den ersten Parameter geCASTet, was natürlich nichts nutzt. Jetzt funktioniert es. Vielen Dank für den Hinweis.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 01.02.2014, 01:23 Titel: |
|
|
Es gibt überhaupt keinen Grund, als ExitCode-Parameter da überhaupt einen Pointer zu übergeben. Von daher: Ja, die Fehlermeldung macht sinn. Der Parameter ist ein ExitCode (UINT) und kein Pointer auf einen ExitCode (UINT PTR). _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 01.02.2014, 01:38 Titel: |
|
|
So wie ich die API-Funktion verstanden habe, ist "@ExitCode" ein Pointer auf eine UInteger-Variable, in die "TerminateProcess" ihren Rückgabewert schreibt. Ob ich den dann auch tatsächlich auswerte, ist meine Sache, aber die Funktion verlangt diese Angabe, ansonsten gibt es einen Argument count mismatch.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 01.02.2014, 20:47 Titel: |
|
|
TerminateProcess würgt den Prozess ab und er kann sich nicht wehren (was böse ist), wie sollte er da bitteschön einen Rückgabewert reinschreiben?
Der Wert gibt an, was der terminierte Prozess an die anderen Prozesse, die evtl seinen Rückgabewert haben wollen, denn "lügen" soll (da er selbst ja wie gesagt keinen Rückgabewert definieren kann). _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 02.02.2014, 09:37 Titel: |
|
|
Ihr habt Recht, da habe ich in der Funktionsbeschreibung wohl etwas missverstanden, wahrscheinlich habe ich das mit GetExitCodeProcess(... durcheinandergeworfen. Es reicht völlig, wenn ich als Parameter dort eine 0 reinschreibe.
Vielen Dank für den Hinweis, schon wieder was dazugelernt!
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Roland Chastain
Anmeldungsdatum: 05.12.2011 Beiträge: 192 Wohnort: Frankreich
|
Verfasst am: 26.12.2014, 21:51 Titel: |
|
|
Hallo grindstone und andere!
Ich denke auch auf ein UCI Motor zu machen. Hier ist ein erst klein Schritt das ich habe gemacht. Das ist ein Motor welche spielt Zufall züge.
Ich habe nicht getestet mit Colochessum aber nur mit Arena.
http://www.eschecs.fr/fichiers/freebasic/random-uci-engine.zip
Ich wäre froh, zu hören ihre Hinweise.
Zuletzt bearbeitet von Roland Chastain am 02.01.2015, 22:57, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 27.12.2014, 13:44 Titel: |
|
|
Hallo Roland Chastain!
Ich habe deinen "Motor" mal kurz mit Colochessum angetestet.
Das Wichtigste zuerst: Wenn Colochessum versucht, durch senden von "position startpos moves" alles auf Anfang zu setzen, stürzt dein Programm im Modul game.GenerateLegalMoves() ab.
EDIT: Die Absturzursache liegt im Block Code: | If enPassantTargetSquare <> "-" Then
... | Viel Spaß bei der Fehlersuche.
Außerdem müsste "random" in der Lage sein, einen UCI - Befehl wie "position fen 7K/6q1/7b/8/8/8/8/6k1 w - - 3 41 moves" (dieses Beispiel ist eine Mattstellung) korrekt zu verarbeiten, da Colochessum vor jedem Zug das aktuelle Boardsetup an die Engine sendet.
Zum Quelltext: Es ist zwar alles wunderbar strukturiert und die Variablen haben "sprechende" Namen, trotzdem würden ein paar Kommentare das Verständnis sehr erleichtern.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
|
|
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.
|
|