Python 吸引大写字母的递归 Turtle 函数 I's
Python Recursive Turtle function that draws capital I's
打算使用递归用乌龟绘制它:
但我真的很不擅长这个。这就是我得到的:
代码如下:
https://gyazo.com/24cebddbb111506fd6959bb91dadb481
import turtle
def draw_shape(t, level,size):
if level == 1: #draws an I
t.down()
t.forward(size/2)
t.left(90)
t.forward(size/2)
t.back(size)
t.forward(size/2)
t.left(90)
t.forward(size)
t.left(90)
t.forward(size/2)
t.back(size)
t.up()
t.forward(size/2)
t.left(90)
t.forward(size/2)
else:
draw_shape(t,level - 1,size)
t.back(size/2)
t.right(90)
t.forward(size/2)
t.left(90)
draw_shape(t,level - 1,size/2)
t.left(90)
t.forward(size)
t.right(90)
draw_shape(t,level-1,size/2)
t.right(90)
t.forward(size/2)
t.left(90)
t.forward(size)
t.right(90)
t.forward(size/2)
t.left(90)
draw_shape(t,level-1,size/2)
t.left(90)
t.forward(size)
t.right(90)
draw_shape(t,level-1,size/2)
def q1():
my_win = turtle.Screen()
my_turtle = turtle.Turtle()
my_turtle.speed(0.006)
my_turtle.left(90)
my_turtle.up()
my_turtle.back(200)
n = int(input('Draw shape at level: '))
draw_shape(my_turtle,n,200)
my_win.exitonclick()
q1()
几乎只是为了编辑 draw_shape() 函数。我在第 2 级就把它弄对了,但其余的级别开始变得不稳定并且绘制错误的大小我在错误的位置,我认为这是因为我的指针在绘制 I 之后放置的位置。任何帮助将不胜感激。
我发现你现在的代码有两个问题。
首先是下面的代码在完成后并没有把海龟放回中心点。这就是为什么较小的位被绘制在不同的随机位置,因为之前的调用将海龟留在了奇怪的地方。
第二个问题是您一开始就使用了递归调用。这并不是真正必要的,因为无论如何您稍后都会沿着 I
形状移动。
我的建议是制定基本案例 level < 1
。这不需要您做任何事情(您可以立即 return
)。这将替换您的整个 if level == 1
块(您需要保留的 t.down()
除外)。
def draw_shape(t, level, size):
if level < 1: # base case
return
t.down() # put pen down at the start, don't recurse immediately
t.back(size/2)
t.right(90)
t.forward(size/2)
t.left(90)
draw_shape(t, level - 1, size / 2)
t.left(90)
t.forward(size)
t.right(90)
draw_shape(t, level - 1, size / 2)
t.right(90)
t.forward(size / 2)
t.left(90)
t.forward(size)
t.right(90)
t.forward(size / 2)
t.left(90)
draw_shape(t, level - 1, size / 2)
t.left(90)
t.forward(size)
t.right(90)
draw_shape(t, level - 1, size / 2)
t.right(90) # add lines below to get back to start position
t.forward(size / 2)
t.left(90)
t.back(size / 2)
您可以通过拿起笔并从 I 的一端跳到另一端(例如从左下角到左上角)而不是在中间的横条上画额外的时间来稍微简化一下。我保留了您的大部分代码,以使必要的更改(而不仅仅是漂亮的更改)更加清晰。
打算使用递归用乌龟绘制它:
但我真的很不擅长这个。这就是我得到的:
代码如下: https://gyazo.com/24cebddbb111506fd6959bb91dadb481
import turtle
def draw_shape(t, level,size):
if level == 1: #draws an I
t.down()
t.forward(size/2)
t.left(90)
t.forward(size/2)
t.back(size)
t.forward(size/2)
t.left(90)
t.forward(size)
t.left(90)
t.forward(size/2)
t.back(size)
t.up()
t.forward(size/2)
t.left(90)
t.forward(size/2)
else:
draw_shape(t,level - 1,size)
t.back(size/2)
t.right(90)
t.forward(size/2)
t.left(90)
draw_shape(t,level - 1,size/2)
t.left(90)
t.forward(size)
t.right(90)
draw_shape(t,level-1,size/2)
t.right(90)
t.forward(size/2)
t.left(90)
t.forward(size)
t.right(90)
t.forward(size/2)
t.left(90)
draw_shape(t,level-1,size/2)
t.left(90)
t.forward(size)
t.right(90)
draw_shape(t,level-1,size/2)
def q1():
my_win = turtle.Screen()
my_turtle = turtle.Turtle()
my_turtle.speed(0.006)
my_turtle.left(90)
my_turtle.up()
my_turtle.back(200)
n = int(input('Draw shape at level: '))
draw_shape(my_turtle,n,200)
my_win.exitonclick()
q1()
几乎只是为了编辑 draw_shape() 函数。我在第 2 级就把它弄对了,但其余的级别开始变得不稳定并且绘制错误的大小我在错误的位置,我认为这是因为我的指针在绘制 I 之后放置的位置。任何帮助将不胜感激。
我发现你现在的代码有两个问题。
首先是下面的代码在完成后并没有把海龟放回中心点。这就是为什么较小的位被绘制在不同的随机位置,因为之前的调用将海龟留在了奇怪的地方。
第二个问题是您一开始就使用了递归调用。这并不是真正必要的,因为无论如何您稍后都会沿着 I
形状移动。
我的建议是制定基本案例 level < 1
。这不需要您做任何事情(您可以立即 return
)。这将替换您的整个 if level == 1
块(您需要保留的 t.down()
除外)。
def draw_shape(t, level, size):
if level < 1: # base case
return
t.down() # put pen down at the start, don't recurse immediately
t.back(size/2)
t.right(90)
t.forward(size/2)
t.left(90)
draw_shape(t, level - 1, size / 2)
t.left(90)
t.forward(size)
t.right(90)
draw_shape(t, level - 1, size / 2)
t.right(90)
t.forward(size / 2)
t.left(90)
t.forward(size)
t.right(90)
t.forward(size / 2)
t.left(90)
draw_shape(t, level - 1, size / 2)
t.left(90)
t.forward(size)
t.right(90)
draw_shape(t, level - 1, size / 2)
t.right(90) # add lines below to get back to start position
t.forward(size / 2)
t.left(90)
t.back(size / 2)
您可以通过拿起笔并从 I 的一端跳到另一端(例如从左下角到左上角)而不是在中间的横条上画额外的时间来稍微简化一下。我保留了您的大部分代码,以使必要的更改(而不仅仅是漂亮的更改)更加清晰。