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()