Mini-Projekt: Zahlenraten
Dauer: 45-60 Minuten
while-Schleifen für wiederholte Abläufeif/elsefür VerzweigungenMath.random()für Zufallszahlen- Funktionen zur Strukturierung
Ziel: Ein interaktives Spiel mit Schleifen und Verzweigungen
In diesem Mini-Projekt entwickeln wir ein Zahlenraten-Spiel. Der Computer “denkt” sich eine Zufallszahl und der Spieler versucht, diese zu erraten.
Wichtig: Zur Festigung der Konzepte sollte noch kein Coding-Agent (z.B. Copilot Agent Mode, Claude Code) eingesetzt werden. Ein KI-Chat (z.B. Copilot Chat, ChatGPT) kann bei Bedarf für gezielte Fragen genutzt werden — aber nicht für komplette Lösungen.
Wir arbeiten in einer Datei (zahlenraten.js) und erweitern
diese schrittweise. Wer mit Git arbeitet, kann nach jeder
Aufgabe einen Commit erstellen.
Aufgabe 1: Zufallszahl erzeugen (Einstieg)
Schreibe ein Programm, das eine zufällige ganze Zahl zwischen 1 und 100 erzeugt und ausgibt.
Beispielausgabe:
Die Zufallszahl ist: 42Tipp: Math.random() erzeugt eine Zufallszahl zwischen 0 und 1
(exklusive 1). Um eine ganze Zahl zwischen 1 und 100 zu erhalten:
const secret = Math.floor(Math.random() * 100) + 1;Math.random() * 100ergibt 0 bis 99.999…Math.floor()rundet ab auf eine ganze Zahl (0 bis 99)+ 1verschiebt den Bereich auf 1 bis 100
Aufgabe 2: Einmal raten (Einstieg)
Erweitere das Programm:
- Der Computer erzeugt eine Zufallszahl (1-100)
- Der Spieler gibt einen Tipp ab
- Das Programm sagt, ob der Tipp richtig, zu hoch oder zu niedrig war
Beispielausgabe:
Ich denke an eine Zahl zwischen 1 und 100.
Dein Tipp: 50
Zu niedrig!
Die gesuchte Zahl war: 73Tipp: Eingabe prüfen (1–100) und bei Bedarf erneut fragen.
let guess = questionInt("Dein Tipp: ");
while (guess < 1 || guess > 100) {
console.log("Bitte eine Zahl zwischen 1 und 100.");
guess = questionInt("Dein Tipp: ");
}Aufgabe 3: Mehrfach raten mit while (Übung)
Erweitere das Programm so, dass der Spieler mehrfach raten kann, bis die Zahl erraten wurde (die Zeile “Die gesuchte Zahl war: …” entfällt nun):
- Solange der Tipp falsch ist, kann weiter geraten werden
- Bei jedem Versuch erscheint ein Hinweis (zu hoch/zu niedrig)
- Bei richtigem Tipp endet das Spiel mit einer Gratulation
Beispielausgabe:
Ich denke an eine Zahl zwischen 1 und 100.
Dein Tipp: 50
Zu niedrig!
Dein Tipp: 75
Zu hoch!
Dein Tipp: 62
Zu niedrig!
Dein Tipp: 68
Richtig! Die Zahl war 68.Aufgabe 4: Versuche zählen (Übung)
Erweitere das Programm um einen Versuchszähler:
- Zähle die Anzahl der Versuche
- Gib am Ende aus, wie viele Versuche benötigt wurden
Beispielausgabe:
Ich denke an eine Zahl zwischen 1 und 100.
Dein Tipp: 50
Zu niedrig!
Dein Tipp: 75
Zu hoch!
Dein Tipp: 63
Richtig! Die Zahl war 63.
Du hast 3 Versuche gebraucht.Aufgabe 5: Bewertung der Leistung (Übung)
Gib am Ende eine Bewertung basierend auf der Anzahl der Versuche:
- 1-3 Versuche: “Unglaublich! Bist du ein Gedankenleser?”
- 4-6 Versuche: “Sehr gut!”
- 7-10 Versuche: “Gut gemacht!”
- Mehr als 10: “Übung macht den Meister!”
Beispielausgabe:
Du hast 5 Versuche gebraucht.
Sehr gut!Aufgabe 6: Nochmal spielen (Vertiefung)
Erweitere das Spiel so, dass nach einer Runde gefragt wird, ob der Spieler nochmal spielen möchte:
- Nach dem Erraten fragen: “Nochmal spielen? (j/n)”
- Bei “j” startet eine neue Runde mit neuer Zufallszahl
- Bei “n” endet das Programm
Beispielausgabe:
Richtig! Die Zahl war 42.
Du hast 4 Versuche gebraucht.
Sehr gut!
Nochmal spielen? (j/n): j
Ich denke an eine Zahl zwischen 1 und 100.
Dein Tipp: ...Hinweis: Die Eingabe „j/n“ sauber zu validieren ist ein guter Mini-Use-Case
für den Chat („Ask“) in GitHub Copilot. Suche dort gezielt nach einer
Hilfsfunktion in readline-sync (z.B. für y/n, was auch ok ist).
Aufgabe 7: Mit Funktionen strukturieren (Vertiefung)
Refaktoriere das Spiel mit folgenden Funktionen:
generateSecret()– erzeugt und gibt eine Zufallszahl zurückevaluateGuess(guess, secret)– gibt -1, 0 oder 1 zurück (zu niedrig, richtig, zu hoch)getRating(attempts)– gibt die Bewertung als String zurückplayRound()– führt eine Spielrunde durch
Struktur:
import { questionInt, question } from 'readline-sync';
// === Funktionen ===
function generateSecret() {
// Zufallszahl erzeugen und zurückgeben
}
function evaluateGuess(guess, secret) {
// -1 wenn zu niedrig, 0 wenn richtig, 1 wenn zu hoch
}
function getRating(attempts) {
// Bewertungstext zurückgeben
}
function playRound() {
// Eine Spielrunde durchführen
}
// === Hauptprogramm ===
// Äußere while-Schleife für "Nochmal spielen?"Optionale Aufgaben (Bonus)
Schwierigkeitsgrade
Lass den Spieler zu Beginn einen Schwierigkeitsgrad wählen:
- Leicht: Zahlen 1-50
- Normal: Zahlen 1-100
- Schwer: Zahlen 1-200
Maximale Versuche
Begrenze die Anzahl der Versuche (z.B. 7 bei 1-100). Wenn die Versuche aufgebraucht sind, verliert der Spieler.
Highscore
Speichere den besten Versuch der Session (ohne Datei). Zeige am Ende jeder Runde, ob ein neuer Rekord aufgestellt wurde.
Falls-schnell-Aufgaben
- Gib am Ende alle abgegebenen Tipps als Liste aus.
- Zeige nach jedem Tipp den engeren möglichen Zahlenbereich.
- Füge einen Abbruchbefehl hinzu (z.B.
qzum Beenden). - Baue einen „warm/kalt“-Hinweis ein (grober Abstand zur Zielzahl).
Zusammenfassung
In diesem Mini-Projekt haben wir folgende Konzepte angewendet:
while-Schleifen für wiederholte Abläufeif/else-Verzweigungen für Hinweise und BewertungenMath.random()für Zufallszahlen- Funktionen zur Strukturierung des Codes
- Variablen als Zähler für die Versuchsanzahl
Info für Dozent: Lösung siehe zahlenraten.js im Repository exercises.