import turtle as t
import random
import time

#Hintergrund
fenster = t.Screen()
fenster.bgcolor("sienna1")
fenster.title("Raupespiel")
fenster.setup(width=600, height=600)

t.tracer(0)

#Raupenkoerper
raupe = t.Turtle()
raupe.shape("square")
raupe.color("DarkRed")
raupe.speed(0)
raupe.penup()
raupe.hideturtle()
raupe.richtung = "stop"

#Blattkoerper
blatt = t.Turtle()
blatt_koerper = ((0,0), (14,2), (18, 6), (20,20), (6,18), (2,14))
t.register_shape("blatt", blatt_koerper)
blatt.shape("blatt")
blatt.color("ForestGreen")
blatt.speed(0)
blatt.penup()
blatt.hideturtle()

#Texte
spiel_startet = False
text_turtle = t.Turtle()
text_turtle.color("maroon")
text_turtle.write("Drücke Leertaste", align="center", font=("Arial", 16, "bold"))
text_turtle.hideturtle()

#Punkte
punkte_turtle = t.Turtle()
segmente = []
punkte_turtle.speed(0)
punkte_turtle.hideturtle()


def ausserhalb_fenster():
    linke_wand = -t.window_width() / 2
    rechte_wand = t.window_width() / 2
    oben_wand = t.window_height() / 2
    unten_wand = -t.window_height() / 2

    (x,y) = raupe.pos()

    ausserhalb = x < linke_wand or x > rechte_wand or y < unten_wand or y > oben_wand
    return ausserhalb


def spiel_ende():
    raupe.color("sienna1")
    blatt.color("sienna1")
    t.hideturtle()
    t.color("blue")
    t.write("GAME OVER!", align="center", font=("Arial", 30, "bold"))
    #verstecken des Raupenkoerpers
    for segment in segmente:
        segment.hideturtle()

    #leeren der Segment-Liste
    segmente.clear()
    


def anzeige_punkte(aktuelle_punkte):
    punkte_turtle.clear()
    punkte_turtle.penup()
    x = (t.window_width() / 2) - 50
    y = (t.window_height() / 2) - 50
    punkte_turtle.setpos(x, y)
    punkte_turtle.color("blue")
    punkte_turtle.write(str(aktuelle_punkte), align="right", font=("Arial", 40, "bold"))


def platziere_blatt():
    #blatt.ht ist kurz für blatt.hideturtle()
    blatt.ht()

    #blatt.setpos(random.randint(-200, 200), random.randint(-200, 200))
    #oder
    blatt.setx(random.randint(-200, 200))
    blatt.sety(random.randint(-200, 200))

    #blatt.st ist kurz für blatt.showturtle()
    blatt.st()


def starte_spiel():
    global spiel_startet
    
    if spiel_startet == True:
        return
    else:
        spiel_startet = True

    punkte = 0
    text_turtle.clear()

    verzoegerung = 0.3

    raupe.showturtle()

    anzeige_punkte(punkte)
    platziere_blatt()

    while True:
        fenster.update()

        #Raupe frisst Blatt
        if raupe.distance(blatt) < 20:
            platziere_blatt()
            
            #hinzufuegen eines Segmentes
            neu_segment = t.Turtle()
            neu_segment.speed(0)
            neu_segment.shape("square")
            neu_segment.color("grey")
            neu_segment.penup()
            segmente.append(neu_segment)

            #Verzoegurn verringern
            verzoegerung = verzoegerung - 0.002
            
            punkte = punkte + 10
            anzeige_punkte(punkte)

        if ausserhalb_fenster():
            spiel_ende()

        #Bewegen des Raupenkoerpers in umgekehrter Reihenfolge
        for index in range(len(segmente)-1, 0, -1):
            x = segmente[index-1].xcor()
            y = segmente[index-1].ycor()
            segmente[index].goto(x, y)

        #Bewege Segment 0 an die Position des Raupenkopfes
        if len(segmente) > 0:
            x = raupe.xcor()
            y = raupe.ycor()
            segmente[0].goto(x,y)

        bewegen()

        #gehe jedes Segment des Raupenkörpers durch un prüfe,
        #ob das Segment vom Raupenkörper von Raupenkopf berührt wird
        for segment in segmente:
            if segment.distance(raupe) < 20:
                spiel_ende()

        time.sleep(verzoegerung)

def bewegen():
    if raupe.richtung == "hoch":
        y = raupe.ycor()
        raupe.sety(y + 20)

    if raupe.richtung == "runter":
        y = raupe.ycor()
        raupe.sety(y - 20)

    if raupe.richtung == "links":
        x = raupe.xcor()
        raupe.setx(x - 20)

    if raupe.richtung == "rechts":
        x = raupe.xcor()
        raupe.setx(x + 20)


def bewege_hoch():
    if raupe.heading() == 0 or raupe.heading() == 180:
        raupe.setheading(90)
        raupe.richtung = "hoch"


def bewege_runter():
    if raupe.heading() == 0 or raupe.heading() == 180:
        raupe.setheading(270)
        raupe.richtung = "runter"


def bewege_links():
    if raupe.heading() == 90 or raupe.heading() == 270:
        raupe.setheading(180)
        raupe.richtung = "links"


def bewege_rechts():
    if raupe.heading() == 90 or raupe.heading() == 270:
        raupe.setheading(0)
        raupe.richtung = "rechts"


t.onkey(starte_spiel, "space")
t.onkey(bewege_hoch, "Up")
t.onkey(bewege_runter, "Down")
t.onkey(bewege_links, "Left")
t.onkey(bewege_rechts, "Right")
t.listen()
t.mainloop()

Zuletzt geändert: Donnerstag, 16. Februar 2023, 16:05