可以使用turtle 以几种不同的方式解决这个问题。虽然显而易见的答案似乎是使用嵌套循环来绘制正方形,但下面是一些其他的思考方式。
首先,使用turtle.circle(steps=4)。 circle 例程可以绘制任意正多边形,包括正方形,但您必须针对定位进行调整:
import turtle
def drawSquares(myTurtle, sideLength, nSquares, distanceApart):
myTurtle.penup()
x, y = myTurtle.position()
myTurtle.goto(x - sideLength/ 2, y - sideLength / 2) # adjust so current x, y is center
myTurtle.pendown()
myTurtle.setheading(-45) # by default square would be sitting on corner instead of on side
for _ in range(nSquares):
radius = sideLength * 2**0.5 / 2
myTurtle.circle(radius, steps=4)
sideLength -= 10
myTurtle.penup()
x, y = myTurtle.position()
myTurtle.goto(x + distanceApart / 2, y + distanceApart / 2)
myTurtle.pendown()
yertle = turtle.Turtle()
yertle.penup()
yertle.goto(60, 60)
yertle.pendown()
drawSquares(yertle, 200, 4, 10)
turtle.done()
对于我剩下的例子,我将假设相同的调用代码,并只展示修改后的drawSquares() 例程。我相信@PVNRT 的 recursive 解决方案非常好,尽管我会稍微调整如下:
def drawSquares(myTurtle, sideLength, nSquares, distanceApart):
if nSquares < 1:
return
for _ in range(4):
myTurtle.forward(sideLength)
myTurtle.left(90)
myTurtle.penup()
x, y = myTurtle.position()
myTurtle.goto(x + distanceApart / 2, y + distanceApart / 2)
myTurtle.pendown()
drawSquares(myTurtle, sideLength - distanceApart, nSquares - 1, distanceApart)
我个人最喜欢解决这类问题的方法是使用冲压而不是绘图。这是一个非常快速的解决方案:
def drawSquares(yourTurtle, sideLength, nSquares, distanceApart):
myTurtle = yourTurtle.clone() # clone turtle so we don't have to restore changes
myTurtle.shape("square") # modify turtle shape for stamping
myTurtle.fillcolor(turtle.bgcolor()) # modify turtle fill color for stamping
for _ in range(nSquares):
myTurtle.turtlesize(sideLength / 20) # magic number 20 is default stamp size
myTurtle.stamp()
sideLength -= distanceApart
最后,使用嵌套循环的明显解决方案现在应该不那么明显了,因为您已经看到还有其他方法:
def drawSquares(myTurtle, sideLength, nSquares, distanceApart):
for n in range(nSquares):
for _ in range(4):
myTurtle.forward(sideLength)
myTurtle.left(90)
myTurtle.penup()
x, y = myTurtle.position()
myTurtle.goto(x + distanceApart / 2, y + distanceApart / 2)
myTurtle.pendown()
sideLength -= distanceApart
OP 规范中的一个弱点是 x 和 y 参数的含义。我已经将它们排除在外,因为正方形是在当前 x 和 y 处绘制的。 OP将它们视为绘图的右上角,这与turtle中的任何内容都不一致。我选择将它们设为左下角或中心(对于基于圆形和冲压的解决方案)。