lehrkraefte:sbt:catchmeifyoucan

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

lehrkraefte:sbt:catchmeifyoucan [2024/01/19 12:22] – created Karlheinz Schubertlehrkraefte:sbt:catchmeifyoucan [2024/01/19 12:24] (current) Karlheinz Schubert
Line 1: Line 1:
 +====== Turle basiertes Spiel ======
 +===== Catch me if you can ====
 +[[https://de.wikipedia.org/wiki/Catch_Me_If_You_Can_%282002%29|Wikipedia Filmeintrag dazu]]
  
 +<code python>
 +"""
 +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("    - Toggle ein oder zwei Spieler", font=Schrift12)
 +    Stift1.goto(RandLinks, RandOben - 16)
 +    Stift1.write("    - Toggle Groesse Spielfeld", font=Schrift12)
 +    Stift1.goto(RandLinks, RandOben - 36)
 +    Stift1.write("    - 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()
 +
 +</code>