lehrkraefte:snr:informatik:glf22:python:while

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:snr:informatik:glf22:python:while [2022/09/23 10:14]
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, das dasselbe tut wie das folgende Programm: (1) Schreibe ein Programm mit einer while-Schleife und ohne for-Schleife, das dasselbe tut wie das folgende Programm:
-<code python>+<code python einfache-for-schleife.py>
 for i in range(5, 20): for i in range(5, 20):
     print(i)     print(i)
 </code> </code>
  
-(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 ''i'', die vor der while-Schleife zu initialisieren ist und in der while-Schleife erhöht wird. Die Ausführungsbedingung hängt vom Wert dieser Variablen ab. 
 +</hidden> 
 +<hidden Lösungsvorschlag> 
 +<code python for-per-while.py> 
 +i = 5 
 +while i < 20: 
 +    print(i) 
 +    i = i + 1 
 +</code> 
 +</hidden> 
 + 
 +(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 
 +</code> 
 +</hidden>
 </WRAP> </WRAP>
  
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 "n" soll das Programm enden, sonst (beispielsweise beim Drücken von ''Enter'' ohne vorherige Eingabe) soll eine weitere Additionsaufgabe gestellt werden.+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 "n" oder "nein" soll das Programm enden, sonst (beispielsweise beim Drücken von ''Enter'' ohne vorherige Eingabe) soll eine weitere Additionsaufgabe gestellt werden.
  
 <code python additionstrainer.py> <code python additionstrainer.py>
Line 108: Line 126:
     print(f"Falsch. Richtig wäre {a+b} gewesen.")     print(f"Falsch. Richtig wäre {a+b} gewesen.")
 </code> </code>
 +
 +<hidden Hinweis>
 +Packe den gesamten Programm-Code abgesehen von der ersten Zeile in eine while-Schleife. Initialisiere am Programmbeginn eine Boolesche Variable per ''weiter = True''. Der Ausführungsteil der while-Schleife (auch Schleifenrumpf oder Schleifenkörper genannt) wird solange durchgeführt, wie diese Variable ''True'' ist.
 +Am Ende des Ausführungsteils wird der Benutzer gefragt, ob er eine weitere Aufgabe lösen möchte.
 +</hidden>
 +<hidden Lösungsvorschlag>
 +<code python additionstrainer-mehrfach.py>
 +import random
 +
 +weiter = True
 +while weiter:
 +    a = random.randint(-10, 10)
 +    b = random.randint(-10, 10)
 +    eingabe = int(input(f"Berechne {a} plus {b}: "))
 +    if eingabe == a + b:
 +        print("Korrekt!")
 +    else:
 +        print(f"Falsch. Richtig wäre {a+b} gewesen.")
 +    eingabe = input("Weitere Additionsaufgabe? ")
 +    if eingabe == "n" or eingabe == "nein":
 +        weiter = False
 +</code>
 +</hidden>
 +
 +----
  
 Bonus-Aufgabe: Wer mag, kann jedesmal abhängig von einer Zufallszahl (mit Werten 1, 2, 3 (und 4)) eine Additions-, Subtraktions- oder Multiplikationsaufgabe (oder "aufgehende" Divisionsaufgabe) stellen. (Achtung, Division durch Null vermeiden!) Bonus-Aufgabe: Wer mag, kann jedesmal abhängig von einer Zufallszahl (mit Werten 1, 2, 3 (und 4)) eine Additions-, Subtraktions- oder Multiplikationsaufgabe (oder "aufgehende" Divisionsaufgabe) stellen. (Achtung, Division durch Null vermeiden!)
Line 118: Line 161:
  
 Schreibe ein Python-Programm, so dass der Computer den Part von Spieler A übernimmt und der Benutzer den Part von Spieler B. Schreibe ein Python-Programm, so dass der Computer den Part von Spieler A übernimmt und der Benutzer den Part von Spieler B.
 +Gib am Ende aus, wie viele Versuche Spieler B benötigt hat.
  
-Bonus-Frage: Finde eine Rate-Strategie für B, so dass B mit möglichst wenig Fehlversuchen auskommt. +<hidden Lösungsvorschlag> 
-</WRAP>+<code python zahlenratespiel.py> 
 +import random
  
-===== Aufgabe: Bankautomat =====+zahl random.randint(1, 100) 
 +print("Ich habe mir eine Zahl zwischen 1 und 100 ausgedacht.")
  
-<WRAP center round todo> +versuche = 0 
-Schreibe ein Programmdas einen Bankautomat simuliertDer 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.+gerateneZahl = 0  
 +# oder jede andere Zahldie nicht zwischen 1 und 100 liegt 
 +# Mit jeder solchen Wahl wird der Schleifenkörper (der Ausführungsteil) 
 +der while-Schleife mindestens einmal ausgeführt
  
-Welche Banknoten es gibt, erfährst du zum Beispiel hierhttps://www.snb.ch/de/iabout/cash/history/id/cash_history_serie9+while zahl != gerateneZahl: 
 +    gerateneZahl = int(input("Rate meine Zahl")) 
 +    versuche = versuche + 1 
 +    if gerateneZahl > zahl: 
 +        print("zu hoch!"
 +    elif gerateneZahl < zahl: 
 +        print("zu niedrig"
 +    else: 
 +        print("richtig!"
 +print(f"Du hast {versuche} Versuche benötigt.") 
 +</code> 
 +</hidden>
  
-<hidden Hinweis> +----
-Verwende ''<nowiki>//</nowiki>'' (ganzzahlige Division) um herauszufinden, wie oft eine Banknote ausgegeben werden soll.+
  
-Verwende ''%'' (Rest der ganzzahligen Division) um den Betrag herauszufindender dann noch übrig bleibt. +Bonus-Frage: Finde eine Rate-Strategie für Bso dass B mit möglichst wenig Fehlversuchen auskommt.
-</hidden> +
  
 +<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.
 +</hidden>
 </WRAP> </WRAP>
 +
 +====== Bonus-Material ======
 +
  
 ===== Sehr nette Bonus-Aufgabe: Game loop oder: Mein erstes Spiel ===== ===== Sehr nette Bonus-Aufgabe: Game loop oder: Mein erstes Spiel =====
Line 151: Line 215:
  
 Ändere das Programm so, dass: Ändere das Programm so, dass:
-  * Drücken der Escape-Taste, der Taste "q" oder Anklicken des Kreuzes rechts oben im Pygame-Fenster das Programm beenden.+  * (1) Drücken der Escape-Taste, der Taste "q" oder Anklicken des Kreuzes rechts oben im Pygame-Fenster das Programm beenden.
 <hidden Hinweis> <hidden Hinweis>
 Verändere die Variable ''fensterSchliessen'' bei den entsprechenden Eingaben. Verändere die Variable ''fensterSchliessen'' bei den entsprechenden Eingaben.
Line 158: Line 222:
 ---- ----
  
-  * 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 ''xSpieler'' und ''ySpieler'' bei den entsprechenden Eingaben.+Die Variablen ''xSpieler'' und ''ySpieler'' speichern die aktuelle Position der Schlange. Diese Variablen sind bei den entsprechenden Eingaben zu verändernWelche Koordinate muss beispielsweise beim Drücken der Pfeiltaste nach oben wie verändert werden?
 </hidden> </hidden>
 +
 ---- ----
-  * Die Schlange das Spielfeld nicht verlassen kann (wenn die Box etwa am rechten Rand ist und die rechte Pfeiltaste gedrückt wird, passiert nichts).+ 
 +  (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> <hidden Hinweis>
 Zum Beispiel bei Eingabe "Pfeiltaste nach rechts": Erhöhe die Variable ''xSpieler'' nur dann um eins, wenn die Schlange dadurch das Spielfeld nicht verlässt. (Die Breite des Spielfelds ist in ''ANZAHL_BOXEN_X'' gespeichert.)  Zum Beispiel bei Eingabe "Pfeiltaste nach rechts": Erhöhe die Variable ''xSpieler'' nur dann um eins, wenn die Schlange dadurch das Spielfeld nicht verlässt. (Die Breite des Spielfelds ist in ''ANZAHL_BOXEN_X'' gespeichert.) 
 </hidden>   </hidden>  
 +
 ---- ----
-  * Das Spiel endet, wenn die Schlange auf das Feld mit der roten Box kommt (die Schlange frisst den Apfel).  
-  * Drücken der Taste "f" (wie Farbe) zum Farbwechsel der Schlange auf Blau bzw. zurück auf Grün führt. 
  
-Bonus-Aufgaben: +  (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.  
-  * Wenn die grüne Box einen Spielfeldrand erreicht und weiter in diese Richtung gesteuert wirderscheint sie am gegenüberliegenden Spielfeldrand. +  * (5) Drücken der Taste "f(wie Farbe) zum Farbwechsel der Schlange auf Blau bzw. zurück auf Grün führt.
-  * Wenn der Apfel gefressen wird, wird er an einer neuen Position erzeugt und die "Schlange" bekommt 100 Punkte gutgeschrieben. Den aktuellen Punktestand kannst du im Terminal ausgeben+
-  * Der Apfel kann der Schlange davonlaufen: Steuere den Apfel etwa mit den Tasten "a", "s", "d", "w". +
-  * Sei kreativ und erweitere das Spiel! +
-  * Wenn du Snake programmieren willst, solltest du lernen, was Listen sind! +
-</WRAP>+
  
 +<hidden Lösungsvorschlag>
 +<code python aepfel-fressen.py>
 +# Strongly inspired by a program by Al Sweigart, see
 +# https://inventwithpython.com/pygame/chapter6.html
 +# 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, y, farbe):
 +    rechteck = pygame.Rect(x * BOX_BREITE + 1, y * BOX_HOEHE + 1, BOX_BREITE - 1, BOX_HOEHE - 1)
 +    pygame.draw.rect(leinwand, farbe, rechteck)
 +
 +def zeichneGitter():
 +    for x in range(ANZAHL_BOXEN_X + 1):
 +        pygame.draw.line(leinwand, GRAU, (x * BOX_BREITE, 0), (x * BOX_BREITE, FENSTER_HOEHE))
 +    for y in range(ANZAHL_BOXEN_Y + 1):
 +        pygame.draw.line(leinwand, GRAU, (0, y * BOX_HOEHE), (FENSTER_BREITE, y * BOX_HOEHE))
 +
 +pygame.init()
 +uhr = pygame.time.Clock()
 +leinwand = pygame.display.set_mode((FENSTER_BREITE + 1, FENSTER_HOEHE + 1))
 +pygame.display.set_caption('Green box')
 +
 +xSpieler = random.randint(0, ANZAHL_BOXEN_X - 1)
 +ySpieler = random.randint(0, ANZAHL_BOXEN_Y - 1)
 +farbeSpieler = GRUEN
 +
 +xApfel = random.randint(0, ANZAHL_BOXEN_X - 1)
 +yApfel = random.randint(0, ANZAHL_BOXEN_Y - 1)
 +while (xSpieler == xApfel) and (ySpieler == yApfel):
 +    xApfel = random.randint(0, ANZAHL_BOXEN_X - 1)
 +    yApfel = random.randint(0, ANZAHL_BOXEN_Y - 1)
 +
 +fensterSchliessen = False
 +while not fensterSchliessen:
 +    leinwand.fill(HINTERGRUND_FARBE)
 +    zeichneGitter()
 +    zeichneBox(xApfel, yApfel, ROT)
 +    zeichneBox(xSpieler, ySpieler, farbeSpieler)
 +    pygame.display.update()
 +    uhr.tick(FRAMES_PER_SECOND)
 +
 +    for ereignis in pygame.event.get():
 +        if ereignis.type == QUIT:
 +            print("Button zum Schliessen des Pygame-Fensters angeklickt.")
 +            fensterSchliessen = True
 +        elif ereignis.type == KEYDOWN:
 +            if ereignis.key == K_LEFT:
 +                print("Pfeiltaste links gedrückt.")
 +                if xSpieler > 0:
 +                    xSpieler = xSpieler - 1
 +            elif ereignis.key == K_RIGHT:
 +                print("Pfeiltaste rechts gedrückt.")
 +                if xSpieler < ANZAHL_BOXEN_X - 1:
 +                    xSpieler = xSpieler + 1
 +            elif ereignis.key == K_UP:
 +                print("Pfeiltaste hoch gedrückt.")
 +                if ySpieler > 0:            
 +                    ySpieler = ySpieler - 1
 +            elif ereignis.key == K_DOWN:
 +                print("Pfeiltaste runter gedrückt.")
 +                if ySpieler < ANZAHL_BOXEN_Y - 1:
 +                    ySpieler = ySpieler + 1
 +            elif ereignis.key == K_ESCAPE:
 +                print("Escape-Taste gedrückt.")
 +                fensterSchliessen = True
 +            elif ereignis.key == K_q:
 +                print("Taste 'q' gedrückt.")
 +                fensterSchliessen = True
 +            elif ereignis.key == K_f:
 +                if farbeSpieler == GRUEN:
 +                    farbeSpieler = BLAU
 +                else:
 +                    farbeSpieler = GRUEN 
 +    if xSpieler == xApfel and ySpieler == yApfel:
 +        print("Apfel gefressen.")
 +        xApfel = random.randint(0, ANZAHL_BOXEN_X - 1)
 +        yApfel = random.randint(0, ANZAHL_BOXEN_Y - 1)
 +        while (xSpieler == xApfel) and (ySpieler == yApfel):
 +            xApfel = random.randint(0, ANZAHL_BOXEN_X - 1)
 +            yApfel = random.randint(0, ANZAHL_BOXEN_Y - 1)
 +</code>
 +</hidden>
 +
 +----
 +
 +
 +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: Steuere den Apfel etwa mit den Tasten "a", "s", "d", "w".
 +  * (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 ...
 +</WRAP>
  
 ===== Link zur Kursseite ===== ===== Link zur Kursseite =====
  • lehrkraefte/snr/informatik/glf22/python/while.1663920852.txt.gz
  • Last modified: 2022/09/23 10:14
  • by Olaf Schnürer