绘制同心正方形

Drawing concentric squares

在阅读本书 "How to think like..." 时,我被练习 4.9.2 卡住了。

问题是:"Write a program to draw this. Assume the innermost square is 20 units per side, and each successive square is 20 units bigger, per side, than the one inside it"

以下代码代表了我到目前为止的进展:

import turtle
wn = turtle.Screen()
wn.bgcolor("lightgreen")
tess = turtle.Turtle()

def draw_square(t,size):
    for i in range(4):
        tess.forward(size)
        tess.left(90)

size = 20
for j in range(3):
   tess.pensize(3)
   draw_square(tess,size)
   size = size + 20
   tess.penup()
   tess.goto(-20, -20)
   tess.pendown()

wn.mainloop()

有好心人指点方向吗?

谢谢!

斯文

问题出在这里:

tess.goto(-20, -20)

你有两个问题。首先,如果每个正方形大 20 个单位并且您将每个正方形偏移 (-20, -20),则所有正方形将共享一个角。相反,您想将正方形的角偏移 (-10, -10),以便内部正方形在所有边上偏移 10 个单位。

第二个问题是.goto(x, y)设置的是绝对位置,而不是偏移量。要移动到偏移量,您需要根据偏移量计算新的绝对位置:

tess.goto(tess.xcor()-10, tess.ycor()-10)

tess.goto(tess.pos() + (-10, -10))

有时当您遇到困难时,使用海龟图形的一个好方法是跳出正方形思考。如果我们将期望的结果视为画得不好的同心圆,那么问题就简化为:

from turtle import Turtle, Screen

HYPOTENUSE = (2 ** 0.5) / 2

screen = Screen()
screen.bgcolor("lightgreen")

tess = Turtle()
tess.pencolor("red")
tess.setheading(45)
tess.width(3)

for radius in range(20, 20 * 5 + 1, 20):
    tess.penup()
    tess.goto(radius/2, -radius/2)
    tess.pendown()
    tess.circle(radius * HYPOTENUSE, steps=4)

screen.exitonclick()

输出

import turtle
def drawSquare (t, size):
    for i in range (4):
        t.forward(size)
        t.left(90)

def main():
    wn = turtle.Screen()
    wn.bgcolor('black')
    pat = turtle.Turtle()
    pat.pensize(2)
    pat.speed(10)
    pat.color('blue')
    space = -10

    for i in range(20, 105, 20):
        drawSquare(pat,i)
        pat.up()
        pat.goto(space, space)
        pat.down()
        space = space - 10
    wn.exitonclick()
main()
import turtle
def draw_sqr(name,size):
    for i in range(4):
        name.forward(size)
        name.left(90)
    name.penup()
    name.backward(10)
    name.right(90)
    name.forward(10)
    name.left(90)
    name.pendown()

window = turtle.Screen()
window.bgcolor('lightgreen')
window.title("conc_sqr")

x = turtle.Turtle()
x.color('hotpink')
x.pensize(3)

for i in range(5):
    draw_sqr(x,20 + 20*i)

window.mainloop()
def draw_rectangle(animal, width, height): 

    for _ in range(2):
        animal.forward(width)
        animal.left(90)
        animal.forward(height)
        animal.left(90)

def draw_square(animal, size): 
    draw_rectangle(animal, size, size)

def make_window(back_color,title):

    window = turtle.Screen()
    window.bgcolor(back_color)
    window.title(title)
    return window

def make_turtle(color, size):

    animal = turtle.Turtle()
    animal.color(color)
    animal.pensize(size)
    return animal

import turtle
window = make_window("lightgreen","Squares")
tess = make_turtle("hotpink",3)

size_sqr=20
adjustment = 10
for _ in range(5):
    draw_square(tess,size_sqr)
    size_sqr += 20
    tess.penup()
    tess.backward(20/2)
    tess.right(90)
    tess.forward(20/2)
    tess.left(90)
    tess.pendown()
    import turtle 

    def drawsquare(t,sz): #(turtle, size)
        for i in range(4):
            t.fd(sz)
            t.right(90)
        
    def main():
        wn = turtle.Screen()
        your_turtle = turtle.Turtle()
        your_turtle.pensize(3)
        wn.bgcolor("light green")
        your_turtle.pencolor("hot pink")
        
        for i in range(1,6):
            drawsquare(your_turtle,20*i)
            your_turtle.up()
            your_turtle.left(135)
            your_turtle.fd(14.142) #the distance between each square
            your_turtle.right(135)
            your_turtle.down()
        
    main()
    wn.exitonclick()