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:

Colochessum Schach-GUI
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 15.12.2013, 19:37    Titel: Colochessum Schach-GUI Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 31.12.2013, 13:01    Titel: Antworten mit Zitat

Hallo, liebe Schachfreunde! lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 10.01.2014, 21:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Roland Chastain



Anmeldungsdatum: 05.12.2011
Beiträge: 183
Wohnort: Dakar, Senegal

BeitragVerfasst am: 11.01.2014, 14:14    Titel: Antworten mit Zitat

Immer sehr interessant, aber... 99 ko !

Wäre es nicht möglich, das Code leichter zu machen ? mit den Augen rollen

Gruß

Roland
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 12.01.2014, 01:38    Titel: Antworten mit Zitat

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. lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 29.01.2014, 10:29    Titel: Antworten mit Zitat

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 zwinkern ).
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 lächeln ), 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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 960
Wohnort: Niederbayern

BeitragVerfasst am: 30.01.2014, 03:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 30.01.2014, 07:58    Titel: Antworten mit Zitat

Hallo ALWIM!

Zunächst einmal vielen Dank für deinen Schnelltest lächeln

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. traurig 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. lächeln

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
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4209
Wohnort: ~/

BeitragVerfasst am: 30.01.2014, 17:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Roland Chastain



Anmeldungsdatum: 05.12.2011
Beiträge: 183
Wohnort: Dakar, Senegal

BeitragVerfasst am: 30.01.2014, 18:06    Titel: Antworten mit Zitat

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 lächeln ), 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 ! Daumen rauf!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 31.01.2014, 10:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4209
Wohnort: ~/

BeitragVerfasst am: 31.01.2014, 14:30    Titel: Antworten mit Zitat

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. happy
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 01.02.2014, 00:52    Titel: Antworten mit Zitat

Aua! Autsch! 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. peinlich Jetzt funktioniert es. Vielen Dank für den Hinweis. lächeln

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
Jojo
alter Rang


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

BeitragVerfasst am: 01.02.2014, 01:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 01.02.2014, 01:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 924
Wohnort: Austria

BeitragVerfasst am: 01.02.2014, 03:56    Titel: Antworten mit Zitat

Falls du damit folgende Funktion aus der Win32 API meinst:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686714.aspx
.. dann handelt es sich beim 2.Parameter (Exit Code) definitiv um keinen Pointer, wie der verlinkten Dokumentation zu entnehmen ist. Der Wert ist auch nur ein Eingangsparameter, was ebenfalls dort dokumentiert ist.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 01.02.2014, 20:47    Titel: Antworten mit Zitat

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? zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 02.02.2014, 09:37    Titel: Antworten mit Zitat

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! lächeln

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
Roland Chastain



Anmeldungsdatum: 05.12.2011
Beiträge: 183
Wohnort: Dakar, Senegal

BeitragVerfasst am: 26.12.2014, 21:51    Titel: Antworten mit Zitat

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. lächeln


Zuletzt bearbeitet von Roland Chastain am 02.01.2015, 22:57, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 27.12.2014, 13:44    Titel: Antworten mit Zitat

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. grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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