JavaScriptsSpiele

Der längste Drücker

Ein Geduldsspiel: Wie lange haltet ihr die Maustaste auf dem Knopf gedrückt? Der Bestwert bleibt im Browser gespeichert.

Dieses Geduldsspiel von TeSeven testet, wie lange ihr es aushaltet: Sobald ihr die Maustaste auf dem Knopf drückt, läuft die Zeit. Sie läuft weiter, solange ihr die Taste gedrückt haltet — und stoppt in dem Moment, in dem ihr loslasst. Die gemessene Dauer ist euer Punktestand.

Die Anzeige zählt in Zehntelsekunden hoch. Habt ihr euren bisherigen Bestwert übertroffen, erscheint eine Glückwunschmeldung und der neue Wert wird gespeichert; sonst bleibt der alte Rekord stehen. Danach steht der Zähler wieder bei 0.0 und die nächste Runde kann beginnen.

Der Bestwert liegt im Browserspeicher (localStorage) eures eigenen Rechners und bleibt dort, bis ihr ihn löscht. Er wird nicht an uns oder an sonst jemanden übertragen — und er gilt nur für diesen einen Browser. Wer die Seite auf dem Telefon aufruft, findet dort also seinen eigenen, getrennten Rekord.

Ein Hinweis zur Bedienung: Gemessen wird zwischen Drücken und Loslassen der Maustaste, und zwar über dem Knopf. Wer die Maus während des Drückens wegzieht und woanders loslässt, bekommt kein Ergebnis — die Uhr läuft dann einfach weiter, bis ihr wieder auf dem Knopf loslasst.

Wenn euch das Messen von Zeiten liegt, probiert im selben Fach auch den Reaktionstest, bei dem es genau umgekehrt auf Schnelligkeit ankommt, oder Stoppe den Zähler.

Spiele Baujahr 2011 läuft in deinem Browser
Zeit0.0 Sekunden
Dein bestes ErgebnisBisher noch kein Ergebnis

Maustaste auf dem Knopf gedrückt halten — beim Loslassen wird gewertet.

Eingesandt von TeSeven

So funktioniert das Script

Das Script hat drei Aufgaben: Es misst die Zeit, während die Maustaste unten ist, es vergleicht das Ergebnis mit dem bisherigen Bestwert, und es merkt sich diesen Bestwert über den Seitenbesuch hinaus. Der ganze Ablauf hängt an nur zwei Zahlen: z zählt die vergangenen Zehntelsekunden, und hallo ist ein Schalter, der angibt, ob die Maustaste noch gedrückt ist.

function fStarten() {
  if (hallo === 0) {
    z = z + 1;
    timer.textContent = z / 10;
    setTimeout(fStarten, 100);
  } else {
    ...
  }
}

Hier steckt der Kern: Die Funktion zählt z um eins hoch, zeigt den Stand an — geteilt durch 10, damit aus Zehnteln Sekunden werden — und trägt sich mit setTimeout(fStarten, 100) selbst für den nächsten Durchlauf in 100 Millisekunden ein. So entsteht eine Schleife, die sich immer wieder neu aufruft, bis die Bedingung nicht mehr stimmt. Wer feiner messen will, setzt die 100 auf 10 herunter und teilt entsprechend durch 100.

Ein Hinweis für Genaue: Diese Art zu zählen ist keine Stoppuhr. Jeder Durchlauf braucht selbst ein wenig Zeit, und der Browser darf einen Zeitgeber auch verspäten. Für ein Geduldsspiel reicht das völlig — für eine echte Messung würde man Anfang und Ende mit Date.now() festhalten und die Differenz bilden.

function fBeenden() {
  hallo = 1;
}

knopf.addEventListener("mousedown", fStarten);
knopf.addEventListener("mouseup", fBeenden);

Der Knopf bekommt zwei Zuhörer: mousedown feuert, sobald die Maustaste heruntergedrückt wird, mouseup beim Loslassen. Das Loslassen stoppt die Uhr nicht selbst — es setzt nur hallo auf 1. Der nächste Durchlauf von fStarten(), der ohnehin in höchstens 100 Millisekunden ansteht, sieht den umgelegten Schalter und geht statt ins Weiterzählen in den else-Zweig. Diese Trennung ist ein sauberer Trick: Der Zuhörer bleibt winzig, die ganze Auswertung steht an einer Stelle.

zwischenwert = z / 10;
if (zwischenwert > highscore) {
  highscore = zwischenwert;
  bestwert.textContent = highscore + " Sekunden";
  setCookie("bghs", highscore, "700", "0", "0");
}

Im else-Zweig wird abgerechnet: Aus den gezählten Zehnteln wird die Sekundenzahl, und die vergleicht das Script mit dem gespeicherten Rekord. Ist sie größer, wandert sie als neuer Bestwert in die Anzeige und in den Speicher. Danach werden z und hallo zurückgesetzt und der Knopf trägt wieder seine Einladungsbeschriftung — die nächste Runde kann beginnen.

function setCookie(nam, value, expd, exph, expm) {
  try {
    localStorage.setItem(nam, String(value));
  }
  catch (e) {}
}

Ursprünglich legte das Script den Bestwert in einem Cookie ab. Heute übernimmt das localStorage: ein kleiner Schlüssel-Wert-Speicher im Browser, der anders als ein Cookie nicht bei jedem Seitenaufruf mit zum Server geschickt wird. Die drei Parameter für die Ablaufzeit stehen nur noch aus alter Gewohnheit in der Klammer, damit die Aufrufe im übrigen Script unverändert bleiben durften — localStorage kennt kein Ablaufdatum. Das try … catch drumherum ist wichtig: In manchen Browsereinstellungen ist der Speicher gesperrt, und ohne diese Absicherung würde das ganze Spiel mit einem Fehler stehenbleiben. So passiert im Zweifel einfach nichts.

if (getCookie("bghs") === null) {
  setCookie("bghs", "0", "700", "0", "0");
  highscore = 0;
} else {
  bestwert.textContent = getCookie("bghs") + " Sekunden";
  highscore = parseFloat(getCookie("bghs"));
}

Diese Zeilen laufen einmal beim Laden der Seite. Steht noch nichts im Speicher, wird eine 0 abgelegt und auch die Variable highscore auf 0 gesetzt — sonst stünde beim allerersten Besuch undefined darin, und jeder Vergleich damit ist falsch, sodass bis zum nächsten Seitenaufruf kein Rekord anerkannt würde. Andernfalls wird der gespeicherte Text mit parseFloat() wieder in eine Zahl verwandelt, denn im Speicher liegt alles als Zeichenkette; ein Vergleich mit > würde sonst Zeichen für Zeichen statt der Größe nach vergleichen. Unter dem Schlüsselnamen "bghs" könnt ihr euren Rekord übrigens in den Entwicklerwerkzeugen des Browsers finden — und dort auch löschen, wenn ihr wieder bei null anfangen wollt.

Script für die eigene Homepage

Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.

Mehr aus der Kategorie Spiele