Abschnitt 4 · Lektion 6
Synthese: Zahlenraten
Das Programm kennt eine Zahl zwischen 1 und 100. Du rätst, und es sagt „zu groß“ oder „zu klein“, so lange, bis du sie hast. Zahlenraten ist ein altes Anfängerspiel, und das zu Recht. Es braucht genau die Teile aus diesem Abschnitt und dem davor, und es ist klein genug, um in einer Viertelstunde fertig zu sein.
Ausgedacht ist die Zahl vorerst nicht, sie steht fest im Code. Ein Spiel, dessen Lösung man kennt, macht beim Spielen wenig Spaß. Zum Bauen ist es dafür umso besser, weil du bei jedem Tipp weißt, was herauskommen muss. Wie der Computer sich die Zahl wirklich ausdenkt, kommt später im Kurs.
Wie beim Spritkostenrechner steht am Anfang die Frage, was hinein- und was herausgeht. Hinein gehen
Tipps, einer je Zeile in eingabe.txt, so viele, wie es eben braucht. Heraus kommt nach jedem
falschen Tipp eine Antwort und am Ende, nach wie vielen Versuchen es geklappt hat. Gebaut wird in
drei Schritten, und nach jedem läuft das Programm.
Erst ein Versuch
50 geheim = 61
tipp = int(input("Dein Tipp? "))
if tipp < geheim:
print("Zu klein.")
elif tipp > geheim:
print("Zu groß.")
else:
print("Treffer!") Noch ohne Schleife. Ein Tipp, eine Antwort. Das ist eine Kette aus if, elif und else wie in
Abschnitt 3. Die Reihenfolge der Zweige ist hier ausnahmsweise egal, weil sich die drei Fälle
ausschließen. Ein Tipp ist kleiner als die geheime Zahl, größer oder genau gleich, und nie zwei
davon auf einmal.
Klein anfangen hat einen Grund. Wenn dieser Schritt läuft, stimmen die drei Antworten. Alles, was danach schiefgeht, liegt dann an der Schleife und nicht am Vergleich, und du suchst nur noch in den paar Zeilen, die neu dazugekommen sind.
Dann raten, bis es passt
50
75
61 geheim = 61
while True:
tipp = int(input("Dein Tipp? "))
if tipp < geheim:
print("Zu klein.")
elif tipp > geheim:
print("Zu groß.")
else:
print("Treffer!")
break Jetzt soll das so lange gehen, bis der Tipp stimmt. Wie oft das ist, weiß vorher niemand. Also eine
while-Schleife, und zwar die Form mit while True und einem break beim Treffer. Der ganze erste
Schritt wandert dafür in den Block, eine Stufe weiter eingerückt. Das input steht mit drin, weil
jede Runde einen neuen Tipp braucht.
In eingabe.txt stehen drei Tipps, 50, 75 und 61. Nach dem dritten ist Schluss, und die Schleife
endet über ihr break. Die geheime Zahl bleibt dagegen vor der Schleife. Sie soll sich ja nicht in
jeder Runde ändern.
Wenn die Tipps ausgehen
50
75 geheim = 61
while True:
tipp = int(input("Dein Tipp? "))
if tipp < geheim:
print("Zu klein.")
elif tipp > geheim:
print("Zu groß.")
else:
print("Treffer!")
break Hier stehen in eingabe.txt weniger Tipps, als das Spiel braucht. Nur zwei, und keiner trifft. Die
Schleife fragt ein drittes Mal, aber input() findet keine Zeile mehr und bricht ab mit
EOFError: EOF when reading a line, dem Fehler aus Lektion 2.6. Darunter steht der Hinweis der
Plattform, dass hier niemand an einer Tastatur sitzt.
Diesen Fehler siehst du beim Bauen vermutlich einmal, und meistens hat er einen von zwei Gründen.
Entweder stehen wirklich zu wenige Tipps in der Datei. Oder die Schleife hört beim Treffer nicht
auf, etwa weil das break fehlt, und fragt nach dem richtigen Tipp einfach weiter. Im zweiten Fall
steht der richtige Tipp schon in der Ausgabe, und trotzdem kommt danach noch eine Frage.
Zuletzt mitzählen
Fehlt noch, nach wie vielen Versuchen es geklappt hat. Dafür kommt ein Zähler dazu. Er fängt vor der Schleife bei 0 an, wächst in jeder Runde um eins und wird nach der Schleife ausgegeben. Jeder Tipp zählt als Versuch, auch der, der trifft.
Bei diesem Schritt muss man kurz nachdenken, und darum geht es in der Aufgabe eigentlich. Die Frage ist, wo im Block die Zeile steht, die zählt. In der Aufzeichnung im Reiter Debug siehst du, wie oft sie wirklich drankommt.
Ein Versuch, zwei Versuche
for versuche in range(1, 4):
if versuche == 1:
wort = "Versuch"
else:
wort = "Versuchen"
print(f"Treffer nach {versuche} {wort}.") Bleibt eine Kleinigkeit, an der man ein Programm erkennt, das jemand wirklich ausprobiert hat.
„Treffer nach 1 Versuchen“ liest sich, als hätte nie jemand beim ersten Tipp getroffen. Bei einer
Zahl hängt die Endung des Wortes davon ab, ob es eine ist oder mehrere. Das lässt sich mit einem
if entscheiden, bevor das Wort in den Satz kommt.
Im Beispiel siehst du es an drei Zahlen hintereinander, damit beide Fälle vorkommen. Im Spiel kommt
die Zahl natürlich nicht aus range, sondern aus deinem Zähler.
Was die Aufgabe will
Zum Schluss kommen die drei Schritte zusammen, mit einer anderen geheimen Zahl als hier. Geprüft wird mit vier Spielen, und in einem davon trifft gleich der erste Tipp.
Zum Mitnehmen
Zahlenraten braucht eine Schleife, die fragt, bis es passt, eine Entscheidung in jeder Runde und einen Zähler. Wenn man es in der Reihenfolge Versuch, Schleife, Zähler baut, kann ein Fehler immer nur in einem kleinen Stück Code stecken.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 4 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.