首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用分形、类和swampy的TurtleWorld - Python -调试器生成二叉树

使用分形、类和swampy的TurtleWorld - Python -调试器生成二叉树
EN

Stack Overflow用户
提问于 2013-11-01 13:12:48
回答 1查看 1.2K关注 0票数 1

我有这段代码,它读取并解释了一个分形描述语言文件,然后使用FractalWorld,这是一个特殊版本的TurtleWorld,它只是删除海龟,没有延迟。

代码语言:javascript
复制
import math, random, sys
from FractalWorld import *

world = FractalWorld(width=1000,height=1000,delay=0)
Rasmus = Fractal(draw=False)

class command(object):
    def __init__(self, cmd, l):
            self.cmd = cmd
            self.l = l

    def execute(self, turtle, length):
            if self.cmd=='lt':
                    lt(turtle, int(self.l[0]))
            if self.cmd=='rt':
                    rt(turtle, int(self.l[0]))
            if self.cmd=='fd':
                    fd(turtle, length)
            if self.cmd=='bk':
                    bk(turtle, length)
            if self.cmd=='scale':
                    lenght = length*float(self.l[0])

class rule(object):
    def __init__(self):
            self.rule={} #we make an empty dictionary

    def newrule(self,leftside,rightside):
            self.rule[leftside]=rightside #we fill the dictionary

    def expand (self,oldlist,depth):
            if depth <= 0:
                    return oldlist 
            newlist=[] # we make an empty new list
            for i in oldlist:
                    if i not in self.rule:
                            newlist.append(i)
                    else:
                            newlist.append(self.expand(self.rule[i],depth-1))
            return newlist

class Fractal(object):
    def __init__(self, start, rules, commands, length, depth):
            self.start = start
            self.rules = rules
            self.commands = commands
            self.length = length
            self.depth = depth

    def draw(self, oldlist):
            for i in oldlist:
                    if type(i) == list:
                            self.draw(i)
                    else:
                            cmd = self.commands[i]
                            cmd.execute(Rasmus, self.length)

def read():
    files = open('tree.fdl')
    commands = {}
    r = rule()
    for line in files:
            line = line.strip()
            oldlist = line.split(' ')
            if oldlist[0] == 'start':
                    start = oldlist[1:]
            elif oldlist[0] == 'rule':
                    r.newrule(oldlist[1], oldlist[3:])
            elif oldlist[0] == 'cmd':
                    cmd = command(oldlist[2], oldlist[3:])
                    commands[oldlist[1]] = cmd
            elif oldlist[0] == 'length':
                    length = int(oldlist[1])
            elif oldlist[0] == 'depth':
                    depth = int(oldlist[1])
    return Fractal(start, r, commands, length, depth)

re = read()

print re.commands.keys()

l = re.rules.expand(re.start , re.depth)
re.draw(l)


wait_for_user()

fdl文件将创建一个二叉树,它如下所示:

代码语言:javascript
复制
start X

rule X -> F L D X R X U L B

length 100

depth 10

cmd X nop

cmd F fd

cmd B bk

cmd R rt 70

cmd L lt 35

cmd D scale 0.7

cmd U scale 1.4285714285714286

我的问题是我的翻译里有个bug。似乎翻译没有读取刻度,正确的和向下的刻度,我的线条,为下一个深度的树枝。我试过调试它,但一直无法调试。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-01 16:48:11

代码语言:javascript
复制
lenght = length*float(self.l[0])

这一行有两个错误。首先是一个错误。但是,即使名称是正确的,也会将一个新值赋值给局部变量,这是在函数中所做的最后一件事,这是毫无意义的。您可能应该用xxx.length替换它,这样调用函数就可以更改它的值。我作为xxx编写的对象可以是调用方可用的分形实例;然后将它作为参数传递,而不是length

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19727455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档