Wie sage ich in Java das ein Wert jede Sekunde um einen Bestimmten steigen soll?
4 Antworten
Du machst eine Schleife, benutzt einen dekta-time-Zähler, damit diese immer 1 Sekunde dauert(Oder speicherst bei jedem hochzählen den Zeitpunkt in einer Variable und überprüfst bei jedem durchgang, ob dieser Zeitpunkt schon eine sekunde her ist)
In der Schleife zählst du dann hoch...
die Variante mit der Schleife ist nicht gerade gut, besser du verwendet einen java.util.Timer,
ich hab dir eine kleine Klasse geschrieben, bei Fragen einfach melden
import java.util.Timer;
import java.util.TimerTask;
public class Main {
private int someVariable = 0;
public static void main(String[] args) {
Main main = new Main();
main.test();
}
private void test() {
// first variant (runnable as anonymous class)
Runnable r = new Runnable() {
@Override
public void run() {
someVariable++;
System.out.println("increased someVariable to: " + someVariable);
}
};
executeInInterval(r, 3000, 500, 4);
// second (shortest) variant (runnable as lambda)
executeInIntervalForever(() -> System.out.println("i run forever and do nothing"), 1000, 2000);
// second variant
TimerTask runforevertask = executeInIntervalForever(() -> {
someVariable += 10;
System.out.println(
"i run forever and do nothing in curly braces, increased someVariable to: " + someVariable);
}, 4000, 500);
runforevertask.cancel();
}
private TimerTask executeInIntervalForever(Runnable runnable, int delayBeforeFirstExecution, int intervalDelay) {
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("my schedule time is " + scheduledExecutionTime());
runnable.run();
}
};
new Timer().scheduleAtFixedRate(task, delayBeforeFirstExecution, intervalDelay);
return task;
}
private TimerTask executeInInterval(Runnable runnable, int delayBeforeFirstExecution, int intervalDelay,
int repeats) {
TimerTask task = new TimerTask() {
int timesrun = 0;
@Override
public void run() {
if (timesrun >= repeats) {
this.cancel();
return;
}
runnable.run();
timesrun++;
}
@Override
public boolean cancel() {
System.out.println("damn, you cancelled me");
return super.cancel();
}
};
new Timer().scheduleAtFixedRate(task, delayBeforeFirstExecution, intervalDelay);
return task;
}
}
Hallo DeathNoteGood,
es kommt darauf an was Du genau machen willst.
Klar, die erste Antwort heißt sicherlich Thread und dann jede Sekunde um den gewissen Betrag erhöhen.
Abhängig von der Aufgabe kann es aber auch sinnvoll sein folgendes zu tun:
- Du speicherst den Startzeitpunkt und den aktuellen Wert
- Wird der Wert nun abgerufen, dann berechnest Du den aktuellen Wert anhand von Startzeitpunkt, Startwert und Änderungsrate
Die Vorteile sind klar, Du musst keinen Thread verwenden und schon gar nicht jede Sekunde Werte berechnen. Außerdem sind Threads und Zeitmessung relativ ungenau. Was, wenn der Thread mal ne Sekunde "verpasst"?
Gruß
Cookie Clicker ist so ein Klick-Game? Man klickt einfach wild rum und sammelt "irgendwas"?
Mir ist das Konzept leider noch nicht so ganz klar.
jede Sekunde die Punktzahl um 10 erhöht
Dafür reicht es ja, wenn Du die Zeitdifferenzmethode verwendest, die ich beschrieben habe. Die View kann ja unabhängig davon mit einem Thread aktualisiert werden.
Gruß
Stimmt... Man kann ja auch mit der Zeit direkt die Zahl des Zählers berechnen...
Gute Idee, die deswegen einen Daumen hoch bekommt...
Ich möchte so was wie ein Cookie Clicker programmieren und man soll sich im Shop Gegenstände kaufen können die dann z.B jede Sekunde die Punktzahl um 10 erhöht