Den Timer im Codepad benutzen
Spielregeln
Die Spielregeln von Snap sind schnell erklärt: Zwei Spieler spielen gegeneinander und sollen nach einer zufälligen Zeit möglichst schnell einen Gegenstand, z.B. ein Bonbon schnappen. Das Startsignal wird akustisch und visuell von einem Timer gegeben. Die minimale und maximale Zeit, die der Timer wartet, können angegeben werden.
Benutzung des Timers
Um den Timer zu starten, nutzen wir ein sehr praktisches Feature in BlueJ, die Direkteingabe (in der englischen Version Codepad genannt). Dort kann man einzelne Befehle eingeben, um schnell und einfach einzelne Anweisungen auszuführen. Standardmäßig ist die Direkteingabe nicht aktiviert. Du kannst sie im Menü unter "Ansicht→Direkteingabe" bzw. "View→Show Codepad" oder durch Klick auf den Pfeil unten rechts öffnen.
Aufgabe 1
Öffne das Projekt Snap (Entpacken nicht vergessen!),
betrachte kurz den Quelltext der Klasse
Timer
und gib folgende Anweisungen in die Direkteingabe ein:
Beschreibe genau welche Wirkung jede einzelne Zeile hat (Fachbegriffe!)
(Hilfe: Falls Du Schwierigkeiten hast zu verstehen, was in den ersten beiden
Zeilen passiert, dann ersetze gedanklich Timer
durch int
und new Timer
durch 42
.)
Spiele das Spiel!
Aufgabe 2
Teste das Verhalten des Timers, wenn Du den Minimalwert nun auf 20 Sekunden setzt oder wenn sowohl Minimal- als auch Maximalwert auf -5 Sekunden gesetzt werden.
Aufgabe 3
Das Problem, dass man unsinnige Werte für die Attribute festlegen kann, soll von folgender Methode gelöst werden:
void setGrenzen(int minimal, int maximal) {
if(minimal >= 0 && minimal <= maximal) {
min = minimal;
max = maximal;
}
}
Auch wenn Du noch keine if-Anweisungen kennen gelernt hast, wirst Du die Funktionsweise
bestimmt verstehen.
Beschreibe die Funktionsweise der Methode.
Ergänze die Methode in der Klasse Timer
und teste das Verhalten in der Direkteingabe.
Warum ist das Problem trotzdem nicht gelöst?
Attribute schützen
Durch die Einführung der set-Methode kann man das erwünschte Verhalten erreichen,
z.B. dass negative Werte ignoriert werden.
Aber trotzdem hat man die Möglichkeit den oben dargestellen Code im Codepad
oder einem Programm auszuführen. Man müsste also die Attribute
min
und max
vor unerwünschtem Zugriff schützen.
Dies erreicht man in Java, indem man den Zugriffsmodifikator private
voranstellt.
Der Konstruktor soll von außerhalb der Klasse ausführbar sein, weshalb er mit public
als öffentlich zugreifbar markiert wird.
Sonst könnte man kein Timer-Objekt erzeugen.
Das Starten des Timers soll ebenfalls außerhalb der Klasse möglich sein.
Man erreicht dies durch:
class Timer
{
private int min;
private int max;
public Timer() {
...
}
public void starten() {
...
}
}
Der Zugriffsmodifikator public
bewirkt für uns hier keine
Veränderung. Diese wirkt sich nur aus, wenn man an größeren Projekten arbeitet.
(Genauer: Wenn der eigene Code in Paketen organisiert wird,
was wir allerdings nicht machen werden.
Siehe z.B. die offiziellen Java-Tutorials)
Aufgabe 4 - Privater Zugriff
Probiere das selbst einmal aus, indem Du den direkten Zugriff auf das Attribut verbietest und dann im Codepad den Zugriff darauf dennoch versuchst.
Aufgabe 5 - Private Attribute abfragen
Wenn man die Attribute min
und max
als private
deklariert,
können sie außerhalb der Klasse auch nicht mehr gelesen werden.
Um dies zu ermöglichen, benötigt man eine Methode, die den Wert zurückgibt.
Üblicherweise beginnt der Name dieser Methode mit get
und endet mit dem Namen des Attributs,
z.B. getMin()
oder getMax()
.
Erweitere die Klasse Timer
um eine Methode int getMin()
,
die den Wert von min
zurückgibt und eine entsprechende Methode für
das Maximum.