Programmieren lernen (einfach)

Ergebnisse des Vorbereitungstreffens vom 15.02.2024

Programmieren lernen (einfach)

Ziel

Die Teilnehmenden kennen grundlegende Programmiertechniken und können einfache Programmieraufgaben selbstständig lösen. Dabei lernen sie Grundlegende Elemente der Programmiersprache Python kennen.

Erlernte Skills:

  • Prozedurale Programmierung
  • Einbinden und Nutzen von Bibliotheken
  • Umgang mit Kontrollstrukturen (If-Abfragen, for- und while-Schleife)
  • Nutzung von Funktionen
  • Nutzung von Variablen und Typen
  • Grundlegende Elemente der Turtle-Bibliothek

Erwartete Skills:

  • Starten von Programmen
  • Bearbeiten von Textdateien mit Thonny
  • Öffnen und Speichern von Dateien

Session-Format

  • Experten-Session (Kurze Einführung mit Selbstarbeitsphasen)

Ort

  • Online

Ablauf

Es wird 4 (ggf. 5) Sessions geben.

Session Aufgaben Zeitlicher Ablauf
Session 1 Aufgabe 1 Aufgabe 2 10 Minuten Einführung
10 Minuten Aufgabe 1
20 Minuten Aufgabe 2
10 Minuten for-Schleife und Grundlage Zeichnen eines N-Ecks
Hausaufgabe Aufgabe 3
Session 2 Aufgabe 4 Aufgabe 5 10 Minuten Kurze Wiederholung
40 Minuten Aufgaben 4+5
5 Minuten Zusammenfassung
Session 3 Aufgabe 6 (Teil 1) 10 Minuten Vorstellung Projekt Tic-Tac-Toe 40 Minuten - Funktionen zur Darstellung
Session 4 Aufgabe 6 (Teil 2) 5 Minuten Wiederholung
55 Minuten Spielelogik

Nächsten Schritte

  • Organisation der Sessions (Wann?)
    • Festlegung des Wochentags und der Uhrzeit
    • Festlegung der KW
    • Grundlegende Überlegungen zur Festlegung
      • Nach Möglichkeit keine Session in den Osterferien
        • Keine Unterbrechung der Serie von mehr als zwei Wochen
        • 4 Optionen
            1. und 2. Märzwoche + 2. und 3. Aprilwoche
            1. bis 3. Märzwoche + 2. und 3. Aprilwoche (Zusätzliche Übung vor Tic-Tac-Toe)
            1. und 3. Märzwoche + 2. und 3. Aprilwoche
          • Ab 2. Aprilwoche

Hey @greenem,
passt es dir die Session mittwochs von 15 bis 16 Uhr zu halten?

Bei mir würde es passen.

Hallo, wie würde das Treffen am 10. April stattfinden?

Hi Emil,
wie im Chat besprochen ist das erste Treffen doch erst am 17.04. Stattfinden wir der Workshop per BBB.

Ich möchte gerne mitmachen leider habe ich Mittwochs schon ein anderen Termin um 16:00 Uhr ich versuche ihn zu verschieben.

1 „Gefällt mir“

Dokumentation des 2024-04-17

!FEHLER IN DER PRÄSENTASTION DER SESSION!

Die turtle-Bibliothek ist in der Python-Standardbibliothek. D. h. jeder der Teilgenommen hat muss
das Paket PythonTurtle von seinem System entfernen. Die die es mit pip3 wie instruiert installiert haben können es so deinstlallieren

pip3 uninstall PythonTurtle --break-system-packages

Was wurde gelernt

  1. Variablen sind Behälter für Werte
  2. Programme werden von oben nach Unten ausgeführt
  3. Die Turtle malt wie ein Pinsel auf das Bildschirm bzw. das Fenster bzw. die Leinwand.
  4. Man muss die Turtle instruieren, was sie tuen soll.
  5. Programme können bestimmte Code-Teile überspringen, wenn eine Bedingung erfüllt ist.

Wie malt man ein Rechteck?

Dieser Code malt ein Rechteck mit Seitenlängen 100 und 60.

import turtle as t   # importiere die Inhalte der `turtle`-Bibliothek unter dem Namen `t`

window = t.Screen()  # Erstelle eine Fenster/Leinwand und gib ihm/ihr den Namen `window`
turtle = t.Turtle()  # Erstelle einen Pinsel/eine Turtle und gib ihm/ihr den Namen `turtle`
 
turtle.forward(100)  # Bewege die Turtle 100 Einheiten nach vorne
turtle.left(90)      # Drehe die Turtle um 90° nach links
turtle.forward(60)   # Bewege die Turtle 60 nach vorne
turtle.left(90)      # Drehe die Turtle wieder um 90°
turtle.forward(100)
turtle.left(90)
turtle.forward(60)

Wie führt man etwas bedingt aus?

z. B. wollen wir dem falls ein Wert größer als ein anderer ist etwas anders tun. Dies kann man
so formulieren: Falls a kleiner als b ist, dann mach dies, andernfalls mach das.

falls a < b:
    mach dass
andernfalls:
    mach dies

Und nun in Python

if a < b:
    # mach irgendwas
else: 
    # mach das andere

Hausaufgabe

Löse Aufgabe 2.

Anregungen

  1. t.textinput("Fenstername", "Frage").
  2. turtle.circle(radius)
  3. int(a) → wandelt a in eine Zahl um, falls es geht. Beispiel: Wandle den Text "10" in die Zahl 10 um

Dokumentation 24. April 2024

Was haben wir gelernt/gemacht

  1. Es gibt for- und while-Schleifen
    1.1. while-Schleifen laufen so lange wie die entsprechende Bedingung erfüllt ist.
    1.2 for-Schleifen arbeiten eine Liste ab. So eine Liste können wir z.B. durch range() erstellen.
  2. Funktionen speichern Programmcode unter einem Schlagwort, sodass er öfter verwendet werden kann.
    2.1 Funktionen muss man extra aufrufen
    2.2 print(), int(), t.forward() etc. sind schon vorhandene Funktionen. Man kann aber auch selber welche erstellen.

Wie male ich ein n-eck mit einer Schleife?

import turtle as t

ecken = int(t.textinput("Ecken", "Wie viele Ecken soll das n-Eck haben?"))

for i in range(0, ecken):
        t.forward(100) # Gehe 100 Einheiten nach vorne
        t.left(360/ecken) # Winkel

Zum Vergleich: Dieselbe Schleife mit while:

import turtle as t

ecken = int(t.textinput("Ecken", "Wie viele Ecken soll das n-Eck haben?"))
wiederholungen = ecken

while wiederholungen > 0:
    t.forward(100) # Gehe 100 Einheiten nach vorne
    t.left(360/ecken) # Winkel
    wiederholungen = wiederholungen - 1

Wie kann man die Schleife in einer Funktion ‘verpacken’?

def n_eck(ecken):
    for i in range(0, ecken): # ecken ist hierbei der übergebene Wert
        t.forward(100) 
        t.left(360/ecken)

HA

Löst Aufgabe 5.

Anregungen

  1. turtle.pencolor(colorstring) → ändert die Farbe. colorstring kann hierbei z.B. ‘red’, ‘brown’ oder ‘yellow’ sein.

Dokumentation des 2024-05-01

Was haben wir gemacht

  1. Hausaufgabe besprochen
  2. Angefangen über Tic-Tac-Toe nachzudenken
  3. Wie zeichnet man ein Tic-Tac-Toe Spielfeld bzw. stellt es programmatisch dar.

Hausaufgabe

Die Hausaufgabe zu dieser Session war Die Aufgabe 5, eine Musterlösung wäre in dem Fall

import turtle as t

farben = ["black", "green", "blue", "red", "yellow"]
anzahl_neunecke = 15
angle = 360 / anzahl_neunecke
for farbe in farben:
    t.color(farbe)
    for _ in range(anzahl_neunecke):
        n_eck(9)
        t.left(angle)

Aufgabe 06: Tic-Tac-Toe

  • Spielfeld zeichnen
  • Eingabe
  • Spiellogik
    • Spielfeld status speichern
    • Zeichen nach Eingabe hinzufügen
    • Entscheiden ob gewonnen, verloren, unentschieden
    • Dauerhaft wissen wer gerade spielt

Wie stellt man ein Spielfeld dar?

  • 3x3 Gitter
    • Eine Zeile [wert, wert, wert] unbenutzt, oder von spieler ein belegt
    • [Zeile, Zeile, Zeile]
    • wert unbenutztes Feld: “”, “x”, “o”
# Ein leeres Spielfeld
FELD = [
    ["", "", ""],
    ["", "", ""],
    ["", "", ""]
]
# Ein Spielfeld mit ein paar Elementen
FELD = [
    ["x", "", ""],
    ["o", "", ""],
    ["o", "", ""]
]

# Auf einzelne Elemente zugreifen:
FELD[Zeile][Spalte]

# Durch alle Felder durchiterieren, hier schreibt `x, , , o, , , o, , ,` ins Terminal
for zeile in FELD:
    for feld in zeile:
        print(feld, end=", ") 

Wie zeichnet man das?

  • 2 Gerade Striche nach unten, 2 Gerade striche zur Seite
  • an x und o Positionen ein X oder Kreis plazieren.

Musterlösung zum zeichnen eines Spielfeldes ohne Elemente(markierungen des Spielers)

def draw_field():
    # Wo die Linien Anfangen. Das Gatter ist 600x600 und ein Feldchen ist demnach 200x200
    starting_positions = [
        (-100, -300),
        (100, -300),
        (-300, -100),
        (-300, 100)
    ]
    
    # Die Turtle nach oben ausrichten
    t.left(90)
    for (count, pos) in enumerate(starting_positions): # Count ist ein Zähler, erzeugt durch `enumerate`,
                                                       # startend bei 0
        if count == 2: # Wir zeichnen die 3. Linie, welche Horizontal ist
            t.right(90)
        # up und down, da setposition einen Strich von der aktuellen Position zur Zielposition zieht
        t.up()
        t.setposition(pos) # Teleportiert die Turtle zur nächsten Startposition
        t.down()
        t.forward(600)

Hausaufgabe

Ändere (die/deine) draw_field-Funktion sodass sie einen Kreis an Stellen, welche Kreis besetzt hat zeichnet und ein Kreuz an stellen, welche Kreuz besetzt hat zeichnet.

Tipps

Tipp1

Iteration durch das Spielfeld ist hier sehr nützlich.

Tipp2

Es kann sich lohnen die Elemente erst nach dem Zeichnen der Grundstruktur einzuzeichnen.

Dokumentation des 2024-05-08

Was haben wir gemacht

  1. Hausaufgaben besprochen
  2. Über Tic-Tac-Toe-Logik nachgedacht
  3. Tic-Tac-Toe-Logik angefangen zu implementieren

Alte Hausaufgabe

Die alte Hausaufgabe bestand darin, ein beliebig belegtes Spielfeld zu zeichnen. Eine Musterlösung findet sich hier:

# ein beliebig belegtes Spielfeld
FELD = [
    ["x", "", "x"],
    ["", "x", ""],
    ["x", "", "x"]
]

# Zeichnet ein Kreuz mit Zentrum an der aktuellen Position der Turtle,
# nach dem Zeichnen befindet sich die Turtle an der Startposition mit
# gleicher Orientierung
def kreuz():
    # Angle the turtle to the left up
    t.left(45)
    for _ in range(4):
        # Draw the line of the current branch
        t.forward(90)
        # Go back to the origin of the X
        t.backward(90)
        # Rotate to the next line needing to be drawn
        t.left(90)
    # Reset the angle of the turtle
    t.right(45)

# Zeichne einen Kreis um die Turtle, die Turtle hat nach der Prozedur die 
# gleiche Ausrichtung
def kreis():
    # Bewege die Turtle auf den Umfang des Kreises und drehe sie in die richtung
    t.up()
    t.forward(90)
    t.left(90)
    t.down()
    t.circle(90)
    # Richte die Turtle wieder auf die Startposition aus.
    t.up()
    t.right(90)
    t.backward(90)

def draw_field():
    # Wo die Linien Anfangen. Das Gatter ist 600x600 und ein Feldchen ist demnach 200x200
    starting_positions = [
        (-100, -300),
        (100, -300),
        (-300, -100),
        (-300, 100)
    ]
    # Die Turtle nach oben ausrichten
    t.left(90)
    for (count, pos) in enumerate(starting_positions): # Count ist ein Zähler, erzeugt durch `enumerate`,
                                                       # startend bei 0
        if count == 2: # Wir zeichnen die 3. Linie, welche Horizontal ist
            t.right(90)
        # up und down, da setposition einen Strich von der aktuellen Position zur Zielposition zieht
        t.up()
        t.setposition(pos) # Teleportiert die Turtle zur nächsten Startposition
        t.down()
        t.forward(600)

    # Zeiche Spielermarkierungen
    t.up()
    # Positioniere die Turtle im oberst linken Feld
    t.setposition(-200, 200)
    t.down()
    for zeile in FELD:
        for symbol in zeile:
            if symbol == "x":
                kreuz()
            elif symbol == "o":
                kreis()
            t.up()
            # Bewege die Turtle zur nächsten Position in der aktuellen Reihe
            t.forward(200)
            t.down()
        Bewege die Turtle an den Anfang der nächsten Zeile
        t.up()
        t.backward(600)
        t.right(90)
        t.forward(200)
        t.left(90)
        t.down()

t.speed(10)
draw_field()

Weiter über Tic-Tac-Toe nachdenken

  • Tic-Tac-Toe hat 3 Enden:
    1. Spieler ‘x’ hat 3 'x’s in einer Spalte, Reihe, Diagonale arrangiert
    2. Spieler ‘o’ hat 3 'o’s in einer Spalte, Reihe, Diagonale arrangiert
    3. Das Spielfeld ist voll und keine der oberen Erreignisse ist eingetreten
  • Wie überprüft man das?
    • Durch jede Zeile 'x’s und 'o’s zählen
    • Durch jede Spalte 'x’s und 'o’s zählen
    • Diagonalen seperat überpüfen
    • Falls num(x) + num(o) = 9 ist das Feld voll.

Hausaufge

Implementiere Tic-Tac-Toe.

Tipp 1

… indem du eine Funktion schreibst welche den Zustand des Spielfeldes überpüft und entweder 0, ‘x’, ‘o’ oder ‘u’ (unentschieden) zurückgibt

Tipp 2

… in dem du Nutzer input wie damals für die Altersabfrage benutzt.

Unser Thema neigt sich dem Ende zu. Daher würden wir gerne noch von euch wissen, wie wir den Abschluss dieser Sessionreihe planen sollen. Stimmt dazu bitte kurz unten ab:

  • Bei mir sind keine Fragen offen geblieben; mein Spiel funktioniert super!
  • Ich würde gerne noch wissen wie ich mein Spiel verbessern kann/mein Spiel hat noch Fehler
0 Teilnehmer
  • Ich wünsche mir eine Abschluss-Session (Präsentation der Spiele, Austausch, Review, …)
  • Ich möchte keine Abschluss-Session machen
0 Teilnehmer

Super, dass das Spiel soweit funktioniert! Die gewünschte AAbschlussession findet dann am 2024-05-29T13:00:00Z2024-05-29T14:00:00Z statt.