0

我正在尝试编写一个生成字符串的程序,然后根据字符串中的下一个字符绘制某些行。我相信它可以正确生成字符串,因为我已经手动检查了几次迭代,但是我使用的海龟似乎无法正常工作。

例如,下面的代码应该生成谢尔宾斯基三角形,但只画一条直线。

我已经检查过其他 L 系统(例如龙曲线),虽然它没有产生水平线,但结果仍然不正确。字符串似乎是正确的,所以我认为问题在于海龟模块如何解释我的指令。这是我第一次使用该模块,所以如果我遇到了一些非常基本的错误,我不会感到惊讶。

from tkinter import *
import turtle 

Width=500
Height=500

def process_string(string):
    return string.translate(str.maketrans({'A':'B-A-B','B':'A+B+A'}))


def createSystem(seed,depth):
    string=seed
    for i in range(depth):  
        string=process_string(string)
        print(string)
    return(string)


def draw(string):

    t = turtle.RawTurtle(canvas) 
    t.penup()
    t.goto(-0.4*Width,0.4*Height) #this translation fits more of the curve 
                                   on the screen
    t.pendown()
    t.shape("circle")
    t.speed("fastest")


    for char in string:

        if char=="A" or char=="B":
            t.forward(10)
        elif char=="+":
            t.right(60)
        elif char=="-":
            t.left(60)



root=Tk()
canvas=Canvas(width=Width, height=Height)
canvas.pack()    
draw(createSystem("A",3))
print("COMPLETE")
root.mainloop() }

和以前一样,这个例子应该产生谢尔宾斯基三角形,但只产生一条水平线。

作为我认为不值得发表的最后一个快速问题,海龟文档说 speed("fastest") 应该删除所有动画,但事实并非如此,有什么想法吗?谢谢大家的时间!

编辑:我已经用用户建议更新了代码,虽然这为三角形提供了正确的结果,但它仍然为龙曲线提供了不正确的图像。龙曲线的信息是

"变量 : XY 常数 : F + − start : FX 规则 : (X → X+YF+), (Y → −FX−Y) 角度 : 90° 这里,F 表示“向前拉”,- 表示“左转 90° ”,+表示“右转90°”。X和Y不对应任何绘制动作,仅用于控制曲线的演变。

4

2 回答 2

2

问题是

if char=="A" or "B":

意思是

if (char == "A") or "B":

所以它只比较char并且"A"它给出

if True or "B": 

或者

if False or "B": 

首先给出

if True:

第二个给

if "B": 

但这就像

if bool("B"): 

这使

if True: 

所以最终的if char=="A" or "B":工作方式是if True:这样的,这部分代码总是被执行。


它一定要是

if char == "A" or char == "B": 

或者

if char in ("A", "B"): 

或者

if char in "AB":   

正如@cdlane 在评论中提到的,您也可以使用set()

if char in {"A", "B"}: 

这需要恒定的时间来检查任何大小集中的字符。但是对于小型集,您将看不到时间上的差异。

于 2019-07-29T19:49:17.603 回答
0

改变:

if char=="A" or "B":

至:

if char=="A" or char=="B":
于 2019-07-29T19:46:13.750 回答