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:chaos-game-mit-pygame [2022/08/27 10:16] – [Bonus-Aufgabe 1 (relativ einfach)] Olaf Schnürer | lehrkraefte:snr:informatik:glf22:python:chaos-game-mit-pygame [2023/08/21 19:07] (current) – [Python-Programm zum Chaos-Spiel] Olaf Schnürer | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ~~NOTOC~~ | ||
| + | |||
| + | ====== Spielerisch-chaotische Einführung in Python ====== | ||
| + | |||
| + | ===== Chaos-Spiel − der springende Punkt ===== | ||
| + | |||
| + | (eventuell Würfel mitnehmen...) | ||
| + | |||
| + | Das Chaos-Spiel geht wie folgt: | ||
| + | <WRAP round info> | ||
| + | Seien $A$, $B$, $C$ die Ecken eines gleichseitigen Dreiecks auf der Tafel. | ||
| + | |||
| + | Wähle zufällig einen weiteren Punkt $P$. Wir lassen diesen Punkt „springen“, | ||
| + | <WRAP round box> | ||
| + | - Wähle zufällig einen der Eckpunkte $A$, $B$, $C$, etwa mit Hilfe eines Würfels: | ||
| + | * $A$ falls der Würfel 1 oder 2 zeigt; | ||
| + | * $B$ falls er 3 oder 4 zeigt; | ||
| + | * $C$ falls er 5 oder 6 zeigt. | ||
| + | - Der „neue“ Punkt $P$ sei der Mittelpunkt zwischen dem „alten“ Punkt $P$ und dem erwürfelten Eckpunkt. | ||
| + | - Markiere diesen neuen Punkt $P$. | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Aufgabe 1 ===== | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Spiele das Chaos-Spiel auf einem Blatt Papier. Kannst Du erraten, welche geometrische Figur herauskommt? | ||
| + | |||
| + | Die Antwort wirst du sehen, sobald du das nachfolgende Python-Programm auf deinem Rechner zum Laufen gebracht hast. | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Aufgabe 2: Python-Programm zum Chaos-Spiel verstehen ===== | ||
| + | <WRAP round todo> | ||
| + | |||
| + | Lies das nachfolgende Python-Programm '' | ||
| + | |||
| + | Testfragen: | ||
| + | - Wo wird der zufällige Punkt $P=(x,y)$ erzeugt? | ||
| + | - Im Programm wird mit einem " | ||
| + | - Wo " | ||
| + | - Kannst du erraten, was die Befehlszeile '' | ||
| + | |||
| + | Wenn du diese oder zumindest einige dieser Fragen beantworten kannst (und dir somit grob klar ist, was das Programm macht): Bringe das Programm auf deinem Rechner zum Laufen, wie in der nächsten Aufgabe beschrieben. | ||
| + | |||
| + | <wrap lo>Wer noch kein Python kann, wird beim ersten Lesen nichts oder nur wenig verstehen - der Sinn ist aber, dass ihr ähnlich wie beim äusserst effektiven frühkindlichen Erlernen der Muttersprache nun einer neuen Programmiersprache in einer nicht-trivialen Situation ausgesetzt werdet und durch Nachfragen und Erklärungen meinerseits mit der Zeit ein gewisses Verständnis entwickelt.</ | ||
| + | </ | ||
| + | |||
| + | ==== Python-Programm zum Chaos-Spiel ==== | ||
| + | |||
| + | <code python chaos-game.py> | ||
| + | import pygame | ||
| + | from random import * | ||
| + | |||
| + | breite = 500 | ||
| + | hoehe = 433 # ungefähr sqrt(3)/2 * breite; | ||
| + | iterationen = 10000 | ||
| + | |||
| + | weiss = (255, 255, 255) # Ein Tupel aus drei Zahlen, kodiert die Farbe Weiss im RGB-Modell, das wir später kennenlernen werden. | ||
| + | |||
| + | # Koordinaten des Punkts A | ||
| + | xA = 0 | ||
| + | yA = hoehe | ||
| + | |||
| + | # Koordinaten des Punkts B | ||
| + | xB = breite | ||
| + | yB = hoehe | ||
| + | |||
| + | # Koordinaten des Punkts C | ||
| + | xC = int(breite / 2) # Der Befehl " | ||
| + | yC = 0 | ||
| + | |||
| + | pygame.init() | ||
| + | pygame.display.set_caption(" | ||
| + | |||
| + | leinwand = pygame.display.set_mode((breite + 1, hoehe + 1)) | ||
| + | |||
| + | pygame.draw.line(leinwand, | ||
| + | pygame.draw.line(leinwand, | ||
| + | pygame.draw.line(leinwand, | ||
| + | |||
| + | pygame.display.update() | ||
| + | |||
| + | x = randint(0, breite) | ||
| + | y = randint(0, hoehe) | ||
| + | |||
| + | for i in range(0, iterationen): | ||
| + | zufall = randint(1, 3) | ||
| + | if zufall == 1: | ||
| + | x = x + 0.5 * (xA - x) | ||
| + | y = y + 0.5 * (yA - y) | ||
| + | if zufall == 2: | ||
| + | x = x + 0.5 * (xB - x) | ||
| + | y = y + 0.5 * (yB - y) | ||
| + | if zufall == 3: | ||
| + | x = x + 0.5 * (xC - x) | ||
| + | y = y + 0.5 * (yC - y) | ||
| + | leinwand.set_at((round(x), | ||
| + | pygame.display.update((round(x), | ||
| + | # denn das ist deutlich schneller als | ||
| + | # pygame.display.update() | ||
| + | pygame.time.delay(1) | ||
| + | |||
| + | if i % 1000 == 0: # " | ||
| + | print(i) | ||
| + | |||
| + | print(" | ||
| + | print(f" | ||
| + | | ||
| + | |||
| + | pygame.time.delay(5000) | ||
| + | pygame.quit() | ||
| + | </ | ||
| + | |||
| + | ==== Derselbe Python-Code sehr ausführlich kommentiert (eine Art Musterlösung zu Aufgabe 2) ==== | ||
| + | |||
| + | <hidden Programm-Code mit Erklärungen> | ||
| + | <code python chaos-game-explained.py> | ||
| + | # Sierpinski-Dreieck per Chaos-Spiel | ||
| + | # Alle Zeilen, die mit dem Hash- oder Doppelkreuz-Symbol # beginnen, sind Kommentare | ||
| + | # und werden vom Computer beim Ausführen des Programms ignoriert. | ||
| + | # Leerzeilen dienen nur der besseren Strukturierung und werden ebenfalls vom Computer ignoriert. | ||
| + | |||
| + | # Import von Pakete/ | ||
| + | # (eigentlich ist pygame ein Paket zur Spieleprogrammierung, | ||
| + | # jedoch eignet es sich auch zum Zeichnen einfacher Grafiken und ich habe nichts " | ||
| + | import pygame | ||
| + | from random import * | ||
| + | |||
| + | |||
| + | # Es folgen zwei Zuweisungen, | ||
| + | # Wir weisen der Variablen " | ||
| + | # Das Gleichheitszeichen ist NICHT als mathematische Gleichheit zu verstehen. | ||
| + | # Es handelt sich um eine Zuweisung! (Dies wird weiter unten klarer.) | ||
| + | # (Wir werden die Variable " | ||
| + | # Analog wird die Variable/ | ||
| + | breite = 500 | ||
| + | hoehe = 433 # ungefähr sqrt(3)/2 * breite; | ||
| + | |||
| + | # Die folgende Variable gibt an, wie oft wir den Punkt springen lassen. | ||
| + | iterationen = 10000 | ||
| + | |||
| + | weiss = (255, 255, 255) # Ein Tupel aus drei Zahlen, kodiert die Farbe Weiss im RGB-Modell, das wir später kennenlernen werden. | ||
| + | |||
| + | # Koordinaten des Punkts A | ||
| + | xA = 0 | ||
| + | yA = hoehe | ||
| + | |||
| + | # Koordinaten des Punkts B | ||
| + | xB = breite | ||
| + | yB = hoehe | ||
| + | |||
| + | # Koordinaten des Punkts C | ||
| + | xC = int(breite / 2) # Der Befehl " | ||
| + | yC = 0 | ||
| + | |||
| + | |||
| + | # Die folgenden drei Befehle erzeugen ein Fenster mit dem Titel "Das Chaos-Spiel" | ||
| + | # mit einem rechteckigem Ausschnitt der Zeichenebene. | ||
| + | # Genauer wird der Bereich mit x-Koordinaten von 0 bis " | ||
| + | # y-Koordinaten von 0 bis " | ||
| + | # Beachte: Die x-Achse zeigt nach rechts, die y-Achse nach UNTEN! | ||
| + | # Jedes Pixel (= jeder Bildpunkt) mit ganzzahligen Koordinaten in diesem Bereich | ||
| + | # kann später gefärbt werden. | ||
| + | # In der Titelleiste des Fensters erscheint die Zeichenkette (englisch string) | ||
| + | # "Das Chaos-Spiel" | ||
| + | pygame.init() | ||
| + | pygame.display.set_caption(" | ||
| + | |||
| + | leinwand = pygame.display.set_mode((breite + 1, hoehe + 1)) | ||
| + | |||
| + | # Zeichne gerade Linien zwischen den angegebenen Punkten (auf der " | ||
| + | pygame.draw.line(leinwand, | ||
| + | pygame.draw.line(leinwand, | ||
| + | pygame.draw.line(leinwand, | ||
| + | |||
| + | # Die Linien werden zunächst " | ||
| + | # das Display updaten. (Dies ist so gemacht, um ein Flackern des Bildschirms zu vermeiden.) | ||
| + | pygame.display.update() | ||
| + | |||
| + | |||
| + | # zufaellige Startkoordinaten des springenden Punktes | ||
| + | # " | ||
| + | # zwischen den angegebenen Grenzen (jeweils einschliesslich). | ||
| + | x = randint(0, breite) | ||
| + | y = randint(0, hoehe) | ||
| + | |||
| + | |||
| + | # Es folgt eine sogenannte " | ||
| + | # Die Variable i nimmt nacheinander die Werte 0, 1, 2, ..., iterationen - 1 an. | ||
| + | # Beachte, dass der Wert iterationen nicht angenommen wird. | ||
| + | # (Hierbei ist iterationen - 1 unser Ersatz für unendlich.) | ||
| + | # Für jeden dieser Werte wird der nachfolgende eingerückte Bereich (Einrückung jeweis vier Leerzeichen) | ||
| + | # genau einmal durchlaufen. | ||
| + | # ACHTUNG: Falsche Einrückungen verursachen Fehler. | ||
| + | for i in range(0, iterationen): | ||
| + | |||
| + | # Weise der Variablen " | ||
| + | # Wir wuerfeln sozusagen mit einem dreiseitigen Wuerfel. | ||
| + | # Dabei sind die drei Zahlen 1, 2, 3 gleich wahrscheinlich. | ||
| + | zufall = randint(1, 3) | ||
| + | |||
| + | # Es folgt eine sogenannte " | ||
| + | # Falls die Variable " | ||
| + | # und nicht mit " | ||
| + | # werden die folgenden eingerueckten Zeilen durchgeführt. | ||
| + | if zufall == 1: | ||
| + | |||
| + | # Die neue x-Koordinate unseres springenden Punktes liegt genau zwischen der alten x-Koordinate | ||
| + | # des springenden Punktes und der x-Koordinate von A. | ||
| + | # Hier wird nun klar, dass " | ||
| + | # Der Variablen x links wird als neuem Wert das zugewiesen, | ||
| + | # was die Berechnung rechts ergibt - in dieser Berechnung wird der alte Wert von x verwendet. | ||
| + | x = x + 0.5 * (xA - x) | ||
| + | |||
| + | # Analog fuer die neue y-Koordinate | ||
| + | y = y + 0.5 * (yA - y) | ||
| + | |||
| + | # Hier endet der eingerückte Befehlsblock, | ||
| + | |||
| + | |||
| + | # Die beiden folgenden if-Bedingungen sind nun hoffentlich klar. | ||
| + | if zufall == 2: | ||
| + | x = x + 0.5 * (xB - x) | ||
| + | y = y + 0.5 * (yB - y) | ||
| + | if zufall == 3: | ||
| + | x = x + 0.5 * (xC - x) | ||
| + | y = y + 0.5 * (yC - y) | ||
| + | leinwand.set_at((round(x), | ||
| + | pygame.display.update((round(x), | ||
| + | # Das Updaten eines kleinen rechteckigen Bereichs ist deutlich schneller als das Updaten | ||
| + | # des gesamten Zeichenbereichs mit | ||
| + | # pygame.display.update() | ||
| + | pygame.time.delay(1) | ||
| + | |||
| + | # Alle 1000 Iterationen wird die Variable i ausgegeben. | ||
| + | if i % 1000 == 0: # " | ||
| + | print(i) | ||
| + | |||
| + | # Hier endet die for-Schleife, | ||
| + | |||
| + | print(" | ||
| + | print(f" | ||
| + | | ||
| + | |||
| + | # Pause von 5000 Millisekunden, | ||
| + | pygame.time.delay(5000) | ||
| + | # Schliesse das Zeichenfenster. | ||
| + | pygame.quit() | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Aufgabe 3: Python (inklusive pygame) installieren und das obige Programm zum Laufen bringen (zuerst in VS Code) ===== | ||
| + | |||
| + | <WRAP round todo> | ||
| + | 1. Installiere Python auf deinem Rechner. Am einfachsten geht dies über den Windows App Store.((Alternative (nicht empfohlen, denn vermutlich muss man dann noch einige Pfad-Einstellungen von Hand vornehmen): Download von https:// | ||
| + | |||
| + | 2. Speichere das obige Python-Programm '' | ||
| + | |||
| + | 3. Öffne das Programm '' | ||
| + | |||
| + | 4. Öffne die Anwendung/ | ||
| + | |||
| + | (Falls das Probleme macht, vielleicht klappt das Folgende (nicht getestet): Probiere es mit '' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | 5. Nun solltest du das Programm in VS-Code starten können (so wie im Punkt 3 beschrieben). | ||
| + | </ | ||
| + | |||
| + | ===== Ordnung im Chaos: Mehr Infos zum Chaos-Spiel ===== | ||
| + | |||
| + | <WRAP center round info> | ||
| + | Die Figur, die das Chaos-Spiel produziert, heisst [[https:// | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Aufgabe 4: Python-Extensions installieren (da VS Code gerade offen ist) ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Installiere die beiden Extensions " | ||
| + | |||
| + | * In der linken Symbolleiste klicke auf das " | ||
| + | * Im " | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Aufgabe 5: Programm per Eingabeaufforderung zum Laufen bringen ===== | ||
| + | |||
| + | |||
| + | <WRAP round todo> | ||
| + | Du kannst das Programm auch ohne den Editor/die Entwicklungsumgebung VS-Code ablaufen lassen: | ||
| + | |||
| + | Verwende wieder die App " | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Dein Screen sollte ungefähr wie folgt aussehen und das Programm sollte starten: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Alternativen: | ||
| + | - In der " | ||
| + | - Du kannst das Programm auch in der " | ||
| + | - Du kannst das Python-Programm direkt aus dem Explorer laufen lassen: Je nach Einstellungen, | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Wichtige Begriffe, die du kennen solltest ===== | ||
| + | |||
| + | <WRAP center round info> | ||
| + | Erklärung wichtiger Begriffe: // | ||
| + | |||
| + | * Eine Folge von Handlungsanweisungen (wie unsere erste Erklärung des Chaos-Spiels oben) nennt man einen [[https:// | ||
| + | |||
| + | * Das oben angegebene Python-Programm ist eine [[https:// | ||
| + | |||
| + | * Computerprogramme schreibt man in Editoren. Meist verwendet man Editoren, die das Programmieren sinnvoll unterstützen. Solche Editoren heissen [[https:// | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Bonus-Aufgabe 1 (relativ einfach) ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Verändere den Programm-Code so, dass 1' | ||
| + | </ | ||
| + | |||
| + | ===== Bonus-Aufgabe 2 (wenn du den Programm-Code ziemlich gut verstehst) ===== | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Passe das Python-Programm so an, dass einige der Bilder in https:// | ||
| + | * Sorge dafür, dass die Leinwand quadratisch ist (also Höhe = Breite). | ||
| + | * Definiere fünf Punkte $A$, $B$, $C$, $D$, $E$. | ||
| + | * Statt des Faktors 0.5 in den Programmzeilen, | ||
| + | |||
| + | Du darfst natürlich kreativ sein und andere Punktekonstellationen und Faktoren ausprobieren. | ||
| + | </ | ||
| + | | ||
| + | | ||
| + | |||
| + | ===== Link zur Kursseite ===== | ||
| + | |||
| + | [[lehrkraefte: | ||
| + | |||
| + | |||