from turtle import *


def etat_suivant(etat_courant, regle):
    """Renvoie une chaîne de caractères correspondant à
    l'application de regle sur etat_courant.
    """
    etat_final = ''
    for car in etat_courant:
        if car == 'F':
            etat_final = etat_final + regle
        else:
            etat_final = etat_final + car
    return etat_final


def etat_evolution(etat_initial, n, regle):
    """Renvoie une chaîne de caractères correspondant à l'état
    final obtenu après n applications successives de regle à
    etat_initial.
    """
    final = etat_initial
    for k in range(n):
        final = etat_suivant(final, regle)
    return final


def trace(motif, pas, angle):
    """Tracé de la plante. Cette fonction ne renvoie rien."""
    etat_tortue = []

    for car in motif:
        if car == '[':
            etat_tortue.append((xcor(), ycor(), heading()))
        elif car == ']':
            up()
            x, y, head = etat_tortue.pop()
            goto(x, y)
            seth(head)
            down()
        elif car == 'F':
            forward(pas)
        elif car == 'D':
            right(angle)
        elif car == 'G':
            left(angle)  


if __name__ == '__main__':
    # Initialisation de la tortue
    setheading(90) # Orientation, peut être nécessaire de la changer
    speed(0)
    up()
    goto(0, -250) # position initiale, peut être nécessaire de la changer
    down()

    # Première Plante (voir doc "jeu de tests")
    etat_initial = "F"
    regle = "FFG[GFDFDF]D[DFGFGF]"
    n = 3
    pas = 10
    angle = 22.5
    motif = etat_evolution(etat_initial, n, regle)

    trace(motif, pas, angle)
    mainloop()
