====== Turle basiertes Spiel ====== ===== Catch me if you can ==== [[https://de.wikipedia.org/wiki/Catch_Me_If_You_Can_%282002%29|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(" 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(" - Nochmal spielen\n\n", font=Schrift12) Stift3.write(" - 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()