labyrinth

ARBEITSBLATT 2: LABYRINTH

 

 

EINLEITUNG

 

Du wirst hier ein kleines Spiel selbst programmieren. Dabei wird die Turtle in ein "Labyrinth" gesetzt, in dem sie ihren Weg zum Ziel suchen muss. Dabei unterstützt du die Turtle, indem du ihren Weg mit schwarzen Feldern blockierst, so dass sie sich abdreht (ein schwarzes Feld erzeugst du über einen Mausklick).
 
 

EINSTIEG

 

Wir geben dir hier erst einmal nur die Grundstruktur für das Spiel an. Die Turtle bewegt sich auf einer Art von "Schachbrett". Mit Klicken kannst du ein Feld schwarz färben.

Bei einem grösseren Programm ist es wichtig, dass du mit Kommentaren erklärst, was die einzelnen Teile machen. Kommentare beginnen jeweils mit #. Python ignoriert alle solchen Kommentare, sie dienen nur dem Leser zum besseren Verständnis.

Nachdem wir zuerst alle Befehl definiert haben, beginnt das Hauptprogramm erst danach. Das machen wir deutlich mit einem Kommentar

### ------------- MAIN --------------- ###

(eine Kurzform für main program, also Hauptprogramm). Auch das hat für Python keine Bedeutung, hilft uns aber, die Übersicht zu behalten.

# labyrinth.py

from gturtle import *

CELLSIZE = 40 #Wähle zwischen: 10, 20, 40, 50

# Zeichnet das Grundgitter:
def drawGrid():
    global CELLSIZE
    hideTurtle()
    setPenColor("gray")
    x = -400
    repeat (800 // CELLSIZE) + 1:
        setPos(x, -300)
        moveTo(x, +300)
        x += CELLSIZE
    y = -300
    repeat (600 // CELLSIZE) + 1:
        setPos(-400, y)
        moveTo(+400, y)
        y += CELLSIZE
    setPos(0, 0)
    showTurtle()    

@onMouseHit 
def onClick(x, y):
    turtle_x = getX()
    turtle_y = getY()
    # Zelle schwarz färben
    hideTurtle()
    setPos(x, y)
    if getPixelColorStr() == "white":
        setFillColor("black")
        fill(x, y)
    # Die Turtle wieder dahin zurücksetzen,
    # wo sie am Anfang war.
    setPos(turtle_x, turtle_y)
    showTurtle()

def doStep():
    hideTurtle()
    # Einen Schritt nach vorne machen.
    forward(CELLSIZE)
    # Falls die Turtle auf einem schwarzen Feld landet,
    # setzen wir sie wieder zurück und drehen sie dafür.
    if getPixelColorStr() == "black":
        back(CELLSIZE)
        right(90)
    showTurtle()

### ----------------------- MAIN --------------------------- ###
makeTurtle()
drawGrid()

# Die Turtle auf ein Anfangsfeld setzen:
setPos(-400 + 5 * CELLSIZE // 2, -300 + 5 * CELLSIZE // 2)
penUp()

repeat 1000:
    doStep()
    delay(500)
► In Zwischenablage kopieren

Bevor wir die Turtle an eine bestimmte Stelle bewegen, machen wir sie mit hideTurtle() unsichtbar und zeigen sie danach wieder mit showTurtle(). Das hat zwei Gründe: Zum einen wäre es z. B. merkwürdig, wenn die Turtle bei einem Mausklick kurz zum Mauscursor springt und danach wieder zurückgeht. Zum anderen wäre das Programm zu langsam, wenn die Turtle bei all ihren Bewegungen sichtbar wäre.

 

 

AUFGABENSTELLUNG

 
1.

Ergänze das Programm so, dass du mit der Maus schwarze Felder auch wieder wegklicken kannst. Wenn du also auf ein schwarzes Feld klickst, dann wird es wieder weiss.

2.

Ergänze das Programm zu einem Spiel, indem du ein Feld rot einfärbst. Wenn die Turtle dieses rote Feld erreicht hat, ist das Spiel fertig und man hat «gewonnen». Im Modul sys gibt es übrigens einen Befehl exit(), um das Programm sofort zu beenden:

from sys import exit
exit() # Programm beenden


3.

Im Moment kann es passieren, dass die Turtle aus dem Bild herausfällt. Ergänze das Programm also so, dass du alle Felder am Rand zuerst schwarz färbst.

4.

Das Spiel wird erst dann interessant, wenn du gewisse Hindernisse oder Punkte einbaust. Du könntest z. B. die Anzahl der schwarzen Blöcke zählen, die man braucht, um das Spiel zu lösen. Je weniger Blöcke, umso höher die Punktzahl. Oder du zählst die Schritte, die die Turtle braucht. Überlege dir selber, wie du die Punktzahl berechnen möchtest und gib am Ende diese Punktzahl mit msgDlg aus!

5*.

Baue ein Level, in dem du bereits gewisse Wände vorgibst, die der Turtle im Weg stehen. Damit wird das Spiel etwas schwieriger.

6*. Neben den schwarzen Blöcken könntest du noch graue Blöcke einführen, die der Turtle ebenfalls im Weg stehen. Im Unterschied zu den schwarzen Blöcken lassen sich die grauen Blöcke aber nicht mehr entfernen.

7*. Die Turtle könnte beim Gehen eine gelbe Spur hinterlassen und sich so weigern, ein zweites Mal auf ein Feld zu gehen.

8*.

Mach das Spiel schwieriger, indem sich die Turtle zufällig nach links oder rechts abdreht. Du kannst die Turtle auch schneller machen, indem du den Wert in delay() veränderst. Sie sollte aber nicht zu schnell sein, weil sonst das Erzeugen und Entfernen der Blocks nicht mehr richtig funktioniert.

9*. (Für Profis) Programmiere das Spielfeld so, dass wenn die Turtle rechts hinausläuft, sie von links wieder hineinkommt. Natürlich funktioniert das dann auch in die entgegengesetzte Richtung und genauso für oben/unten.