lehrkraefte:sbt:catchmeifyoucan

Turle basiertes Spiel

Wikipedia Filmeintrag dazu

"""
Catch me if you can game.
ksc, 2023
"""
import turtle
import time
 
Hoehe = 800
Weite = 800
 
RandLinks = -Weite / 2 + 20
RandOben = Hoehe / 2 - 40
 
Spielfeld = turtle.Screen()
Spielfeld.setup(width=Weite, height=Hoehe, startx=1400, starty=0)
Spielfeld.tracer(n=1, delay=0)
Spielfeld.title("Catch Me If You Can!")
 
Schrift12 = ("Arial", 12, "normal")
Schrift18 = ("Arial", 18, "bold")
 
Ausreisser = turtle.Turtle()
Ausreisser.color("brown")
Ausreisser.shape("triangle")
Ausreisser.penup()
 
Faenger = turtle.Turtle()
Faenger.color("red")
Faenger.shape("triangle")
Faenger.penup()
 
Stift1 = turtle.Turtle()
Stift1.color("black")
Stift1.shape("circle")
Stift1.hideturtle()
Stift1.penup()
 
Stift2 = turtle.Turtle()
Stift2.color("blue")
Stift2.shape("circle")
Stift2.hideturtle()
Stift2.penup()
 
Stift3 = turtle.Turtle()
Stift3.color("red")
Stift3.shape("circle")
Stift3.hideturtle()
Stift3.penup()
 
SprungweiteAusreisser = 45
DrehungAusreisser = 25
SchrittweiteFaenger = 40
DrehungFaenger = 35
 
GeschwindigkeitFaenger = 15
 
inHandler = False
 
Startzeit = Endzeit = time.time()
zeichne_Spur = False
EinspielerMode = True
Kollisionsschwelle = 40
 
 
def init():
    Faenger.clear()
    Faenger.penup()
    Faenger.setposition(-250, -250)
    Faenger.setheading(20)
    Faenger.shapesize(1, 2)
    Faenger.down() if zeichne_Spur else Faenger.up()
    Ausreisser.clear()
    Ausreisser.penup()
    Ausreisser.setposition(250, 250)
    Ausreisser.setheading(200)
    Ausreisser.shapesize(0.5, 1) if EinspielerMode else Ausreisser.shapesize(1, 2)
    Ausreisser.down() if zeichne_Spur else Ausreisser.up()
    Stift3.clear()
 
 
def teste_Spielfeldgrenzen(Testobjekt, Typ, Drehwinkel=0):
    x, y = Testobjekt.position()
    print(f"{Typ:10}: {x:5.0f},{y:5.0f}, ∡ {Drehwinkel}", end="")
    gesprungen = springe_wenn_ausserhalb(Testobjekt)
    x, y = Testobjekt.position()
    print(f" --> Sprung zu  {x:5.0f},{y:5.0f}") if gesprungen else print(".")
 
 
def springe_wenn_ausserhalb(Testobjekt):
    gesprungen = False
    if Testobjekt.xcor() > Weite / 2 - 10:
        Testobjekt.setx(-Weite / 2 + 10)
        gesprungen = True
    elif Testobjekt.xcor() < -Weite / 2 + 10:
        Testobjekt.setx(Weite / 2 - 10)
        gesprungen = True
    if Testobjekt.ycor() > Hoehe / 2 - 10:
        Testobjekt.sety(-Hoehe / 2 + 10)
        gesprungen = True
    elif Testobjekt.ycor() < -Hoehe / 2 + 10:
        Testobjekt.sety(Hoehe / 2 - 10)
        gesprungen = True
    return gesprungen
 
 
def hochAusreisser():
    global inHandler
    if inHandler:
        return
    inHandler = True
    Ausreisser.forward(SprungweiteAusreisser)
    teste_Spielfeldgrenzen(Ausreisser, "Ausreisser", DrehungAusreisser)
    inHandler = False
 
 
def linksAusreisser():
    global inHandler, DrehungAusreisser
    if inHandler:
        return
    inHandler = True
    Ausreisser.left(DrehungAusreisser)
    # if DrehungAusreisser < 170:
    #     DrehungAusreisser += 4
    Ausreisser.forward(SprungweiteAusreisser / 2)
    teste_Spielfeldgrenzen(Ausreisser, "Ausreisser", DrehungAusreisser)
    inHandler = False
 
 
def rechtsAusreisser():
    global inHandler, DrehungAusreisser
    if inHandler:
        return
    inHandler = True
    Ausreisser.right(DrehungAusreisser)
    # if DrehungAusreisser > 6:
    #     DrehungAusreisser -= 4
    Ausreisser.forward(SprungweiteAusreisser / 2)
    teste_Spielfeldgrenzen(Ausreisser, "Ausreisser", DrehungAusreisser)
    inHandler = False
 
 
def runterAusreisser():
    global inHandler
    if inHandler:
        return
    inHandler = True
    Ausreisser.forward(-SprungweiteAusreisser / 2)
    teste_Spielfeldgrenzen(Ausreisser, "Ausreisser", DrehungAusreisser)
    inHandler = False
 
 
def hochFaenger():
    global inHandler
    if EinspielerMode or inHandler:
        return
    inHandler = True
    Faenger.forward(SchrittweiteFaenger)
    teste_Spielfeldgrenzen(Faenger, "Faenger", DrehungFaenger)
    inHandler = False
 
 
def linksFaenger():
    global inHandler, DrehungFaenger
    if EinspielerMode or inHandler:
        return
    inHandler = True
    Faenger.left(DrehungFaenger)
    # if DrehungFaenger < 170:
    #     DrehungFaenger += 4
    Faenger.forward(SchrittweiteFaenger)
    teste_Spielfeldgrenzen(Faenger, "Faenger", DrehungFaenger)
    inHandler = False
 
 
def rechtsFaenger():
    global inHandler, DrehungFaenger
    if EinspielerMode or inHandler:
        return
    inHandler = True
    Faenger.right(DrehungFaenger)
    # if DrehungFaenger > 6:
    #     DrehungFaenger -= 4
    Faenger.forward(SchrittweiteFaenger)
    teste_Spielfeldgrenzen(Faenger, "Faenger", DrehungFaenger)
    inHandler = False
 
 
def runterFaenger():
    global inHandler
    if EinspielerMode or inHandler:
        return
    inHandler = True
    Faenger.forward(-SchrittweiteFaenger)
    teste_Spielfeldgrenzen(Faenger, "Faenger", DrehungFaenger)
    inHandler = False
 
 
def schreibe_Status(Reset=True):
    Stift2.clear() if Reset else None
    Stift2.goto(200, RandOben - 0)
    Stift2.write(f"{'E' if  EinspielerMode else 'Z'}", font=Schrift18)
    Stift2.goto(250, RandOben - 0)
    score = (Endzeit - Startzeit) * 10
    Stift2.write(f"{score:>6.0f}", font=Schrift18)
 
 
def StartMenu():
    Stift1.goto(RandLinks, RandOben + 6)
    Stift1.write("Z     - Toggle ein oder zwei Spieler", font=Schrift12)
    Stift1.goto(RandLinks, RandOben - 16)
    Stift1.write("G     - Toggle Groesse Spielfeld", font=Schrift12)
    Stift1.goto(RandLinks, RandOben - 36)
    Stift1.write("F     - Spur zeichnen", font=Schrift12)
    Stift1.goto(RandLinks, RandOben - 56)
    Stift1.write("<Space> to start the Game", font=Schrift12)
    schreibe_Status(False)
 
 
def Menu():
    Stift3.goto(0, 0)
    Stift3.write("Game Over\n", font=Schrift18)
    score = (Endzeit - Startzeit) * 10
    Stift3.write(f"Finished. New Score is {score:4.0f}!", font=Schrift18)
    Stift3.goto(0, -96)
    Stift3.write("<Space> - Nochmal spielen\n\n", font=Schrift12)
    Stift3.write("<ESC> - Ende\n", font=Schrift12)
 
 
def teste_Kollision(a, b):
    global Endzeit
    if a.distance(b) <= Kollisionsschwelle:
        Endzeit = time.time()
        print("Gefangen!")
        return True
    return False
 
 
def follow_runner():
    global Endzeit
    if EinspielerMode:
        Faenger.setheading(Faenger.towards(Ausreisser))
        Faenger.forward(min(Faenger.distance(Ausreisser), SchrittweiteFaenger))
 
    Endzeit = time.time()
    schreibe_Status()
 
    if teste_Kollision(Faenger, Ausreisser):
        Menu()
    else:
        Spielfeld.ontimer(follow_runner, int(10000 / GeschwindigkeitFaenger))
 
 
def toogle_Spieler_Mode():
    global EinspielerMode, Kollisionsschwelle
    EinspielerMode = not EinspielerMode
    Kollisionsschwelle = 40 if EinspielerMode else 20
    Ausreisser.shapesize(0.5, 1) if EinspielerMode else Ausreisser.shapesize(1, 2)
    schreibe_Status()
 
 
def toggle_Spielfeldgroesse():
    global Hoehe, Weite, RandLinks, RandOben
    Hoehe = 1200 if Hoehe == 800 else 800
    Weite = 1200 if Weite == 800 else 800
    RandLinks = -Weite / 2 + 20
    RandOben = Hoehe / 2 - 40
    Spielfeld.setup(width=Weite, height=Hoehe, startx=1400, starty=0)
    Spielfeld.tracer(n=1, delay=0)
    Stift1.clear()
    Stift2.clear()
    Stift3.clear()
    init()
    StartMenu()
 
 
def toggle_Spur():
    global zeichne_Spur
    zeichne_Spur = not zeichne_Spur
    Faenger.pendown() if zeichne_Spur else Faenger.penup()
    Ausreisser.pendown() if zeichne_Spur else Ausreisser.penup()
 
 
def start():
    global Startzeit, Endzeit
    init()
    Startzeit = Endzeit = time.time()
    follow_runner()
 
 
Spielfeld.listen()
Spielfeld.onkeyrelease(toogle_Spieler_Mode, "z")
Spielfeld.onkeyrelease(toggle_Spielfeldgroesse, "g")
Spielfeld.onkeyrelease(toggle_Spur, "f")
 
Spielfeld.onkeypress(hochAusreisser, "Up")
Spielfeld.onkeypress(linksAusreisser, "Left")
Spielfeld.onkeypress(rechtsAusreisser, "Right")
Spielfeld.onkeypress(runterAusreisser, "Down")
 
Spielfeld.onkeyrelease(hochFaenger, "w")
Spielfeld.onkeyrelease(linksFaenger, "a")
Spielfeld.onkeyrelease(rechtsFaenger, "d")
Spielfeld.onkeyrelease(runterFaenger, "s")
 
Spielfeld.onkey(Spielfeld.bye, "Escape")
Spielfeld.onkey(start, "space")
 
init()
StartMenu()
 
Spielfeld.mainloop()
  • lehrkraefte/sbt/catchmeifyoucan.txt
  • Last modified: 2024/01/19 13:24
  • by Karlheinz Schubert