Как заставить черепаху помнить свое положение в L-системах?
Мы только начали программировать в универе. Одна из наших задач - создать фрактальное дерево с L-системой с черепахой на питоне. Вот этот:
1. variables : X F
2. constants : + − [ ]
3. start : X
4. rules : (X → F-[[X]+X]+F[+FX]-X), (F → FF)
5. angle : 25°
Код:
def fraktal_plante(padde, depth):
Xmerke(padde, depth-1) # X
def Xmerke(padde, depth):
if depth > 0:# X ->
padde.forward(10) # F
padde.right(25) # -
padde.setposition()
padde.setheading() # [
padde.setheading() # [
Xmerke(padde, depth-1) # X
padde.heading()
padde.goto() # ]
padde.left(25) # +
Xmerke(padde, depth-1) # X
padde.heading() # ]
padde.left(25) # +
padde.forward(10) # F
padde.setposition()
padde.setheading() # [
padde.left(25) # +
padde.forward(10) # F
Xmerke(padde, depth-1) # X
padde.heading()
padde.goto() # ]
padde.right(25) # -
Xmerke(padde, depth-1) # X
def Fmerke (padde, depth):
if depth > 0: # Y ->
padde.forward(10) # F
padde.forward(10) # F
Как вы можете видеть, это грязно. Мне интересно, как заставить черепаху вспомнить свое положение и направить ее " [ ", чтобы потом вернуться к ней " ] ".
Я действительно новичок в этом, поэтому, пожалуйста, ответьте в ясной и простой для понимания форме.
1 ответ
Вы можете получить текущий курс черепахи, позвонив turtle.heading()
, Кроме того, его текущая позиция возвращается turtle.position()
, Поэтому вы можете использовать их, чтобы сохранить текущее состояние, а затем использовать эти значения для его восстановления. Вот тривиальный пример, иллюстрирующий использование их для того, что вы хотите:
from __future__ import print_function
def get_turtle_state(turtle):
""" Return turtle's current heading and position. """
return turtle.heading(), turtle.position()
def restore_turtle_state(turtle, state):
""" Set the turtle's heading and position to the given values. """
turtle.setheading(state[0])
turtle.setposition(state[1][0], state[1][1])
if __name__ == '__main__':
import turtle
tortoise = turtle.Turtle()
saved_state = get_turtle_state(tortoise)
print('saved state:', saved_state) # -> (0.0, (0.00,0.00))
tortoise.forward(100)
tortoise.left(90)
print('changed state:', get_turtle_state(tortoise)) # -> (90.0, (100.00,0.00))
restore_turtle_state(tortoise, saved_state)
print('restored state:', get_turtle_state(tortoise)) # -> (0.0, (0.00,0.00))
turtle.getscreen().ontimer(turtle.bye, 2000) # End script after a delay.
turtle.mainloop()