Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:snr:informatik:glf22:python:while [2022/10/25 09:12] – [Aufgabe: for-loop durch while-loop ersetzen] Olaf Schnürer | lehrkraefte:snr:informatik:glf22:python:while [2022/10/25 10:05] (current) – [Sehr nette Bonus-Aufgabe: Game loop oder: Mein erstes Spiel] Olaf Schnürer | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ~~NOTOC~~ | ||
| + | |||
| + | ====== while-loops (while-Schleifen) ====== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Schau dir das folgende Video zu while-loops an und löse die darin enthaltenen kleinen Aufgaben! | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | <hidden Lösung der ersten Aufgabe aus dem Video> | ||
| + | <code python zahlen-aufsummieren.py> | ||
| + | summe = 0 | ||
| + | eingabe = -1 | ||
| + | while eingabe != 0: | ||
| + | eingabe = int(input(" | ||
| + | summe = summe + eingabe | ||
| + | print(f" | ||
| + | </ | ||
| + | </ | ||
| + | <hidden Lösung der zweiten Aufgabe aus dem Video> | ||
| + | <code python string-mit-mindestlaenge-10-einlesen.py> | ||
| + | eingabe = "" | ||
| + | while len(eingabe) < 10: | ||
| + | eingabe = input(" | ||
| + | print(f" | ||
| + | </ | ||
| + | </ | ||
| + | <hidden Lösung der dritten Aufgabe aus dem Video> | ||
| + | <code python drei-potenzieren.py> | ||
| + | produkt = 1 | ||
| + | zaehler = 0 | ||
| + | while produkt <= 1000000: | ||
| + | produkt = 3 * produkt | ||
| + | zaehler = zaehler + 1 | ||
| + | print(f" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP center round info> | ||
| + | Die Syntax von while-Schleifen ist ähnlich zu der von if-statements: | ||
| + | <code python> | ||
| + | while < | ||
| + | Code-Block (auch Rumpf der Schleife genannt) | ||
| + | </ | ||
| + | Der eingerückte Code-Block wird solange wieder und wieder durchgeführt, | ||
| + | |||
| + | Die Ausführungsbedingung einer while-Schleife hängt fast immer von Variablen ab. Diese müssen am Anfang initialisiert werden (oft so, dass die Schleife mindestens einmal ausgeführt wird) und im Rumpf der Schleife so verändert werden, dass die Schleife irgendwann verlassen wird. | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP center round alert> | ||
| + | Vermeide Endlosschleifen! Falls das doch passiert: Abbruch der Programms im Terminal mit '' | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Aufgabe: for-loop durch while-loop ersetzen ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Jede for-loop kann durch eine while-loop ersetzt werden: | ||
| + | |||
| + | (1) Schreibe ein Programm mit einer while-Schleife und ohne for-Schleife, | ||
| + | <code python einfache-for-schleife.py> | ||
| + | for i in range(5, 20): | ||
| + | print(i) | ||
| + | </ | ||
| + | |||
| + | <hidden Hinweis> | ||
| + | Verwende eine Variable '' | ||
| + | </ | ||
| + | <hidden Lösungsvorschlag> | ||
| + | <code python for-per-while.py> | ||
| + | i = 5 | ||
| + | while i < 20: | ||
| + | print(i) | ||
| + | i = i + 1 | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | (2) Verändere dein Programm so, dass es von 20 beginnend abwärts mit Schrittweite 3 alle Zahlen ausgibt, die echt grösser als -7 sind. | ||
| + | <hidden Lösungsvorschlag> | ||
| + | <code python schrittweise-abwaerts-zaehlen-per-while.py> | ||
| + | i = 20 | ||
| + | while i > -7: | ||
| + | print(i) | ||
| + | i = i - 3 | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Kleines Intermezzo: Zufallszahlen (random numbers) in Python ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Gib in der Python-Shell den Befehl | ||
| + | * '' | ||
| + | ein (dieser importiert alle Befehle aus der random-Bibliothek) und dann | ||
| + | * '' | ||
| + | |||
| + | Um den letzten Befehl noch einige weitere Male auszuführen: | ||
| + | |||
| + | Was liefert der Befehl '' | ||
| + | |||
| + | <hidden Lösung> | ||
| + | Der Befehl '' | ||
| + | Alle Zahlen kommen gleich häufig vor (wie bei einem idealen Würfel). | ||
| + | |||
| + | Der Befehl '' | ||
| + | |||
| + | Genauer: Es kommen nur Kommazahlen heraus, die ab der 54. Nachkommastelle nur Nullen als Nachkommastellen haben. (Ich habe dies durch Eingabe von '' | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Aufgabe: Kopfrechentrainer (hier nur Addition) ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Speichere das folgende Programm ab und ändere es so, dass der Benutzer nach jeder Additionsaufgabe gefragt wird, ob er noch eine weitere Aufgabe lösen möchte. Bei Eingabe von " | ||
| + | |||
| + | <code python additionstrainer.py> | ||
| + | import random | ||
| + | a = random.randint(-10, | ||
| + | b = random.randint(-10, | ||
| + | eingabe = int(input(f" | ||
| + | if eingabe == a + b: | ||
| + | print(" | ||
| + | else: | ||
| + | print(f" | ||
| + | </ | ||
| + | |||
| + | <hidden Hinweis> | ||
| + | Packe den gesamten Programm-Code abgesehen von der ersten Zeile in eine while-Schleife. Initialisiere am Programmbeginn eine Boolesche Variable per '' | ||
| + | Am Ende des Ausführungsteils wird der Benutzer gefragt, ob er eine weitere Aufgabe lösen möchte. | ||
| + | </ | ||
| + | <hidden Lösungsvorschlag> | ||
| + | <code python additionstrainer-mehrfach.py> | ||
| + | import random | ||
| + | |||
| + | weiter = True | ||
| + | while weiter: | ||
| + | a = random.randint(-10, | ||
| + | b = random.randint(-10, | ||
| + | eingabe = int(input(f" | ||
| + | if eingabe == a + b: | ||
| + | print(" | ||
| + | else: | ||
| + | print(f" | ||
| + | eingabe = input(" | ||
| + | if eingabe == " | ||
| + | weiter = False | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | Bonus-Aufgabe: | ||
| + | </ | ||
| + | |||
| + | ===== Aufgabe: Zahlenraten ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Spieler A denkt sich eine (ganzzahlige) Zufallszahl zwischen 1 und 100 aus. Spieler B rät eine Zahl. Spieler A informiert ihn dann, ob er zu hoch bzw. zu tief bzw. richtig geraten hat. Spieler B wiederholt das Raten so lange, bis er die richtige Zahl herausbekommen hat. | ||
| + | |||
| + | Schreibe ein Python-Programm, | ||
| + | Gib am Ende aus, wie viele Versuche Spieler B benötigt hat. | ||
| + | |||
| + | <hidden Lösungsvorschlag> | ||
| + | <code python zahlenratespiel.py> | ||
| + | import random | ||
| + | |||
| + | zahl = random.randint(1, | ||
| + | print(" | ||
| + | |||
| + | versuche = 0 | ||
| + | gerateneZahl = 0 | ||
| + | # oder jede andere Zahl, die nicht zwischen 1 und 100 liegt: | ||
| + | # Mit jeder solchen Wahl wird der Schleifenkörper (= der Ausführungsteil) | ||
| + | # der while-Schleife mindestens einmal ausgeführt. | ||
| + | |||
| + | while zahl != gerateneZahl: | ||
| + | gerateneZahl = int(input(" | ||
| + | versuche = versuche + 1 | ||
| + | if gerateneZahl > zahl: | ||
| + | print(" | ||
| + | elif gerateneZahl < zahl: | ||
| + | print(" | ||
| + | else: | ||
| + | print(" | ||
| + | print(f" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | Bonus-Frage: | ||
| + | |||
| + | <hidden Lösung> | ||
| + | Starte mit 50 und halbiere dann jeweils den Bereich aller noch möglichen Zahlen. Wenn beispielsweise 50 zu niedrig war, sind noch alle Zahlen von 51 bis 100 möglich. Rate also 75. | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ====== Bonus-Material ====== | ||
| + | |||
| + | |||
| + | ===== Sehr nette Bonus-Aufgabe: | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Unter dem folgenden Link ist ein Skelett eines Programms, das du verbessern sollst (Download im Ordner deiner Wahl per rechter Maustaste). | ||
| + | |||
| + | (**Achtung: Das Programm enthält eine Endlosschleife! Abbruch per '' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Wenn du das Programm in etwa verstehst, löse sofort die Aufgaben unten. Sonst schau dir das folgende Erklärvideo an: | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | Ändere das Programm so, dass: | ||
| + | * (1) Drücken der Escape-Taste, | ||
| + | <hidden Hinweis> | ||
| + | Verändere die Variable '' | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | * (2) Die grüne Box (imfolgenden Schlange genannt, auch wenn sie sehr kurz ist) mit den Cursor-Tasten bewegt werden kann (Bewegung um ein Kästchen pro Tastendruck). | ||
| + | <hidden Hinweis> | ||
| + | Die Variablen '' | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | * (3) Die Schlange das Spielfeld nicht verlassen kann (wenn die Box etwa am rechten Rand ist und die rechte Pfeiltaste gedrückt wird, passiert nichts). | ||
| + | <hidden Hinweis> | ||
| + | Zum Beispiel bei Eingabe " | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | * (4) Wenn die Schlange auf das Feld mit der roten Box kommt (die Schlange frisst den Apfel), soll ein neuer Apfel an einer neuen Position erzeugt werden. | ||
| + | * (5) Drücken der Taste " | ||
| + | |||
| + | <hidden Lösungsvorschlag> | ||
| + | <code python aepfel-fressen.py> | ||
| + | # Strongly inspired by a program by Al Sweigart, see | ||
| + | # https:// | ||
| + | # Creative Commons BY-NC-SA 3.0 US | ||
| + | |||
| + | import random, pygame | ||
| + | from pygame.locals import * | ||
| + | |||
| + | FRAMES_PER_SECOND = 30 | ||
| + | |||
| + | ANZAHL_BOXEN_X = 10 | ||
| + | ANZAHL_BOXEN_Y = 6 | ||
| + | |||
| + | BOX_BREITE = 60 | ||
| + | BOX_HOEHE = 60 | ||
| + | |||
| + | FENSTER_BREITE = ANZAHL_BOXEN_X * BOX_BREITE | ||
| + | FENSTER_HOEHE = ANZAHL_BOXEN_Y * BOX_HOEHE | ||
| + | |||
| + | # Farben per Rot-, Grün- und Blauwert | ||
| + | # (jeweils auf Skala von 0 bis 255). | ||
| + | # rot grün blau | ||
| + | ROT = (255, 0, 0) | ||
| + | GRUEN = ( 0, 255, 0) | ||
| + | BLAU = ( 0, 0, 255) | ||
| + | WEISS = (255, 255, 255) | ||
| + | SCHWARZ = ( 0, 0, 0) | ||
| + | GRAU = (150, 150, 150) | ||
| + | HINTERGRUND_FARBE = SCHWARZ | ||
| + | |||
| + | def zeichneBox(x, | ||
| + | rechteck = pygame.Rect(x * BOX_BREITE + 1, y * BOX_HOEHE + 1, BOX_BREITE - 1, BOX_HOEHE - 1) | ||
| + | pygame.draw.rect(leinwand, | ||
| + | |||
| + | def zeichneGitter(): | ||
| + | for x in range(ANZAHL_BOXEN_X + 1): | ||
| + | pygame.draw.line(leinwand, | ||
| + | for y in range(ANZAHL_BOXEN_Y + 1): | ||
| + | pygame.draw.line(leinwand, | ||
| + | |||
| + | pygame.init() | ||
| + | uhr = pygame.time.Clock() | ||
| + | leinwand = pygame.display.set_mode((FENSTER_BREITE + 1, FENSTER_HOEHE + 1)) | ||
| + | pygame.display.set_caption(' | ||
| + | |||
| + | xSpieler = random.randint(0, | ||
| + | ySpieler = random.randint(0, | ||
| + | farbeSpieler = GRUEN | ||
| + | |||
| + | xApfel = random.randint(0, | ||
| + | yApfel = random.randint(0, | ||
| + | while (xSpieler == xApfel) and (ySpieler == yApfel): | ||
| + | xApfel = random.randint(0, | ||
| + | yApfel = random.randint(0, | ||
| + | |||
| + | fensterSchliessen = False | ||
| + | while not fensterSchliessen: | ||
| + | leinwand.fill(HINTERGRUND_FARBE) | ||
| + | zeichneGitter() | ||
| + | zeichneBox(xApfel, | ||
| + | zeichneBox(xSpieler, | ||
| + | pygame.display.update() | ||
| + | uhr.tick(FRAMES_PER_SECOND) | ||
| + | |||
| + | for ereignis in pygame.event.get(): | ||
| + | if ereignis.type == QUIT: | ||
| + | print(" | ||
| + | fensterSchliessen = True | ||
| + | elif ereignis.type == KEYDOWN: | ||
| + | if ereignis.key == K_LEFT: | ||
| + | print(" | ||
| + | if xSpieler > 0: | ||
| + | xSpieler = xSpieler - 1 | ||
| + | elif ereignis.key == K_RIGHT: | ||
| + | print(" | ||
| + | if xSpieler < ANZAHL_BOXEN_X - 1: | ||
| + | xSpieler = xSpieler + 1 | ||
| + | elif ereignis.key == K_UP: | ||
| + | print(" | ||
| + | if ySpieler > 0: | ||
| + | ySpieler = ySpieler - 1 | ||
| + | elif ereignis.key == K_DOWN: | ||
| + | print(" | ||
| + | if ySpieler < ANZAHL_BOXEN_Y - 1: | ||
| + | ySpieler = ySpieler + 1 | ||
| + | elif ereignis.key == K_ESCAPE: | ||
| + | print(" | ||
| + | fensterSchliessen = True | ||
| + | elif ereignis.key == K_q: | ||
| + | print(" | ||
| + | fensterSchliessen = True | ||
| + | elif ereignis.key == K_f: | ||
| + | if farbeSpieler == GRUEN: | ||
| + | farbeSpieler = BLAU | ||
| + | else: | ||
| + | farbeSpieler = GRUEN | ||
| + | if xSpieler == xApfel and ySpieler == yApfel: | ||
| + | print(" | ||
| + | xApfel = random.randint(0, | ||
| + | yApfel = random.randint(0, | ||
| + | while (xSpieler == xApfel) and (ySpieler == yApfel): | ||
| + | xApfel = random.randint(0, | ||
| + | yApfel = random.randint(0, | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | |||
| + | Bonus-Aufgaben (such dir aus, was dir gefällt): | ||
| + | * (6) Wenn die grüne Box einen Spielfeldrand erreicht und weiter in diese Richtung gesteuert wird, erscheint sie am gegenüberliegenden Spielfeldrand. | ||
| + | * (7) Für jeden gefressenen Apfel bekommt die Schlange 100 Punkte gutgeschrieben. Den aktuellen Punktestand kannst du im Terminal ausgeben. | ||
| + | * (8) Der Apfel kann der Schlange davonlaufen: | ||
| + | * (9) Sei kreativ und erweitere das Spiel! | ||
| + | * (10) Die Schlange läuft stets mit konstanter Geschwindigkeit (auch wenn keine Taste gedrückt wird). Drücken der Pfeiltasten ändert nur die Richtung. | ||
| + | * (11) Wenn du Snake programmieren willst, solltest du lernen, was Listen sind! ... vermutlich kommt das in einem der folgenden Abschnitte dran ... | ||
| + | </ | ||
| + | |||
| + | ===== Link zur Kursseite ===== | ||
| + | |||
| + | [[lehrkraefte: | ||