2

タートル グラフィックスを使用してドラゴン カーブを描画するプログラムを作成しました。

ここに画像の説明を入力

私が気付いた 1 つの問題は、生成された文字列を変数 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

1 に答える 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()
于 2011-09-29T17:52:01.187 に答える