Python 使用turtle图形恢复l系统代码中的记录状态

Python 使用turtle图形恢复l系统代码中的记录状态,python,turtle-graphics,l-systems,Python,Turtle Graphics,L Systems,我正在使用海龟图形复制l系统(TurtleWorld库)。我尝试应用的规则在不涉及返回到以前保存的状态时效果很好,但每当出现[和](见下面的规则)时,情况就会发生变化,海龟就会随机抽取B 基本上,我认为检查']'出现位置的IF语句就是代码中断的地方。(另外,我知道它目前还没有优化,为了清晰起见,我已经写了一个可靠的IF…) 编辑:新代码-这整个计算角度的事情是没有必要的,因为我们已经得到了_heading(),它告诉我们我们的角度方向 import turtle turtle.down()

我正在使用海龟图形复制l系统(TurtleWorld库)。我尝试应用的规则在不涉及返回到以前保存的状态时效果很好,但每当出现[和](见下面的规则)时,情况就会发生变化,海龟就会随机抽取B

基本上,我认为检查']'出现位置的IF语句就是代码中断的地方。(另外,我知道它目前还没有优化,为了清晰起见,我已经写了一个可靠的IF…)

编辑:新代码-这整个计算角度的事情是没有必要的,因为我们已经得到了_heading(),它告诉我们我们的角度方向

import turtle

turtle.down()

n = 'F'

s1 = 'F'
s2 = 'FF-[-F+F+F]+[+F-F-F]'
#s3 = 'F'
#s4 = 'FF'

steps = 5

for i in range(steps):
    n = n.replace(s1,s2)
    #n = n.replace(s3,s4)

a = 25

x = []
y = []
angle = []

for i in n:
    if i == 'F':
        turtle.forward(2)
    if i == '+':
        turtle.left(a)
    if i == '-':
        turtle.right(a)
    if i=='[':
        x.append(turtle.xcor())
        y.append(turtle.ycor())
        angle.append(turtle.heading())
    if i==']':
        turtle.pu()
        turtle.setpos(x[len(x)-1],y[len(y)-1])
        turtle.right(turtle.heading())
        turtle.setheading(angle[len(angle)-1])
        x.pop()
        y.pop()
        angle.pop()
        turtle.pd()
有几个想法:

  • 您从未在
    ]
    -处理程序中将
    角度设置为新角度(
    newa
  • 根据注释,您的条件是错误的,
    newa>0
    将在角度为正时向左旋转
  • 你确定
    rt
    能很好地处理负角度吗
  • 如果改用
    pop
    并推送一个元组或类似的状态,则可以大大简化代码
  • -1
    的索引等于
    len(lst)-1
pop
-建议示例:

>>> state = []
>>> angle = 90
>>> posx = 10
>>> posy = 15
>>> state.append((angle, posx, posy))
>>> angle = 40
>>> angle, posx, posy = state.pop()
>>> angle
90

嘿,谢谢你的提示。1) 我没有将角度设置为newa,因为我只是用“newa”来改变差异,因为当我点击+和-…不确定这个逻辑是否合理时,我总是以相同的角度来改变。我将其添加到代码中,没有任何更改。2) 改变了条件,真的!3) 是的,很好,省了几行……不幸的是,结果是一样的。一件非常奇怪的事情:我得到的是4面表单,而不是6面表单(60度应该是6面…),所以这里肯定有问题…用新的解决方案更新了代码…我把事情弄得比他们需要的复杂得多-get_heading()就是我要找的!可以省略len(*),因为x[-1]与x[len(x)-1]相同