Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: "Christian H. Kuhn" Newsgroups: de.comp.lang.java Subject: Re: Countdown Timer Design Date: Sun, 17 Jul 2016 17:03:28 +0200 Lines: 100 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Trace: individual.net TP8IJYKqF2DCix0N9YdIOAJDt1ZIT06vjNLe6jk+5mPtRva4Y= Cancel-Lock: sha1:PRDLzDzMw9ggBwT5HcQ6sDXoMko= User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 In-Reply-To: Xref: csiph.com de.comp.lang.java:13011 Am 17.07.2016 um 16:09 schrieb Stefan Ram: > Ich wußte nicht, daß Schachuhren abwärts zählen, aber werde > das dann zukünftig berücksichtigen. Früher taten sie es nicht. In der analogen Welt waren das zwei ganz normale Uhrenwerke. Die Uhr lief vorwärts. Ein paar Minuten vor der vollen Stunde begann der Minutenzeiger (bei ein paar speziellen Modellen auch ein anderer Mechanismus), das Fallblättchen anzuheben. Bei Erreichen der vollen Stunde verlor das Blättchen seinen Halt auf dem Zeiger und fiel wieder in die Ruhestellung. Eine Konvention, die mäßig eingehalten wurde, verlangte, dass die Uhr so zu stellen sei, dass um 06:00:00 Uhr Partieende ist. Also wird für Blitzschach (5min pro Spieler und Partie) die Uhr auf 05:55:00 gestellt. Für die übliche Bedenkzeit bei Amateur-Turnierpartien (2h für die ersten 40 Züge, 1h für den Rest) dann auf 03:00:00). Interessant war aber nie die Uhrenstellung, sondern die verbleibende Zeit. Dem Blitzspieler war es egal, ob da jetzt 5:58:32 oder 10:58:32 angezeigt wird. Wichtig war die Info: 1:28 min verbleiben. Mit dem Aufkommen digitaler Schachuhren (die auch erst moderne Bedenkzeiten mit Zeitzuschlägen pro Zug ermöglichten) ging man dann dazu über, die verbleibende Bedenkzeit anzuzeigen und folglich rückwärts zu zählen. Da Displays offensichtlich teuer sind, ist es zur Zeit bei den handelsüblichen Modellen üblich, dass die Zeit zunächst in hh:mm angezeigt wird. Sobald eine Restzeit von (je nach Modell) 10 oder 20 Minuten unterschritten wird, wechselt die Anzeige auf mm.ss. So spart man zwei Stellen ein. Das Fallblättchen wird durch ein Sonderzeichen, z.B. durch einen führenden Unterstrich oder einen Apostroph, angezeigt. Bei Bedenkzeitregelungen mit mehreren Zeitperioden kann es für jede Periode ein eigenes Blättchen geben. Es kann aber auch kurz vor der nächsten Zeitkontrolle das alte gelöscht und wiederverwertet werden. Manche Uhren zeigen an, in der wievielten Bedenkzeitperiode man sich befindet. Manche Uhren zeigen an, auf welcher Seite Weiß sitzt. Alle Uhren zeigen an, welche Seite am Zug befindlich ist; entweder durch das Blinken des Trennzeichens zwischen den hh und mm bzw. zwischen mm und ss, das dann auch das Laufen der Uhr anzeigt, oder durch ein zusätzliches Zeichen im Display, z.B. einen Pfeil, oder auch durch eine Leuchte am Gehäuse. > Da kenne ich mich eben nicht aus, also kann ich so etwas > auch nicht implementieren. Ich habe lediglich eine Pause > beider Uhrenwerke vorgesehen, falls beide Spiele mit dem > Schiedsrichter diskutieren wollen, da ich davon im Web > gelesen hatte. Ein durchaus realistisches Szenario. Und damit weisst du in dem Punkt mehr als 80% der Schachspieler, die die Uhr für Diskussionen nicht anhalten und sich danach über die abgelaufene Bedenkzeit beschweren :-) Du hast also den durchaus richtigen Ansatz verfolgt, dass man erstmal die aktuellen Anforderungen implementiert und sein Design nicht an möglichen zukünftigen Anforderungen orientiert. Ich habe es hier nicht kommuniziert, weiss aber, dass da noch mehr kommt. Und bevor ich schon wieder alles umschreibe, behalte ich das von Anfang an im Kopf. > Bei einer reinen Standard-Java-Konsolenoberfläche, die nur > einfache Methoden in der Art wie »println« vorsieht, müßte > man dann in einer Schleife immer wieder die neuen Zeiten > ausgeben. Außerdem benötigt man noch die Möglichkeit > /nichtblockierend/ zu testen, ob der Bediener eine Taste > gedrückt hat. Geht wohl nicht in einem Thread. Scheint aber kein Problem zu sein, wenn ein Thread ausgibt und ein Thread blockierend wartet: public class Threadspiel { public static void main(final String[] _args) { Thread thread1 = new Thread(() -> { while (true) { System.out.print("a"); try { Thread.sleep(100); } catch (InterruptedException e) { } } }); Thread thread2 = new Thread(() -> { while (true) { try { if (0 < System.in.available()) { System.out.println(System.in.read()); } } catch (IOException e) { } } }); thread1.start(); thread2.start(); } } lg QNo