Differences
This shows you the differences between two versions of the page.
| lehrkraefte:sbt:catchmeifyoucan [2024/01/19 12:22] – created Karlheinz Schubert | lehrkraefte:sbt:catchmeifyoucan [2024/01/19 12:24] (current) – Karlheinz Schubert | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Turle basiertes Spiel ====== | ||
| + | ===== Catch me if you can ==== | ||
| + | [[https:// | ||
| + | <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, | ||
| + | Spielfeld.tracer(n=1, | ||
| + | Spielfeld.title(" | ||
| + | |||
| + | Schrift12 = (" | ||
| + | Schrift18 = (" | ||
| + | |||
| + | Ausreisser = turtle.Turtle() | ||
| + | Ausreisser.color(" | ||
| + | Ausreisser.shape(" | ||
| + | Ausreisser.penup() | ||
| + | |||
| + | Faenger = turtle.Turtle() | ||
| + | Faenger.color(" | ||
| + | Faenger.shape(" | ||
| + | Faenger.penup() | ||
| + | |||
| + | Stift1 = turtle.Turtle() | ||
| + | Stift1.color(" | ||
| + | Stift1.shape(" | ||
| + | Stift1.hideturtle() | ||
| + | Stift1.penup() | ||
| + | |||
| + | Stift2 = turtle.Turtle() | ||
| + | Stift2.color(" | ||
| + | Stift2.shape(" | ||
| + | Stift2.hideturtle() | ||
| + | Stift2.penup() | ||
| + | |||
| + | Stift3 = turtle.Turtle() | ||
| + | Stift3.color(" | ||
| + | Stift3.shape(" | ||
| + | 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, | ||
| + | Faenger.setheading(20) | ||
| + | Faenger.shapesize(1, | ||
| + | Faenger.down() if zeichne_Spur else Faenger.up() | ||
| + | Ausreisser.clear() | ||
| + | Ausreisser.penup() | ||
| + | Ausreisser.setposition(250, | ||
| + | Ausreisser.setheading(200) | ||
| + | Ausreisser.shapesize(0.5, | ||
| + | Ausreisser.down() if zeichne_Spur else Ausreisser.up() | ||
| + | Stift3.clear() | ||
| + | |||
| + | |||
| + | def teste_Spielfeldgrenzen(Testobjekt, | ||
| + | x, y = Testobjekt.position() | ||
| + | print(f" | ||
| + | gesprungen = springe_wenn_ausserhalb(Testobjekt) | ||
| + | x, y = Testobjekt.position() | ||
| + | print(f" | ||
| + | |||
| + | |||
| + | 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, | ||
| + | inHandler = False | ||
| + | |||
| + | |||
| + | def linksAusreisser(): | ||
| + | global inHandler, DrehungAusreisser | ||
| + | if inHandler: | ||
| + | return | ||
| + | inHandler = True | ||
| + | Ausreisser.left(DrehungAusreisser) | ||
| + | # if DrehungAusreisser < 170: | ||
| + | # | ||
| + | Ausreisser.forward(SprungweiteAusreisser / 2) | ||
| + | teste_Spielfeldgrenzen(Ausreisser, | ||
| + | inHandler = False | ||
| + | |||
| + | |||
| + | def rechtsAusreisser(): | ||
| + | global inHandler, DrehungAusreisser | ||
| + | if inHandler: | ||
| + | return | ||
| + | inHandler = True | ||
| + | Ausreisser.right(DrehungAusreisser) | ||
| + | # if DrehungAusreisser > 6: | ||
| + | # | ||
| + | Ausreisser.forward(SprungweiteAusreisser / 2) | ||
| + | teste_Spielfeldgrenzen(Ausreisser, | ||
| + | inHandler = False | ||
| + | |||
| + | |||
| + | def runterAusreisser(): | ||
| + | global inHandler | ||
| + | if inHandler: | ||
| + | return | ||
| + | inHandler = True | ||
| + | Ausreisser.forward(-SprungweiteAusreisser / 2) | ||
| + | teste_Spielfeldgrenzen(Ausreisser, | ||
| + | inHandler = False | ||
| + | |||
| + | |||
| + | def hochFaenger(): | ||
| + | global inHandler | ||
| + | if EinspielerMode or inHandler: | ||
| + | return | ||
| + | inHandler = True | ||
| + | Faenger.forward(SchrittweiteFaenger) | ||
| + | teste_Spielfeldgrenzen(Faenger, | ||
| + | inHandler = False | ||
| + | |||
| + | |||
| + | def linksFaenger(): | ||
| + | global inHandler, DrehungFaenger | ||
| + | if EinspielerMode or inHandler: | ||
| + | return | ||
| + | inHandler = True | ||
| + | Faenger.left(DrehungFaenger) | ||
| + | # if DrehungFaenger < 170: | ||
| + | # | ||
| + | Faenger.forward(SchrittweiteFaenger) | ||
| + | teste_Spielfeldgrenzen(Faenger, | ||
| + | inHandler = False | ||
| + | |||
| + | |||
| + | def rechtsFaenger(): | ||
| + | global inHandler, DrehungFaenger | ||
| + | if EinspielerMode or inHandler: | ||
| + | return | ||
| + | inHandler = True | ||
| + | Faenger.right(DrehungFaenger) | ||
| + | # if DrehungFaenger > 6: | ||
| + | # | ||
| + | Faenger.forward(SchrittweiteFaenger) | ||
| + | teste_Spielfeldgrenzen(Faenger, | ||
| + | inHandler = False | ||
| + | |||
| + | |||
| + | def runterFaenger(): | ||
| + | global inHandler | ||
| + | if EinspielerMode or inHandler: | ||
| + | return | ||
| + | inHandler = True | ||
| + | Faenger.forward(-SchrittweiteFaenger) | ||
| + | teste_Spielfeldgrenzen(Faenger, | ||
| + | inHandler = False | ||
| + | |||
| + | |||
| + | def schreibe_Status(Reset=True): | ||
| + | Stift2.clear() if Reset else None | ||
| + | Stift2.goto(200, | ||
| + | Stift2.write(f" | ||
| + | Stift2.goto(250, | ||
| + | score = (Endzeit - Startzeit) * 10 | ||
| + | Stift2.write(f" | ||
| + | |||
| + | |||
| + | def StartMenu(): | ||
| + | Stift1.goto(RandLinks, | ||
| + | Stift1.write(" | ||
| + | Stift1.goto(RandLinks, | ||
| + | Stift1.write(" | ||
| + | Stift1.goto(RandLinks, | ||
| + | Stift1.write(" | ||
| + | Stift1.goto(RandLinks, | ||
| + | Stift1.write("< | ||
| + | schreibe_Status(False) | ||
| + | |||
| + | |||
| + | def Menu(): | ||
| + | Stift3.goto(0, | ||
| + | Stift3.write(" | ||
| + | score = (Endzeit - Startzeit) * 10 | ||
| + | Stift3.write(f" | ||
| + | Stift3.goto(0, | ||
| + | Stift3.write("< | ||
| + | Stift3.write("< | ||
| + | |||
| + | |||
| + | def teste_Kollision(a, | ||
| + | global Endzeit | ||
| + | if a.distance(b) <= Kollisionsschwelle: | ||
| + | Endzeit = time.time() | ||
| + | print(" | ||
| + | return True | ||
| + | return False | ||
| + | |||
| + | |||
| + | def follow_runner(): | ||
| + | global Endzeit | ||
| + | if EinspielerMode: | ||
| + | Faenger.setheading(Faenger.towards(Ausreisser)) | ||
| + | Faenger.forward(min(Faenger.distance(Ausreisser), | ||
| + | |||
| + | Endzeit = time.time() | ||
| + | schreibe_Status() | ||
| + | |||
| + | if teste_Kollision(Faenger, | ||
| + | Menu() | ||
| + | else: | ||
| + | Spielfeld.ontimer(follow_runner, | ||
| + | |||
| + | |||
| + | def toogle_Spieler_Mode(): | ||
| + | global EinspielerMode, | ||
| + | EinspielerMode = not EinspielerMode | ||
| + | Kollisionsschwelle = 40 if EinspielerMode else 20 | ||
| + | Ausreisser.shapesize(0.5, | ||
| + | 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, | ||
| + | Spielfeld.tracer(n=1, | ||
| + | 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, | ||
| + | Spielfeld.onkeyrelease(toggle_Spielfeldgroesse, | ||
| + | Spielfeld.onkeyrelease(toggle_Spur, | ||
| + | |||
| + | Spielfeld.onkeypress(hochAusreisser, | ||
| + | Spielfeld.onkeypress(linksAusreisser, | ||
| + | Spielfeld.onkeypress(rechtsAusreisser, | ||
| + | Spielfeld.onkeypress(runterAusreisser, | ||
| + | |||
| + | Spielfeld.onkeyrelease(hochFaenger, | ||
| + | Spielfeld.onkeyrelease(linksFaenger, | ||
| + | Spielfeld.onkeyrelease(rechtsFaenger, | ||
| + | Spielfeld.onkeyrelease(runterFaenger, | ||
| + | |||
| + | Spielfeld.onkey(Spielfeld.bye, | ||
| + | Spielfeld.onkey(start, | ||
| + | |||
| + | init() | ||
| + | StartMenu() | ||
| + | |||
| + | Spielfeld.mainloop() | ||
| + | |||
| + | </ | ||