2011-09-27 92 views
2

我創建了一個程序中使用龜圖形繪製dragon curve ..但我的結果並沒有真正看起來像圖片確實在鏈接:龍曲線在Python

enter image description here

一個問題,我注意到的是我想將生成的字符串保存到變量newWord ..但我不能在我的函數drawit中使用newWord作爲參數,它實際上是根據字符串繪製線條。當我嘗試這樣做時,出現錯誤「全局變量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() 

回答

4

newWord本地作用域createWord()的內部,所以createWord()完成後,newWord消失。

考慮在全局範圍內創建newWord,以便您可以使用createWord進行修改 - 或者更好,讓createWord()返回一個值,並將newWord設置爲該值。

我會認爲打印「單詞」,然後將它用作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() 
+1

謝謝,我明白你的意思..但就是爲什麼我的畫面是如此愁容滿面的唯一原因,我認爲印「字解「,然後將它用作drawit中的參數將導致與使用變量相同的結果 – mdegges

+0

@Michele'我不確定問題出在我的createWord函數上,還是我只是在drawit中沒有」充分繪製「 。這幾乎肯定是問題 - 你的龍的曲線只是一個嬰兒!它看起來像[這個](http://upload.wikimedia.org/wikipedia/commons/9/97/Dragon_curve_iterations_%282%29.svg) 。嘗試傳遞一個更長的字符串到drawit()。 –

+0

我能弄明白!我傳遞的只是一個字符串,當它應該被傳遞給我的createWord()函數中的字符時調用。它只需要2行來解決! Arrrgh – mdegges