Кривая дракона в Питоне
Я создал программу для рисования кривой дракона с использованием графики черепахи.. но мой результат на самом деле не выглядит так, как картинка в ссылке:
Одна проблема, которую я заметил, заключается в том, что я хочу сохранить полученную строку в переменную 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 ответ:
NewWord локально ограничен внутри createWord (), поэтому после завершения createWord () newWord исчезает.
Подумайте о создании newWord в глобальной области, чтобы вы могли изменить его с помощью createWord - или еще лучше, пусть createWord () возвращает значение и устанавливает newWord в это значение.
Я думаю, что печать" word", а затем использование его в качестве параметра в drawit приведет к тому же, что и использование переменной.
Это так, но если вы хотите изменить длину из вашей кривой дракона вам придется копировать/вставлять строку каждый раз вместо того, чтобы просто изменять значение
max_it
.Edit: мое решение с некоторой сексуальной рекурсией (=
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()