🐍 Racket-Kurs: Vom AnfĂ€nger zum Snake-Spiel

Basierend auf den Prinzipien von Schreibe Dein Programm! und Die Macht der Abstraktion

Modul 1: Was ist Programmieren?

⏱ Dauer: 10 Minuten

1.1 Der Computer als Koch

🍳 Der Computer versteht nur genaue Anweisungen

😊 Du "Mach Sandwich!" ❌ đŸ€– Computer ??? 😊 "1. Nimm 2 Scheiben Brot" "2. Lege KĂ€se drauf..." ✓ đŸ€– 👍

Das ist Programmieren: Dem Computer genaue Anweisungen geben, die er versteht.

📚 Aus "Schreibe Dein Programm!"

Das deutsche Lehrbuch Schreibe Dein Programm! von Prof. Dr. Herbert Klaeren und Dr. Michael Sperber (UniversitĂ€t TĂŒbingen) beschreibt es so:

"Programme lassen sich sehr systematisch konstruieren und – teilweise nahezu automatisch – aus der gegebenen Problemstellung ableiten."

Das bedeutet: Programmieren ist kein RĂ€tselraten, sondern ein systematischer Prozess!

1.2 Warum Racket?

Racket ist eine Programmiersprache, die:

📚 Warum Scheme/Racket?

Aus Die Macht der Abstraktion:

"Scheme ist eine kleine und leicht erlernbare Programmiersprache, die es erlaubt, die Konzepte der Programmierung zu prÀsentieren, ohne Zeit mit der Konstruktvielfalt anderer Programmiersprachen zu verlieren."

1.3 Warum englischer Code?

Programmiersprachen verwenden englische Wörter. Das ist gut, weil:

📝 Modul 1: Quiz & RĂ€tsel

🧠 Quiz 1: Was ist Programmieren?

A) Mit dem Computer spielen
B) Dem Computer genaue Anweisungen geben
C) Im Internet surfen

🧠 Quiz 2: Warum ist Racket gut fĂŒr AnfĂ€nger?

A) Weil es die komplizierteste Sprache ist
B) Weil es keine Regeln hat
C) Weil es einfache Regeln hat und sofort Ergebnisse zeigt

đŸ§© Denk-RĂ€tsel: Der prĂ€zise Koch

Du möchtest, dass ein Roboter-Koch dir ein Spiegelei macht. Welche Anweisungen sind zu ungenau?

Ordne die Anweisungen: Schreibe "gut" oder "schlecht" fĂŒr jede:

  • "Mach mir ein Ei" → schlecht (zu ungenau!)
  • "Nimm ein Ei aus dem KĂŒhlschrank" → gut
  • "Koche irgendwas" → schlecht
  • "Erhitze die Pfanne auf mittlere Stufe" → gut

Merke: Computer brauchen GENAUE Anweisungen, genau wie unser Roboter-Koch!

✅ Was du in Modul 1 gelernt hast

  • Programmieren bedeutet, dem Computer genaue Anweisungen zu geben
  • Racket ist eine einfache Sprache mit klaren Regeln
  • Englischer Code wird weltweit verstanden
  • Programme können systematisch konstruiert werden

Modul 2: Erste Schritte mit Racket

⏱ Dauer: 15 Minuten

2.1 WeScheme starten

  1. Öffne https://www.wescheme.org
  2. Klicke auf "Start Coding"

📝 So sieht WeScheme aus

WeScheme Definitions (Hier schreibst du dein Programm) (define my-age 10) (define (double x) (* x 2)) ▶ Run Interactions (Hier testest du) > (double 5) 10

2.2 Die wichtigste Regel: Klammern!

🔄 Normale Mathematik vs. Racket

Normale Mathematik 2 + 3 Operator in der Mitte Racket (+ 2 3) Operator ZUERST!

📚 PrĂ€fix-Notation

Diese Schreibweise heißt PrĂ€fix-Notation (der Operator steht am Anfang/PrĂ€fix). Sie hat Vorteile:

  • Beliebig viele Argumente: (+ 1 2 3 4 5) statt 1+2+3+4+5
  • Keine Punkt-vor-Strich-Regel nötig: Die Klammern machen alles klar!
  • Konsistent: Funktionen und Operatoren funktionieren gleich

🎯 Übung 2.2: Tippe diese Beispiele

(+ 2 3)     ; → 5
(- 10 4)    ; → 6
(* 5 6)     ; → 30
(/ 20 4)    ; → 5

2.3 Verschachtelte Rechnungen

🧅 Wie Zwiebel-Schichten: Von innen nach außen!

Was ist (3 + 4) × 2 in Racket? (+ 3 4) Schritt 1: = 7 (* 7 2) Schritt 2: = 14 14

🔧 Konstruktionsanleitung: AusdrĂŒcke auswerten

So wertest du verschachtelte AusdrĂŒcke aus:

  1. Finde die innerste Klammer
  2. Berechne diesen Ausdruck
  3. Ersetze die Klammer durch das Ergebnis
  4. Wiederhole, bis nur noch ein Wert ĂŒbrig ist

📝 Modul 2: Quiz & RĂ€tsel

🧠 Quiz 1: Was ist (+ 5 (* 3 2))?

A) 16
B) 11
C) 30

🧠 Quiz 2: Welcher Ausdruck ist korrekt?

A) (5 + 3)
B) (+ 5 3)
C) + 5 3

đŸ§© Programmier-RĂ€tsel

Übersetze diese mathematischen AusdrĂŒcke in Racket:

MathematikRacket
7 + 8(+ 7 8)
10 - 3(- 10 3)
(5 + 5) × 2(* (+ 5 5) 2)
100 Ă· (2 + 3)(/ 100 (+ 2 3))

Probiere alle in WeScheme aus!

đŸ§© Knobel-Aufgabe: Das Ergebnis finden

Was ergibt dieser Ausdruck? Löse ihn Schritt fĂŒr Schritt:

(* (+ 2 3) (- 10 6))

Hinweis: Erst (+ 2 3) = 5, dann (- 10 6) = 4, dann (* 5 4) = ?

✅ Was du in Modul 2 gelernt hast

  • WeScheme hat zwei Bereiche: Definitions und Interactions
  • In Racket kommt der Operator ZUERST: (+ 2 3)
  • Verschachtelte AusdrĂŒcke werden von innen nach außen ausgewertet
  • Klammern machen die Reihenfolge eindeutig

Modul 3: Funktionen verstehen und schreiben

⏱ Dauer: 20 Minuten

3.1 Was ist eine Funktion?

🏭 Eine Funktion ist wie eine Maschine

5 Input double (* x 2) Funktion 10 Output

3.2 Eingebaute Funktionen

(abs -5)           ; abs = absolute value (Absolutwert) → 5
(max 3 7 2)        ; max = maximum (Maximum) → 7
(min 3 7 2)        ; min = minimum (Minimum) → 2
(sqr 4)            ; sqr = square (Quadrat, 4ÂČ) → 16

3.3 Eigene Variablen mit define

(define age 10)              ; age = Alter
(define favorite-number 42)  ; favorite-number = Lieblingszahl

(+ age 5)               ; → 15
(* favorite-number 2)   ; → 84

3.4 Eigene Funktionen definieren

🔧 So baut man eine Funktion

(define (double x) (* x 2)) Äußere Klammern Keyword Name Parameter Rumpf

🔧 Konstruktionsanleitung 1: Funktionen erstellen

Nach Schreibe Dein Programm! gehst du so vor:

  1. Kurzbeschreibung: Was macht die Funktion? (1 Satz)
  2. Signatur: Welche Daten rein, welche raus?
  3. TestfÀlle: Beispiele schreiben
  4. GerĂŒst: (define (name param) ...)
  5. Rumpf: Die eigentliche Berechnung
  6. Testen: Funktioniert alles?

📝 Beispiel: Funktion "years-to-days" Schritt fĂŒr Schritt

Aufgabe: Schreibe eine Funktion, die Jahre in Tage umrechnet.

Schritt 1: Kurzbeschreibung
; Rechnet die Anzahl der Jahre in Tage um
Schritt 2: Signatur
; years-to-days: number -> number

Eine Zahl rein (Jahre), eine Zahl raus (Tage)

Schritt 3: TestfÀlle
(check-expect (years-to-days 1) 365)
(check-expect (years-to-days 2) 730)
(check-expect (years-to-days 0) 0)
Schritt 4: GerĂŒst
(define (years-to-days years)
  ...)
Schritt 5: Rumpf ausfĂŒllen
(define (years-to-days years)
  (* years 365))
Schritt 6: Testen

Klicke "Run" → Alle Tests sollten grĂŒn sein! ✓

📚 Das erste Mantra

Aus Schreibe Dein Programm!:

"Schreibe zuerst Tests, dann den Code. Tests helfen dir, das Problem zu verstehen, bevor du es löst."

🎯 Übung: Schreibe eigene Funktionen

; Funktion, die 10 addiert:
(define (plus-ten x)
  (+ x 10))

; Funktion, die das Quadrat berechnet:
(define (my-square x)
  (* x x))

; Funktion mit zwei Parametern:
(define (rectangle-area width height)
  (* width height))

📝 Modul 3: Quiz & RĂ€tsel

🧠 Quiz 1: Was gibt (my-square 5) zurĂŒck?

A) 10
B) 25
C) 5

🧠 Quiz 2: Welche Definition ist korrekt?

A) (define triple x (* x 3))
B) (define (triple x) (* x 3))
C) (define triple (x) (* x 3))

đŸ§© Programmier-RĂ€tsel 1: VervollstĂ€ndige die Funktion

Diese Funktion soll eine Zahl verdreifachen und dann 1 abziehen:

(define (mystery x)
  (- (* x ?) ?))

Ersetze die ? so, dass (mystery 5) das Ergebnis 14 ergibt.

Hinweis: 5 × ? = 15, dann 15 - ? = 14

đŸ§© Programmier-RĂ€tsel 2: Die Durchschnitts-Funktion

Diese Funktion soll den Durchschnitt von zwei Zahlen berechnen:

(define (average a b)
  (? (? a b) 2))

(average 4 6) soll 5 ergeben. (average 10 20) soll 15 ergeben.

Hinweis: Durchschnitt = (a + b) Ă· 2

đŸ§© Programmier-RĂ€tsel 3: Die Alters-Funktion

Diese Funktion berechnet, wie alt jemand in 10 Jahren sein wird:

(define (? current-age)
  (? current-age ?))

(??? 25) soll 35 ergeben.

đŸ§© Denk-Aufgabe: Funktionen kombinieren

Gegeben sind diese Funktionen:

(define (double x) (* x 2))
(define (add-five x) (+ x 5))

Was ergibt (double (add-five 3))?

✅ Was du in Modul 3 gelernt hast

  • Funktionen sind wie Maschinen mit Input und Output
  • Mit define erstellst du Variablen und Funktionen
  • Funktionsnamen mit Parametern brauchen extra Klammern
  • Die Konstruktionsanleitung hilft beim systematischen Vorgehen

Modul 4: Listen – Die Macht der Datenstrukturen

⏱ Dauer: 30 Minuten

4.1 Warum brauchen wir Listen?

Statt viele einzelne Variablen nutzen wir EINE Liste:

(define scores (list 100 250 180 90 300))

4.2 Listen visualisiert

🔗 Eine Liste ist wie eine Kette

first 10
→
20
→
30
→
40
→
empty

📚 Listen in der funktionalen Programmierung

Aus inf-schule.de:

"Ein funktionales Programm besteht aus einer Sammlung an Funktionen, die durch geschickte Kombination miteinander auch sehr komplexe Probleme lösen können."

Listen sind dabei fundamental – der Name "LISP" steht fĂŒr "LISt Processing"!

4.3 first und rest

(define numbers (list 10 20 30 40))

(first numbers)   ; → 10
(rest numbers)    ; → (list 20 30 40)
(first (rest numbers))  ; → 20

4.4 cons – Listen zusammenbauen

(cons 5 (list 10 20 30))   ; → (list 5 10 20 30)
(cons 1 empty)             ; → (list 1)

4.5 Rekursion – Die Magie!

🔧 Konstruktionsanleitung: Listen verarbeiten

Eine Funktion, die eine Liste verarbeitet, hat diese Schablone:

(define (process-list lst)
  (if (empty? lst)
      ; Basisfall: Was tun bei leerer Liste?
      basis-wert
      ; Rekursivfall: Verarbeite first, dann rest
      (kombiniere (first lst) 
                  (process-list (rest lst)))))

🔄 Rekursion Schritt fĂŒr Schritt

(sum (list 1 2 3)) = (+ 1 (sum (list 2 3))) = (+ 1 (+ 2 (sum (list 3)))) = (+ 1 (+ 2 (+ 3 (sum empty)))) = (+ 1 (+ 2 (+ 3 0))) = (+ 1 (+ 2 3)) = (+ 1 5) = 6

📝 Modul 4: Quiz & RĂ€tsel

🧠 Quiz 1: Was ist (first (list 5 10 15))?

A) 5
B) 10
C) (list 10 15)

🧠 Quiz 2: Was ist (rest (list 5 10 15))?

A) 5
B) 15
C) (list 10 15)

🧠 Quiz 3: Was ist (cons 1 (list 2 3))?

A) (list 1 2 3)
B) (list 2 3 1)
C) (list (list 1) 2 3)

đŸ§© Listen-RĂ€tsel

Gegeben: (define zahlen (list 100 200 300))

Wie bekommst du das zweite Element (200)?

Tipp: Benutze first und rest zusammen!

Lösung: (first (rest zahlen))

đŸ§© Rekursions-RĂ€tsel

Diese Funktion zÀhlt die Elemente einer Liste:

(define (my-length lst)
  (if (empty? lst)
      0
      (+ 1 (my-length (rest lst)))))

Was ergibt (my-length (list "a" "b" "c" "d"))?

✅ Was du in Modul 4 gelernt hast

  • Listen speichern mehrere Werte in einer Struktur
  • first gibt das erste Element, rest den Rest
  • cons fĂŒgt ein Element vorne an
  • Rekursion: Eine Funktion, die sich selbst aufruft
  • Die Schablone fĂŒr Listen-Funktionen: Basisfall + Rekursivfall

Modul 5: Bilder zeichnen

⏱ Dauer: 15 Minuten

5.1 Grundformen

🎹 Diese Formen kannst du zeichnen

(circle 35 "solid" "red") (rectangle 70 45 "solid" "green") (square 55 "solid" "orange") (circle 30 "outline" "blue") (triangle 50 "solid" "purple")

5.2 Bilder kombinieren

; above = ĂŒbereinander
(above (circle 30 "solid" "red")
       (circle 50 "solid" "blue"))

; beside = nebeneinander
(beside (square 40 "solid" "red")
        (square 40 "solid" "green"))

; overlay = ĂŒberlagern
(overlay (circle 20 "solid" "white")
         (circle 50 "solid" "black"))

5.3 Das Koordinatensystem

📍 y=0 ist OBEN! (anders als in Mathe)

x → y ↓ (0,0) (100, 50) (180, 130)

5.4 place-image

(place-image (circle 20 "solid" "red")
             100 150    ; x=100, y=150
             (empty-scene 400 300))

📝 Modul 5: Quiz & RĂ€tsel

🧠 Quiz: Wo ist (0,0) im Racket-Koordinatensystem?

A) Oben links
B) Unten links
C) In der Mitte

đŸ§© Kreativ-Aufgabe: Baue einen Schneemann!

Kombiniere drei Kreise ĂŒbereinander:

(above (circle 20 "solid" "white")
       (circle 30 "solid" "white")
       (circle 40 "solid" "white"))

Bonus: FĂŒge Augen hinzu mit overlay!

đŸ§© Ampel-RĂ€tsel

Erstelle eine Ampel mit drei Kreisen (rot, gelb, grĂŒn) ĂŒbereinander.

Lösung:

(above (circle 25 "solid" "red")
       (circle 25 "solid" "yellow")
       (circle 25 "solid" "green"))

✅ Was du in Modul 5 gelernt hast

  • Grundformen: circle, rectangle, square, triangle
  • Stile: "solid" (gefĂŒllt) oder "outline" (Umriss)
  • Kombinieren: above, beside, overlay
  • Koordinatensystem: (0,0) ist oben links, y wĂ€chst nach unten
  • place-image platziert Bilder auf einer Szene

Modul 6: Animation – Dinge bewegen sich!

⏱ Dauer: 20 Minuten

6.1 Was ist eine Animation?

🎬 Die drei Teile einer Animation

STATE Zustand (z.B. y=50) TICK Ändert Zustand DRAW Zeichnet Bild

📚 Zustandsbasierte Programme

Programme mit Animation haben einen Zustand (state), der sich ĂŒber die Zeit Ă€ndert. Das ist ein wichtiges Konzept in der Informatik!

In Schreibe Dein Programm! werden Studierende bis zum Ende des Semesters befÀhigt, PacMan, Tetris oder Asteroids nachzubauen.

6.2 Interaktive Demo: Fallender Ball

🔮 Klicke Start um den Ball fallen zu sehen

y-Position: 10

6.3 Der Code dazu

; tick: Ball fĂ€llt (y wird grĂ¶ĂŸer)
(define (tick y)
  (+ y 3))

; draw: Zeichnet den Ball
(define (draw y)
  (place-image (circle 20 "solid" "red")
               200 y
               (empty-scene 400 400)))

; Animation starten!
(big-bang 0
  (on-tick tick)
  (to-draw draw))

6.4 Tastatur-Steuerung

(define (handle-key y key)
  (cond
    [(string=? key "up") (- y 10)]
    [(string=? key "down") (+ y 10)]
    [else y]))

(big-bang 200
  (to-draw draw)
  (on-key handle-key))

📝 Modul 6: Quiz & RĂ€tsel

🧠 Quiz 1: Was macht on-tick?

A) Zeichnet das Bild
B) Ruft eine Funktion bei jedem Zeitschritt auf
C) Reagiert auf Tastendruck

🧠 Quiz 2: Wenn y grĂ¶ĂŸer wird, wohin bewegt sich der Ball?

A) Nach oben
B) Nach unten
C) Nach rechts

đŸ§© Code-RĂ€tsel: Schnellerer Ball

Der Ball fÀllt mit (+ y 3) um 3 Pixel pro Tick.

Wie Ànderst du den Code, damit er doppelt so schnell fÀllt?

Lösung: (+ y 6)

đŸ§© Denk-Aufgabe: Bewegung nach links

Wenn der Zustand die x-Position ist, wie bewegst du ein Objekt nach LINKS?

Tipp: Links bedeutet, x wird...

✅ Was du in Modul 6 gelernt hast

  • Animationen brauchen: Zustand, Tick-Funktion, Zeichen-Funktion
  • big-bang startet die Animation
  • on-tick Ă€ndert den Zustand automatisch
  • to-draw zeichnet den aktuellen Zustand
  • on-key reagiert auf Tasteneingaben

Modul 7a: Snake – Die Spielwelt aufbauen 🐍

⏱ Dauer: 15 Minuten | Teil 1 von 3

In den nĂ€chsten drei Modulen bauen wir Schritt fĂŒr Schritt das Snake-Spiel. Heute: Die Grundlagen der Spielwelt.

7a.1 Die Konstanten

Zuerst definieren wir feste Werte, die sich nicht Àndern:

; GrĂ¶ĂŸe eines Schlangen-Segments in Pixeln
(define SIZE 20)

; Spielfeld-GrĂ¶ĂŸe
(define WIDTH 400)
(define HEIGHT 400)

; Der Hintergrund
(define BACKGROUND (empty-scene WIDTH HEIGHT "black"))

💡 Warum Konstanten?

Wenn wir spĂ€ter die GrĂ¶ĂŸe Ă€ndern wollen, mĂŒssen wir nur EINE Zahl Ă€ndern, nicht hunderte im ganzen Code!

7a.2 Die Schlange als Liste

Die Schlange besteht aus mehreren Segmenten. Jedes Segment hat eine Position (x, y):

🐍 Die Schlange = Liste von Positionen

Kopf (200, 200) → (180, 200) → (160, 200) → empty
; Eine Position ist eine Liste mit x und y
(define pos1 (list 200 200))  ; Kopf
(define pos2 (list 180 200))  ; Mitte
(define pos3 (list 160 200))  ; Schwanz

; Die Schlange ist eine Liste von Positionen
(define my-snake (list pos1 pos2 pos3))

7a.3 Hilfsfunktionen fĂŒr Positionen

; Hole x-Koordinate aus einer Position
(define (pos-x pos) (first pos))

; Hole y-Koordinate aus einer Position
(define (pos-y pos) (second pos))

; Test:
(pos-x (list 200 150))  ; → 200
(pos-y (list 200 150))  ; → 150

7a.4 Ein Segment zeichnen

; Zeichnet ein grĂŒnes Quadrat an Position pos
(define (draw-segment pos image)
  (place-image 
    (square (- SIZE 2) "solid" "green")
    (pos-x pos)
    (pos-y pos)
    image))

7a.5 Die ganze Schlange zeichnen (Rekursion!)

Wir benutzen Rekursion, um jedes Segment zu zeichnen:

; Zeichnet alle Segmente der Schlange
(define (draw-snake snake image)
  (if (empty? snake)
      image  ; Fertig! Gib das Bild zurĂŒck
      (draw-snake 
        (rest snake)  ; Rekursion mit dem Rest
        (draw-segment (first snake) image))))

🔧 Wie funktioniert draw-snake?

  1. Ist die Liste leer? → Fertig, gib das Bild zurĂŒck
  2. Sonst: Zeichne das erste Segment
  3. Rufe draw-snake mit dem Rest der Liste auf
  4. Wiederhole, bis die Liste leer ist

7a.6 Das Futter zeichnen

; Futter ist auch eine Position
(define food (list 300 300))

; Zeichnet das Futter als roten Kreis
(define (draw-food food-pos image)
  (place-image
    (circle (/ SIZE 2) "solid" "red")
    (pos-x food-pos)
    (pos-y food-pos)
    image))

7a.7 Alles zusammen: Die Zeichenfunktion

; Zeichnet Schlange und Futter auf den Hintergrund
(define (draw-game snake food)
  (draw-snake snake
    (draw-food food BACKGROUND)))

🎯 Probiere es aus!

Kopiere den gesamten Code in WeScheme und teste:

(draw-game my-snake food)

Du solltest eine grĂŒne Schlange und rotes Futter sehen!

📝 Modul 7a: Quiz & RĂ€tsel

🧠 Quiz 1: Was ist die Schlange in unserem Programm?

A) Ein Bild
B) Eine Liste von Positionen
C) Eine einzelne Zahl

🧠 Quiz 2: Warum benutzen wir Rekursion in draw-snake?

A) Weil es cool aussieht
B) Um jedes Segment der Liste zu zeichnen
C) Weil Racket keine Schleifen hat

đŸ§© Code-RĂ€tsel: Position erstellen

Wie erstellst du eine Position bei x=100 und y=250?

(list )

✅ Was du in Modul 7a gelernt hast

  • Konstanten fĂŒr Spielfeld-GrĂ¶ĂŸe definieren
  • Positionen als Listen mit (x, y) darstellen
  • Die Schlange als Liste von Positionen
  • Rekursives Zeichnen aller Segmente
  • Futter als roter Kreis

Modul 7b: Snake – Die Bewegung 🐍

⏱ Dauer: 20 Minuten | Teil 2 von 3

Jetzt bringen wir die Schlange in Bewegung! Das ist der kniffligste Teil.

7b.1 Wie bewegt sich eine Schlange?

🎬 Der Trick: Kopf hinzufĂŒgen, Schwanz entfernen!

Vorher: Schwanz Bewegung nach rechts Nachher: neuer Kopf weg! ✓ Neuer Kopf vorne (cons) ✗ Alter Schwanz weg (drop-last)

7b.2 Neuen Kopf berechnen

Je nach Richtung Àndert sich x oder y:

; Berechnet die neue Kopf-Position
(define (new-head head direction)
  (cond
    [(string=? direction "up") 
     (list (pos-x head) (- (pos-y head) SIZE))]
    [(string=? direction "down") 
     (list (pos-x head) (+ (pos-y head) SIZE))]
    [(string=? direction "left") 
     (list (- (pos-x head) SIZE) (pos-y head))]
    [(string=? direction "right") 
     (list (+ (pos-x head) SIZE) (pos-y head))]))

💡 Denk dran: y=0 ist OBEN!

"up" bedeutet y wird kleiner (- SIZE)

"down" bedeutet y wird grĂ¶ĂŸer (+ SIZE)

7b.3 Das letzte Element entfernen

Wir brauchen eine Funktion, die das letzte Element einer Liste entfernt:

; Entfernt das letzte Element einer Liste
(define (drop-last lst)
  (if (empty? (rest lst))
      empty  ; Nur noch 1 Element? Gib leere Liste zurĂŒck
      (cons (first lst) 
            (drop-last (rest lst)))))

; Test:
(drop-last (list 1 2 3 4))  ; → (list 1 2 3)

🔄 drop-last Schritt fĂŒr Schritt

(drop-last (list 1 2 3 4)) = (cons 1 (drop-last (list 2 3 4))) = (cons 1 (cons 2 (drop-last (list 3 4)))) = (cons 1 (cons 2 (cons 3 empty))) = (list 1 2 3)

7b.4 Die Schlange bewegen

; Bewegt die Schlange um einen Schritt
(define (move-snake snake direction)
  (cons (new-head (first snake) direction)  ; Neuer Kopf vorne
        (drop-last snake)))                   ; Schwanz weg

7b.5 Der Spielzustand

Wir packen alles in einen "Zustand":

; Der Spielzustand ist eine Liste: (snake direction food)
(define START-STATE
  (list
    (list (list 200 200) (list 180 200) (list 160 200))  ; Schlange
    "right"                                                ; Richtung
    (list 300 300)))                                      ; Futter

; Hilfsfunktionen fĂŒr den Zustand
(define (game-snake state) (first state))
(define (game-direction state) (second state))
(define (game-food state) (third state))

7b.6 Die Tick-Funktion

; Wird bei jedem Zeitschritt aufgerufen
(define (tick state)
  (list
    (move-snake (game-snake state) (game-direction state))
    (game-direction state)
    (game-food state)))

🎯 Teste die Bewegung!

; Starte eine einfache Animation
(big-bang START-STATE
  (on-tick tick 0.2)
  (to-draw (lambda (state) 
    (draw-game (game-snake state) (game-food state)))))

Die Schlange sollte sich jetzt nach rechts bewegen!

📝 Modul 7b: Quiz & RĂ€tsel

🧠 Quiz 1: Was macht move-snake?

A) Zeichnet die Schlange
B) FĂŒgt neuen Kopf hinzu und entfernt den Schwanz
C) Ändert die Farbe der Schlange

🧠 Quiz 2: Wenn direction="up" ist, was passiert mit y?

A) y wird kleiner (- SIZE)
B) y wird grĂ¶ĂŸer (+ SIZE)
C) y bleibt gleich

đŸ§© Code-RĂ€tsel: Bewegung verstehen

Der Kopf ist bei Position (100, 100). Die Richtung ist "right".

Wo ist der neue Kopf? (SIZE = 20)

x = , y =

✅ Was du in Modul 7b gelernt hast

  • Bewegung = neuer Kopf vorne + Schwanz entfernen
  • new-head berechnet die nĂ€chste Position
  • drop-last entfernt das letzte Element
  • Der Spielzustand enthĂ€lt: Schlange, Richtung, Futter
  • tick aktualisiert den Zustand bei jedem Zeitschritt

Modul 7c: Snake – Das komplette Spiel 🐍

⏱ Dauer: 20 Minuten | Teil 3 von 3

Jetzt fĂŒgen wir Tastatur-Steuerung und Game Over hinzu!

7c.1 Interaktive Demo

🎼 Benutze die Pfeiltasten!

Richtung: right | Klicke erst auf das Spielfeld!

7c.2 Tastatur-Steuerung

; Reagiert auf Pfeiltasten
(define (handle-key state key)
  (cond
    [(string=? key "up")
     (list (game-snake state) "up" (game-food state))]
    [(string=? key "down")
     (list (game-snake state) "down" (game-food state))]
    [(string=? key "left")
     (list (game-snake state) "left" (game-food state))]
    [(string=? key "right")
     (list (game-snake state) "right" (game-food state))]
    [else state]))  ; Andere Tasten ignorieren

7c.3 Kollision mit der Wand

; PrĂŒft, ob eine Position außerhalb des Spielfelds ist
(define (outside? pos)
  (or (< (pos-x pos) 0)
      (> (pos-x pos) WIDTH)
      (< (pos-y pos) 0)
      (> (pos-y pos) HEIGHT)))

; Spiel vorbei, wenn der Kopf außerhalb ist
(define (game-over? state)
  (outside? (first (game-snake state))))

7c.4 Das komplette Spiel starten

(big-bang START-STATE
  (on-tick tick 0.2)           ; Alle 0.2 Sekunden bewegen
  (to-draw draw-state)         ; Zeichnen
  (on-key handle-key)          ; Tastatur
  (stop-when game-over?))      ; Beenden bei Kollision

7c.5 Kompletter Code

📋 Klicke hier fĂŒr den gesamten Code zum Kopieren

▌
; ===== SNAKE SPIEL =====
; FĂŒr DrRacket (nicht WeScheme!)
(require 2htdp/universe)
(require 2htdp/image)

; ===== KONSTANTEN =====
(define SIZE 20)
(define WIDTH 400)
(define HEIGHT 400)
(define BACKGROUND (empty-scene WIDTH HEIGHT "black"))

; ===== POSITION HELFER =====
(define (pos-x pos) (first pos))
(define (pos-y pos) (second pos))

; ===== SPIELZUSTAND HELFER =====
(define (game-snake state) (first state))
(define (game-direction state) (second state))
(define (game-food state) (third state))

; ===== ZEICHNEN =====
(define (draw-segment pos image)
  (place-image 
    (square (- SIZE 2) "solid" "green")
    (pos-x pos) (pos-y pos) image))

(define (draw-snake snake image)
  (if (empty? snake) image
      (draw-snake (rest snake)
        (draw-segment (first snake) image))))

(define (draw-food food-pos image)
  (place-image
    (circle (/ SIZE 2) "solid" "red")
    (pos-x food-pos) (pos-y food-pos) image))

(define (draw-state state)
  (draw-snake (game-snake state)
    (draw-food (game-food state) BACKGROUND)))

; ===== BEWEGUNG =====
(define (new-head head direction)
  (cond
    [(string=? direction "up") 
     (list (pos-x head) (- (pos-y head) SIZE))]
    [(string=? direction "down") 
     (list (pos-x head) (+ (pos-y head) SIZE))]
    [(string=? direction "left") 
     (list (- (pos-x head) SIZE) (pos-y head))]
    [(string=? direction "right") 
     (list (+ (pos-x head) SIZE) (pos-y head))]))

(define (drop-last lst)
  (if (empty? (rest lst)) empty
      (cons (first lst) (drop-last (rest lst)))))

(define (move-snake snake direction)
  (cons (new-head (first snake) direction)
        (drop-last snake)))

; ===== TICK =====
(define (tick state)
  (list
    (move-snake (game-snake state) (game-direction state))
    (game-direction state)
    (game-food state)))

; ===== TASTATUR =====
(define (handle-key state key)
  (cond
    [(string=? key "up")
     (list (game-snake state) "up" (game-food state))]
    [(string=? key "down")
     (list (game-snake state) "down" (game-food state))]
    [(string=? key "left")
     (list (game-snake state) "left" (game-food state))]
    [(string=? key "right")
     (list (game-snake state) "right" (game-food state))]
    [else state]))

; ===== GAME OVER =====
(define (outside? pos)
  (or (< (pos-x pos) 0)
      (> (pos-x pos) WIDTH)
      (< (pos-y pos) 0)
      (> (pos-y pos) HEIGHT)))

(define (game-over? state)
  (outside? (first (game-snake state))))

; ===== START =====
(define START-STATE
  (list
    (list (list 200 200) (list 180 200) (list 160 200))
    "right"
    (list 300 300)))

(big-bang START-STATE
  (on-tick tick 0.2)
  (to-draw draw-state)
  (on-key handle-key)
  (stop-when game-over?))

📝 Modul 7c: Quiz & RĂ€tsel

🧠 Quiz: Was prĂŒft outside?

A) Ob die Schlange sich selbst berĂŒhrt
B) Ob eine Position außerhalb des Spielfelds ist
C) Ob das Futter gegessen wurde

đŸ§© Erweiterungs-Ideen zum Ausprobieren

Versuche, das Spiel zu erweitern:

  1. Futter fressen: Wenn Kopf = Futter-Position, wÀchst die Schlange (kein drop-last!)
  2. Neues Futter: Nach dem Fressen: zufÀllige neue Position
  3. PunktezĂ€hler: FĂŒge eine Zahl zum Zustand hinzu
  4. Selbst-Kollision: Game Over, wenn Kopf ein anderes Segment berĂŒhrt

🎓 Herzlichen GlĂŒckwunsch!

Du hast ein komplettes Spiel programmiert! Das zeigt, dass du verstehst:

  • ✅ Funktionen definieren und kombinieren
  • ✅ Listen und Rekursion
  • ✅ Bilder zeichnen
  • ✅ Animation mit big-bang
  • ✅ Tastatur-Events
  • ✅ Komplexe SpielzustĂ€nde verwalten

✅ Was du in Modul 7c gelernt hast

  • Tastatur-Events mit on-key verarbeiten
  • Richtung Ă€ndern basierend auf Pfeiltasten
  • Kollisionserkennung mit outside?
  • Spiel beenden mit stop-when
  • Alle Teile zu einem kompletten Spiel zusammenfĂŒgen!

HÀufige Fehler und Lösungen

📖 Die wichtigsten Fehler und wie man sie vermeidet

❌ Fehler 1: Klammern falsch

(+ 1 2 3))     ; Zu viele! ❌
(+ 1 2 3       ; Zu wenige! ❌
(+ 1 2 3)      ; ✓ Richtig!

❌ Fehler 2: Operator in der Mitte

(2 + 3)        ; ❌ FALSCH
(+ 2 3)        ; ✓ RICHTIG

❌ Fehler 3: Leerzeichen in Namen

(define my name "Max")    ; ❌
(define my-name "Max")    ; ✓

❌ Fehler 4: first auf leerer Liste

(first empty)    ; ❌ FEHLER!
; Erst prĂŒfen:
(if (empty? lst) 0 (first lst))  ; ✓

❌ Fehler 5: Funktions-Definition ohne Klammern

(define double x (* x 2))      ; ❌
(define (double x) (* x 2))    ; ✓

Englisch-Deutsch Wörterbuch

EnglischDeutsch
definedefinieren
list / first / restListe / erstes / Rest
empty / empty?leer / ist leer?
conskonstruieren
if / cond / elsewenn / Bedingungen / sonst
circle / rectangle / squareKreis / Rechteck / Quadrat
above / beside / overlayĂŒbereinander / nebeneinander / ĂŒberlagern
place-image / empty-sceneBild platzieren / leere Szene
big-bang / on-tick / to-drawAnimation / bei Tick / zeichnen
on-key / stop-whenbei Taste / stoppen wenn
snake / food / directionSchlange / Futter / Richtung

📖 Schnellreferenz (Spickzettel)

Alles Wichtige auf einen Blick!

🔱 Rechenoperationen

(+ 1 2 3)       ; → 6
(- 10 3)        ; → 7
(* 4 5)         ; → 20
(/ 20 4)        ; → 5
(sqr 5)         ; → 25
(abs -7)        ; → 7

📝 Variablen & Funktionen

(define name 42)
(define (double x) (* x 2))

📋 Listen

(list 1 2 3)    (first lst)    (rest lst)
(cons 0 lst)    (empty? lst)   (length lst)

❓ Bedingungen

(if bedingung dann sonst)
(cond [bed1 res1] [bed2 res2] [else default])

🎹 Bilder

(circle r "solid" farbe)
(rectangle b h "solid" farbe)
(above bild1 bild2)  (beside bild1 bild2)
(place-image bild x y szene)

🎬 Animation

(big-bang start-zustand
  (on-tick tick-funktion)
  (to-draw zeichen-funktion)
  (on-key tasten-funktion)
  (stop-when stopp-bedingung))

📚 WeiterfĂŒhrende Ressourcen

🎓 Kursabschluss: Was du gelernt hast

Herzlichen GlĂŒckwunsch! Du hast den gesamten Kurs durchgearbeitet!

🏆 Deine neuen FĂ€higkeiten

🔱 Racket-Syntax
📝 Funktionen
📋 Listen
🔄 Rekursion
🎹 Grafik
🎬 Animation
🎼 Spieleprogrammierung

📊 Zusammenfassung aller Module

Modul 1: Was ist Programmieren?

  • Programmieren = Computer genaue Anweisungen geben
  • Racket ist einfach und zeigt sofort Ergebnisse
  • Systematisches Konstruieren ist der SchlĂŒssel

Modul 2: Erste Schritte

  • PrĂ€fix-Notation: (+ 2 3) statt 2 + 3
  • Verschachtelte AusdrĂŒcke: Von innen nach außen
  • WeScheme hat Definitions- und Interactions-Bereich

Modul 3: Funktionen

  • Funktionen = Maschinen mit Input → Output
  • (define (name param) body)
  • Konstruktionsanleitung: Kurzbeschreibung → Signatur → Tests → Code

Modul 4: Listen

  • Listen speichern mehrere Werte
  • first, rest, cons, empty?
  • Rekursion: Basisfall + Rekursivfall

Modul 5: Bilder

  • Grundformen: circle, rectangle, square, triangle
  • Kombinieren: above, beside, overlay
  • Platzieren: place-image, empty-scene

Modul 6: Animation

  • Zustand + Tick-Funktion + Zeichen-Funktion
  • big-bang startet die Animation
  • Tastatur-Events mit on-key

Modul 7a: Snake – Die Spielwelt

  • Konstanten fĂŒr Spielfeld-GrĂ¶ĂŸe
  • Positionen als (x, y) Listen
  • Schlange als Liste von Positionen
  • Rekursives Zeichnen mit draw-snake

Modul 7b: Snake – Die Bewegung

  • Bewegung = neuer Kopf + Schwanz entfernen
  • new-head berechnet nĂ€chste Position
  • drop-last entfernt letztes Element
  • Der Spielzustand: (Schlange, Richtung, Futter)

Modul 7c: Snake – Das komplette Spiel

  • Tastatur-Steuerung mit on-key
  • Kollisionserkennung mit outside?
  • Alles zusammen mit big-bang

📚 Das wichtigste Prinzip

Aus Schreibe Dein Programm!:

"Programmierung mittels Konstruktionsanleitungen kommt dem disziplinierten ingenieursmĂ€ĂŸigen Bauen nĂ€her als alles andere."

Du hast gelernt, Programme systematisch zu konstruieren – nicht nur zu "hacken". Das ist eine FĂ€higkeit, die dir bei jeder Programmiersprache helfen wird!

🚀 Wie geht es weiter?

💡 NĂ€chste Schritte

  1. Erweitere das Snake-Spiel: Futter fressen, Punkte zÀhlen, Hindernisse
  2. Baue andere Spiele: Pong, Breakout, Tetris
  3. Lies weiter: Schreibe Dein Programm! geht viel tiefer
  4. Lerne andere Sprachen: Python, JavaScript – die Konzepte bleiben gleich!

🎉 Herzlichen GlĂŒckwunsch! 🎉

Du bist jetzt ein Racket-Programmierer!

Denk dran: Jeder Experte war einmal ein AnfÀnger.

Programmieren lernt man durch Üben – also weitermachen! 🐍