Как я могу начать переписывать этот домашний код Python? - PullRequest
0 голосов
/ 25 октября 2018

Вот моя домашняя работа:

Отредактируйте этот код, чтобы параметры отражали супер прямоугольник (например, строки = 6 и квадраты = 60, супер прямоугольник будет иметь 6 строк по 10 квадратов)..)

Вот код:

import turtle

import time

bob = turtle.Turtle()

def make_square(bob, length):

for x in range(4):

    bob.rt(90)
    bob.fd(length)


def super_rectangle(bob, rows=2, squares=4, length=100):

height = (length / rows)

columns = int(squares / rows)

for row in range(rows):
    for column in range(columns):
        bob.fd(length)
        make_square(bob, length)
    bob.rt(90)
    bob.fd(length * 2)
    bob.rt(90)
    time.sleep(1)

super_rectangle(bob, length=100)

1 Ответ

0 голосов
/ 26 октября 2018

Мне не ясно, о чем конкретно спрашивает ОП.Однако, запустив код, становится ясно, что он неисправен, как в случае, упомянутом в разделе «Задачи»:

например, строки = 6 и квадраты = 60, тогда ваш супер прямоугольник будет иметь 6 строк по 10 квадратов.

Не работает.Когда вы вызываете super_rectangle(bob, 6, 60, 30), после исправления отступа в коде вы получаете:

enter image description here

, превышенное несколько раз.Мы можем наложить лейкопластырь (и очистить) код 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()

, который выводит описанный результат:

enter image description here

Но если мы примем название ОП буквально:

Другой способ переписать этот код 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()
...