Kniffel
Das komplette Würfelspiel Kniffel im Browser: fünf Würfel, drei Würfe je Runde, dreizehn Felder — die Punkte rechnet das Script selbst aus.
Kniffel — international als „Yahtzee“ bekannt — ist das wohl meistgespielte Würfelspiel der Welt: Fünf Würfel, dreizehn Runden, ein Blatt voller Kombinationen, die ihr füllen müsst. Dieses Script bringt das komplette Spiel in den Browser, samt Würfelbecher, Kniffelblatt und automatischer Auswertung. Eingeschickt hat es unser User Vollautomatisch.
So wird gespielt: Ein Klick auf „Würfeln“ wirft alle fünf Würfel. Bis zu dreimal pro Runde dürft ihr würfeln — das Feld „Würfe übrig“ zählt mit und färbt sich rot, wenn keiner mehr frei ist. Würfel, die ihr behalten wollt, kreuzt ihr unter dem jeweiligen Würfel an; beim nächsten Wurf bleiben sie liegen und nur die übrigen rollen neu. Steht das Ergebnis, klickt ihr im Kniffelblatt rechts auf das Feld, in das ihr den Wurf eintragen wollt — die Punkte rechnet das Script selbst aus. Passt der Wurf nirgends, tragt ihr ihn in ein Feld ein, das ohnehin schwerfällt; ein „ / “ bedeutet dann null Punkte. Mit „Nächster Wurf“ geht es in die nächste Runde.
Die Wertung folgt den bekannten Regeln. Im oberen Block zählen „1er“ bis „6er“ jeweils nur die Würfel mit der passenden Augenzahl (drei Vieren also 12 Punkte). Wer im oberen Block mindestens 63 Punkte sammelt, bekommt 35 Bonuspunkte. Im unteren Block gilt: Dreierpasch und Viererpasch bringen die Summe aller fünf Augen, Full House 25, kleine Straße 30, große Straße 40, Kniffel (fünf gleiche) 50 Punkte, und die Chance ist der Joker, bei dem alle Augen addiert werden. Nach der dreizehnten Runde füllt das Script die Summenzeilen und das Endergebnis aus.
Kniffel ist ein schönes Beispiel dafür, wie viel Taktik in einem reinen Glücksspiel stecken kann: Weil jedes Feld nur einmal vergeben wird, müsst ihr in jeder Runde entscheiden, ob ihr einen mittelmäßigen Wurf sicher wegschreibt oder ein wertvolles Feld für später aufhebt. Der Bonus von 35 Punkten macht den oberen Block dabei wichtiger, als er auf den ersten Blick aussieht — im Schnitt braucht ihr dafür drei gleiche Würfel je Zahl.
Wer noch mehr würfeln möchte: Bei uns liegt auch das Würfelspiel „Wer kommt an die 50?“ und für den ganz schnellen Zufall der Münzwurf. Wenn ihr lieber knobelt als würfelt, sind Mastermind oder das Sudoku die passenderen Nachbarn.
Bis zu dreimal „Würfeln“, Würfel zum Behalten ankreuzen, dann im Kniffelblatt auf das Feld klicken, in das der Wurf eingetragen werden soll. „Nächster Wurf“ startet die nächste Runde. Nach 13 Runden erscheint das Endergebnis.
| 1er | |
| 2er | |
| 3er | |
| 4er | |
| 5er | |
| 6er | |
| Punkte oben | |
|---|---|
| Bonuspunkte | |
| Salto | |
| Dreierpasch | |
| Viererpasch | |
| Full House | |
| kl. Straße | |
| gr. Straße | |
| Kniffel | |
| Chance | |
| Punkte unten | |
| Punkte oben | |
| Endergebnis |
So funktioniert das Script
Das Script ist mit rund 300 Zeilen das längste auf dieser Seite, folgt aber einem einfachen Bauplan. Der komplette Spielstand steckt in Formularfeldern — sichtbaren für Würfel und Punkte, unsichtbaren für die Merker. Drei Funktionen arbeiten damit: kniffel() würfelt, eintragen() wertet einen Wurf und trägt ihn ins Blatt ein, fertig() beendet die Runde und startet die nächste. Wir gehen die zentralen Mechanismen der Reihe nach durch.
Der Spielzustand liegt im HTML
function f(name) {
return document.getElementById("kn-" + name);
}
Das Original von 2007 sprach seine Felder noch mit document.kniffelform.anzahl an — über den Namen des Formulars. Das ist längst veraltet. Die kleine Hilfsfunktion f() ersetzt das: Sie setzt vor jeden Feldnamen das Kürzel kn- und holt das Element mit getElementById. Aus document.kniffelform.anzahl.value wird so f("anzahl").value — die Schreibweise bleibt kurz, funktioniert aber in jedem Browser.
Bemerkenswert ist, dass es gar keine JavaScript-Variablen für den Spielstand gibt. Wie viele Würfe noch frei sind, in welcher Runde ihr seid, welche Felder schon belegt sind — alles steht in Eingabefeldern, ein Teil davon in <input type="hidden">. Das ist ungewöhnlich, aber sehr anschaulich: Der Spielstand ist genau das, was ihr auf dem Bildschirm seht.
Würfeln — und liegen lassen
if (behalten[0].checked !== true) z1 = Math.floor(Math.random() * 6) + 1;
Math.random() liefert eine Kommazahl zwischen 0 (einschließlich) und 1 (ausschließlich). Mal 6 genommen ergibt das eine Zahl zwischen 0 und knapp 6, Math.floor() schneidet die Nachkommastellen ab — heraus kommt 0, 1, 2, 3, 4 oder 5. Das + 1 verschiebt das auf den Bereich 1 bis 6, also einen echten Würfel. Diese eine Zeile steht fünfmal untereinander, einmal je Würfel.
Der Clou steckt im if: Gewürfelt wird nur, wenn das zugehörige Kästchen nicht angekreuzt ist. Angekreuzte Würfel behalten ihren Wert, den das Script kurz vorher mit parseFloat(f("z1").value) aus dem Feld gelesen hat. Genau so entsteht das typische Kniffel-Gefühl, drei Sechsen liegen zu lassen und nur die beiden anderen noch einmal zu werfen.
Der Würfelzähler
if (parseFloat(f("anzahl").value) > 0) {
f("anzahl").value = parseFloat(f("anzahl").value) - 1;
...
}
Vor jedem Wurf schaut das Script, ob noch Würfe frei sind. parseFloat ist nötig, weil der Wert eines Eingabefeldes immer Text ist — "3" statt 3. Ohne die Umwandlung würde "3" - 1 zwar noch klappen, "3" + 1 aber "31" ergeben. Steht der Zähler auf 0, wird nicht mehr gewürfelt, und das Feld färbt sich über f("anzahl").style.color = "red" rot.
Punkte zählen: der obere Block
let vier = 0;
for (let i = 0; i < 5; i++) {
if (wurf[i] == 4) { vier++; }
}
f("n4er").value = vier * 4;
Die fünf Würfel liegen in dem Array wurf. Für die Felder „1er“ bis „6er“ läuft eine Schleife über alle fünf Einträge und zählt, wie oft die gesuchte Augenzahl vorkommt. Das Ergebnis wird mit der Augenzahl multipliziert — drei Vieren ergeben also 3 * 4 = 12. Die sechs Fälle sind im Script fast wortgleich untereinander geschrieben; wer mag, kann sie zu einer einzigen Funktion mit der Augenzahl als Parameter zusammenfassen.
Punkte zählen: Kombinationen erkennen
wurf.sort();
if (wurf[0] == 1 && wurf[1] == 2 && wurf[2] == 3 && wurf[3] == 4 && wurf[4] == 5) { f("gr_strasse").value = 40; }
else if (wurf[0] == 2 && wurf[1] == 3 && wurf[2] == 4 && wurf[3] == 5 && wurf[4] == 6) { f("gr_strasse").value = 40; }
else { f("gr_strasse").value = " / "; }
sort() sortiert die fünf Würfel der Größe nach. Danach lassen sich Kombinationen an festen Positionen ablesen: Eine große Straße ist sortiert immer entweder 1-2-3-4-5 oder 2-3-4-5-6, mehr Möglichkeiten gibt es nicht. Dasselbe Prinzip trägt den Dreierpasch (die mittleren drei Würfel müssen gleich sein) und den Viererpasch. Passt nichts, schreibt das Script ein " / " ins Feld — das bedeutet: gestrichen, null Punkte.
Beim Full House hat der Autor keinen Algorithmus geschrieben, sondern schlicht alle gültigen Kombinationen einzeln aufgelistet — rund vierzig if-Zeilen untereinander. Elegant ist das nicht, aber es funktioniert und ist für Anfänger sogar leichter zu lesen als eine cleverere Lösung.
if ((array[0] + array[1] + array[2] + array[3] + array[4] + array[5]) >= 4) {
if (wurf_neu[0] + 1 == wurf_neu[1] && wurf_neu[1] + 1 == wurf_neu[2] && wurf_neu[2] + 1 == wurf_neu[3]) { f("kl_strasse").value = 30; }
Die kleine Straße ist der kniffligste Fall, weil ein Würfel doppelt vorkommen darf. Deshalb baut das Script zuerst zwei Hilfslisten: array merkt sich für jede Augenzahl 1 bis 6, ob sie überhaupt im Wurf vorkommt (1 oder 0), und wurf_neu sammelt die vorkommenden Augenzahlen ohne Dubletten in aufsteigender Reihenfolge. Sind mindestens vier verschiedene Zahlen dabei, wird geprüft, ob vier davon lückenlos aufeinanderfolgen.
Ein Feld nur einmal vergeben
if (f("n1er_hid").value == 0 && f("eingetragen").value == 0) {
...
}
f("n1er_hid").value = 1;
Zwei Merker steuern das ganze Spiel. Jedes Feld hat einen eigenen versteckten Merker ..._hid, der auf 1 springt, sobald das Feld benutzt wurde — danach lässt es sich nicht mehr überschreiben. Und eingetragen sorgt dafür, dass pro Runde nur ein Feld gefüllt werden darf: Beim Eintragen springt er auf 1, und erst fertig() setzt ihn wieder auf 0.
if (f("eingetragen").value == 1) {
zaehle();
f("anzahl").value = 3;
behalten[0].checked = false;
...
} else {
meldung("Bitte erst irgendwo einen Wert eintragen. Danke.");
}
fertig() ist der Rundenwechsel: Der Rundenzähler geht eins hoch, der Würfelvorrat steht wieder auf 3, alle Behalten-Kreuze fallen weg. Wer die Schaltfläche drückt, ohne vorher etwas eingetragen zu haben, bekommt einen Hinweis — im Original war das ein alert()-Fenster, hier erscheint der Text ruhiger direkt unter den Würfeln.
Die Endabrechnung
if (f("punkte_oben").value >= 63) { f("bonuspunkte").value = 35; }
else { f("bonuspunkte").value = 0; }
Sobald der Rundenzähler 13 erreicht, ist das Blatt voll und das Script rechnet zusammen: erst die sechs Felder des oberen Blocks, dann der Bonus von 35 Punkten ab 63 aufwärts, dann der untere Block, schließlich das Endergebnis. Bei den unteren Feldern steht dabei der Trick if (f("chance").value * 0 == 0) — ein gestrichenes Feld enthält " / ", und " / " * 0 ergibt NaN, also nicht 0. So werden gestrichene Felder beim Addieren automatisch übersprungen.
Zum Anpassen: Die Punktwerte für Full House (25), kleine Straße (30), große Straße (40) und Kniffel (50) stehen als nackte Zahlen im Code und lassen sich mit einer Suche nach dem Feldnamen schnell finden. Wer mehr als drei Würfe je Runde erlauben will, ändert die 3 in f("anzahl").value = 3 in fertig() und den Startwert des Feldes kn-anzahl im HTML. Und wer mit weniger Runden spielen möchte, dreht an der 13 in if (f("runde").value == 13).
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
-
ASCII Minesweeper
-
Asteroids
-
Ausweichen
-
Ballspiel
-
Bennys Quiz
-
Blackjack
-
Blu Mania
-
BreakOut
-
Buchstaben zählen
-
Buchstabenpuzzle
-
Checkbox Spiel
-
Concentration
-
Der längste Drücker
-
Die Türme von Hanoi
-
Einmaleins Trainer
-
Escape
-
Galgenmännchen
-
Galgenmännchen 2
-
Game Over Game
-
Glücks Klick
-
Glücksbuttons
-
Ich sehe was
-
Labyrinth
-
Liebesrechner
-
Lights Out
-
Lights Out 2
-
Mastermind
-
Minesweeper
-
Mühle