Python中的龙曲线
我写了一个程序,用海龟图形来画一个龙曲线,但是我画出来的结果和链接里的图片看起来不太一样:
我发现一个问题,就是我想把生成的字符串保存到一个叫做newWord的变量里,但我不能把newWord当作参数传给我的drawit函数,这个函数是用来根据字符串画线的。当我尝试这样做时,出现了一个错误:“全局变量newWord未定义。”所以在我的代码里,我只是把newWord的输出复制过来画,而没有真正传递我想传递的变量。
我不确定问题出在我的createWord函数上,还是说我在drawit函数里“画得不够”。
import turtle
def createWord(max_it, axiom, proc_rules):
word = axiom
t = 1
while (t < max_it):
word = rewrite(word, proc_rules)
t=t+1
newWord = word
def rewrite(word, proc_rules):
wordList = list(word)
for i in range(len(wordList)):
curChar = wordList[i]
if curChar in proc_rules:
wordList[i] = proc_rules[curChar]
return "".join(wordList)
def drawit(newWord, d, angle):
newWordLs = list(newWord)
for i in range(len(newWordLs)):
cur_Char = newWordLs[i]
if cur_Char == 'F':
turtle.forward(d)
elif cur_Char == '+':
turtle.right(angle)
elif cur_Char == '-':
turtle.left(angle)
else:
i = i+1
#sample test of dragon curve
def main():
createWord(10, 'FX', {'X':'X+YF','Y':'FX-Y'})
drawit('FX+YF+FX-YF+FX+YF-FX-YF+FX+YF+FX-YF-FX+YF-FX-YF', 20, 90)
if __name__=='__main__': main()
1 个回答
4
newWord 这个变量只在 createWord() 这个函数里面有效,所以当 createWord() 执行完后,newWord 就不见了。
可以考虑把 newWord 放在全局范围内,这样你就可以在 createWord 函数里修改它。更好的办法是让 createWord() 返回一个值,然后把 newWord 设置为这个值。
我觉得打印 "word" 然后把它当作参数传给 drawit,应该和用一个变量是一样的。
确实是一样的,但如果你想改变龙曲线的长度,你每次都得复制粘贴这个字符串,而不是简单地改变 max_it
的值。
编辑:我用了一些很酷的递归来解决这个问题 (=
import turtle
def dragon_build(turtle_string, n):
""" Recursively builds a draw string. """
""" defining f, +, -, as additional rules that don't do anything """
rules = {'x':'x+yf', 'y':'fx-y','f':'f', '-':'-', '+':'+'}
turtle_string = ''.join([rules[x] for x in turtle_string])
if n > 1: return dragon_build(turtle_string, n-1)
else: return turtle_string
def dragon_draw(size):
""" Draws a Dragon Curve of length 'size'. """
turtle_string = dragon_build('fx', size)
for x in turtle_string:
if x == 'f': turtle.forward(20)
elif x == '+': turtle.right(90)
elif x == '-': turtle.left(90)
def main():
n = input("Size of Dragon Curve (int): ")
dragon_draw(n)
if __name__ == '__main__': main()