Мне не ясно, о чем конкретно спрашивает ОП.Однако, запустив код, становится ясно, что он неисправен, как в случае, упомянутом в разделе «Задачи»:
например, строки = 6 и квадраты = 60, тогда ваш супер прямоугольник будет иметь 6 строк по 10 квадратов.
Не работает.Когда вы вызываете super_rectangle(bob, 6, 60, 30)
, после исправления отступа в коде вы получаете:
, превышенное несколько раз.Мы можем наложить лейкопластырь (и очистить) код OP, чтобы исправить ситуацию:
from turtle import Screen, Turtle
def make_square(turtle, length):
for _ in range(4):
turtle.left(90)
turtle.forward(length)
def super_rectangle(turtle, rows=2, squares=4, length=100):
columns = squares // rows
parity = 1
for row in range(rows):
for _ in range(columns):
turtle.forward(length)
make_square(bob, length)
turtle.right(parity * 90)
if parity < 1 and row < rows - 1:
turtle.forward(length * 2)
turtle.right(parity * 90)
parity = 0 - parity
screen = Screen()
bob = Turtle()
bob.speed('fastest') # because I have no patience
super_rectangle(bob, 6, 60, 30)
screen.exitonclick()
, который выводит описанный результат:
Но если мы примем название ОП буквально:
Другой способ переписать этот код Python?
Тогда я предлагаю Штамп , а не Рисунок , является правильным способом решения этой проблемы.Такой подход делает код более простым и быстрым:
from turtle import Screen, Turtle
CURSOR_SIZE = 20
def super_rectangle(turtle, rows=2, squares=4, length=100):
columns = squares // rows
turtle.shapesize(length / CURSOR_SIZE)
parity = 1
for _ in range(rows):
for _ in range(columns):
turtle.stamp()
turtle.forward(parity * length)
x, y = turtle.position()
turtle.setposition(x + -parity * length, y + length)
parity = 0 - parity
screen = Screen()
bob = Turtle('square', visible=False)
bob.color("black", "white")
bob.penup()
super_rectangle(bob, 6, 60, 30)
screen.exitonclick()
Мне действительно нужно рисовать, а не штамповать.
Мы можем реализовать это совершенно по-другому, используя рисование это проще и намного эффективнее, чем ваш пропатченный код.Ключ должен обратиться к обширной избыточности в чертеже.Вместо того, чтобы рисовать отдельные квадраты, мы разместим все горизонтальные линии, а затем все вертикальные линии:
from turtle import Screen, Turtle
def make_serpentine(turtle, length, rows, columns, parity=1):
for _ in range(rows):
turtle.forward(length * columns)
turtle.left(parity * 90)
turtle.forward(length)
turtle.left(parity * 90)
parity = 0 - parity
def super_rectangle(turtle, rows=2, squares=4, length=100):
columns = squares // rows
make_serpentine(turtle, length, rows, columns)
turtle.forward(length * columns)
turtle.right(90)
make_serpentine(turtle, length, columns, rows, -1) # reverse sense of rows & columns
turtle.forward(length * rows)
turtle.left(90) # leave things as we found them
screen = Screen()
bob = Turtle()
super_rectangle(bob, 6, 60, 30)
screen.exitonclick()