import turtle
turtle.tracer(1, 0)

def createLSystem(numIters,axiom):
    startString = axiom
    endString = ""
    for i in range(numIters):
        endString = processString(startString)
        startString = endString

    return endString

def processString(oldStr):
    newstr = ""
    for ch in oldStr:
        newstr = newstr + applyRules(ch)

    return newstr

def applyRules(ch):  #ПРАВИЛА ИТЕРАЦИИ
    newstr = ""
    if ch == 'F':
        newstr = '-F+F+[+F-F-]-[-F+F+F]'   # Rule 1
    elif ch == 'X':
        newstr = 'X+YF+'  # Rule 2
    elif ch =='Y':
        newstr='-FX-Y'
    else:
        newstr = ch    # no rules apply so keep the character

    return newstr

stack=[] #СПИСОК КООРДИНАТ ЧЕРЕПУХИ

def drawLsystem(aTurtle, instructions, angle, distance):  #ЧТЕНИЕ ПРАВИЛ ЧЕРЕПАХОЙ
    for cmd in instructions:
        if cmd == 'F':
            aTurtle.forward(distance)
        elif cmd == 'B':
            aTurtle.backward(distance)
        elif cmd == '+':
            aTurtle.right(angle)
        elif cmd == '-':
            aTurtle.left(angle)
        elif cmd == '[':                 #НЕ РОБИТ МРАЗЬ
            stack.append(turtle.xcor())
            stack.append(turtle.ycor())
            stack.append(turtle.heading())
        elif cmd == ']':
            x=float(stack.pop(-3))
            y=float(stack.pop(-2))
            a = float(stack.pop(-1))
            turtle.setx(x)
            turtle.sety(y)
            turtle.setheading(a)

def main():
    inst = createLSystem(7, "F")   # create the string
    print(inst)
    t = turtle.Turtle()            # create the turtle
    wn = turtle.Screen()

    t.up()
    t.back(200)
    t.down()
    t.speed(0)
    drawLsystem(t, inst, 22, 3)   # draw the picture
                                  # angle 60, segment length 5
    wn.exitonclick()

main()
