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

Woher ich das weiß:eigene Erfahrung

Destranix  06.07.2018, 16:46

Die Systemzeit bekommst du mit

System.nanoTime();
0

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;
	}

}


Woher ich das weiß:Studium / Ausbildung

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ß


DeathNoteGood 
Beitragsersteller
 06.07.2018, 17:54

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

0
AldoradoXYZ  06.07.2018, 18:03
@DeathNoteGood

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ß

0
Destranix  06.07.2018, 17:09

Stimmt... Man kann ja auch mit der Zeit direkt die Zahl des Zählers berechnen...

Gute Idee, die deswegen einen Daumen hoch bekommt...

0