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 10:32] Olaf Schnürer |
lehrkraefte:snr:informatik:glf22:python:while [2022/10/25 12:05] (current) Olaf Schnürer [Sehr nette Bonus-Aufgabe: Game loop oder: Mein erstes Spiel] |
||
---|---|---|---|
Line 2: | Line 2: | ||
====== while-loops (while-Schleifen) ====== | ====== while-loops (while-Schleifen) ====== | ||
- | |||
- | (Musterlösungen fehlen noch!) | ||
<WRAP center round todo> | <WRAP center round todo> | ||
Line 63: | Line 61: | ||
(1) Schreibe ein Programm mit einer while-Schleife und ohne for-Schleife, | (1) Schreibe ein Programm mit einer while-Schleife und ohne for-Schleife, | ||
- | <code python> | + | <code python |
for i in range(5, 20): | for i in range(5, 20): | ||
print(i) | print(i) | ||
</ | </ | ||
- | (2) Verändere dein Programm so, dass es von 20 abwärts mit Schrittweite 3 alle Zahlen ausgibt, die echt grösser als -7 sind. | + | <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 | ||
+ | <hidden Lösungsvorschlag> | ||
+ | <code python schrittweise-abwaerts-zaehlen-per-while.py> | ||
+ | i = 20 | ||
+ | while i > -7: | ||
+ | print(i) | ||
+ | i = i - 3 | ||
+ | </ | ||
+ | </ | ||
</ | </ | ||
Line 96: | Line 114: | ||
<WRAP center round todo> | <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 " | + | 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 |
<code python additionstrainer.py> | <code python additionstrainer.py> | ||
Line 108: | Line 126: | ||
print(f" | 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: | Bonus-Aufgabe: | ||
Line 118: | Line 161: | ||
Schreibe ein Python-Programm, | 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: | 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 ====== | ====== Bonus-Material ====== | ||
- | ===== Bonus-Aufgabe: | + | |
===== Sehr nette Bonus-Aufgabe: | ===== Sehr nette Bonus-Aufgabe: | ||
Line 148: | Line 224: | ||
* (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). | * (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> | <hidden Hinweis> | ||
- | Verändere die Variablen '' | + | Die Variablen '' |
</ | </ | ||
Line 160: | Line 236: | ||
---- | ---- | ||
- | * (4) Das Spiel endet, wenn die Schlange auf das Feld mit der roten Box kommt (die Schlange frisst den Apfel). | + | * (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 " | * (5) Drücken der Taste " | ||
- | Bonus-Aufgaben (such dir aus, was dir gefällt): | + | <hidden Lösungsvorschlag> |
- | * (6) Wenn die grüne Box einen Spielfeldrand erreicht und weiter in diese Richtung gesteuert wird, erscheint sie am gegenüberliegenden Spielfeldrand. | + | <code python aepfel-fressen.py> |
- | * (7) Wenn der Apfel gefressen wird, wird er an einer neuen Position erzeugt und die " | + | # Strongly inspired by a program by Al Sweigart, see |
- | * (8) Der Apfel kann der Schlange davonlaufen: Steuere den Apfel etwa mit den Tasten " | + | # https:// |
- | * (9) Sei kreativ und erweitere das Spiel! | + | # Creative Commons BY-NC-SA 3.0 US |
- | * (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 im nächsten Abschnitt dran ... | + | |
- | </ | + | |
- | <WRAP center round todo> | + | import random, pygame |
- | Schreibe ein Programm, das einen Bankautomat simuliert: Der Benutzer gibt den gewünschten Betrag (in Franken) ein, der Computer gibt diesen Betrag in Banknoten aus und versucht dabei, die Anzahl der ausgegebenen Noten möglichst gering zu halten. | + | from pygame.locals import * |
- | Welche Banknoten es gibt, erfährst du zum Beispiel hier: https:// | + | FRAMES_PER_SECOND = 30 |
- | <hidden Hinweis> | + | ANZAHL_BOXEN_X = 10 |
- | Verwende ''< | + | ANZAHL_BOXEN_Y = 6 |
- | Verwende '' | + | 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 ... | ||
</ | </ | ||