Одной из замечательных особенностей Python является то, что в интерпретаторе легко тестировать небольшие кусочки кода. Давайте используем интерпретатор для проверки длины сторон:
In [82]: number_of_shapes = 4
In [83]: for shape in range(1, number_of_shapes + 1):
....: print(20 + shape * 10)
30
40
50
60
К сожалению. Теперь мы можем ясно видеть, что forward(20 + shape * 10)
не даст сторонам длины 20, 40, 60 и 80. Обратите внимание, что (20 + shape * 10)
увеличивает длину сторон на 10. Мы хотим увеличить на 20, поэтому используйте (20 + shape * 20)
вместо:
In [84]: for shape in range(1, number_of_shapes + 1):
....: print(20 + shape * 20)
....:
40
60
80
100
Упс, я не правильно поняла. Нет проблем, нам просто нужно уменьшить все на 20:
In [85]: for shape in range(1, number_of_shapes + 1):
....: print(shape * 20)
....:
20
40
60
80
Ах, намного лучше.
Итак, теперь код выглядит так:
import turtle
number_of_shapes = 4
for shape in range(1, number_of_shapes+1):
#Draw a square
for sides in range(4):
turtle.forward(20 + shape * 20)
turtle.right(90)
#Move to position of next square
turtle.penup()
turtle.goto(shape * 10, shape * 10)
turtle.pendown()
turtle.mainloop()
Когда вы запустите этот код, обратите внимание, что черепаха начинает каждый квадрат в верхнем левом углу.
и начинает рисовать вправо.
Теперь давайте подумаем о выражении goto(shape * 10, shape * 10)
. Куда это нас ведет? Давайте использовать переводчик, чтобы узнать:
In [87]: for shape in range(1, number_of_shapes + 1):
....: print(shape * 10, shape * 10)
....:
10 10
20 20
30 30
40 40
Сравнивая эти координаты с приведенным выше результатом, вы можете видеть, что черепаха перемещается вверх и вправо. Верхний левый угол каждого квадрата начинается немного выше и чуть правее. Вместо этого мы хотим, чтобы верхний левый угол каждого нового квадрата начинался немного выше и влево :
In [88]: for shape in range(1, number_of_shapes + 1):
....: print(-shape * 10, shape * 10)
....:
-10 10
-20 20
-30 30
-40 40
Посмотрим, что происходит сейчас:
Бинго.
Кстати, для смешивания относительных команд, таких как left
и right
и forward
, с абсолютными командами, такими как goto
, требуется ... координация. Математика привередлива.
Если вы придерживаетесь чисто относительных команд, вам не нужно много думать о получении правильных goto
координатных формул:
turtle.penup()
turtle.left(90)
turtle.forward(10)
turtle.left(90)
turtle.forward(10)
turtle.left(180)
turtle.pendown()
Преимущество использования чисто относительных команд состоит в том, что теперь вы можете разместить черепаху где угодно, с любым начальным заголовком и по-прежнему рисовать вложенные квадраты:
import turtle
number_of_shapes = 4
turtle.setheading(45)
turtle.penup()
turtle.goto(20, 50)
turtle.pendown()
for shape in range(1, number_of_shapes+1):
#Draw a square
for sides in range(4):
turtle.forward(20 + shape * 20)
turtle.right(90)
#Move to position of next square
turtle.penup()
turtle.left(90)
turtle.forward(10)
turtle.left(90)
turtle.forward(10)
turtle.left(180)
turtle.pendown()
turtle.mainloop()