Глава 6 · Рисуем классные вещи с помощью Turtle

Мини-проект — рисуем мандалу только из прямых линий

Собираем все приёмы главы в одном узоре — от первого мотива до полного результата — и подводим итоги.

Соберём все приёмы главы в одном финальном узоре: мандале, составленной только из прямых линий, — множество лучей одинаковой длины, каждый раз повёрнутых на небольшой угол.

Планирование: что вообще происходит

Идея простая: встать в одну точку, посмотреть в направлении ugol, проехать вперёд и сразу же вернуться назад по той же линии — а затем немного повернуть курс и повторить. Если повторить это достаточно много раз, покрывая все 360° вокруг центра, лучи сольются в симметричный узор.

Один мотив

Сначала — всего несколько лучей, чтобы увидеть сам приём до того, как он превратится в насыщенный узор:

motiv.py
import turtle

screen = turtle.Screen()
screen.setup(width=420, height=420)
artist = turtle.Turtle()
artist.speed(0)
artist.pencolor("#5B24F9")

shag_ugla = 10
ugol = 0
while ugol < 60:
    artist.setheading(ugol)
    artist.forward(150)
    artist.backward(150)
    ugol += shag_ugla

screen.exitonclick()
Результат выполнения
Веер из нескольких фиолетовых лучей, выходящих из одной точки под небольшим углом друг к другу
Один мотив: несколько лучей под небольшим углом друг к другу — ещё не полная мандала
motiv_kod.py
shag_ugla = 10
ugol = 0
while ugol < 60:
    artist.setheading(ugol)
    artist.forward(150)
    artist.backward(150)
    ugol += shag_ugla
Забегаем вперёд
Цикл while подробно разберём позже — здесь достаточно увидеть, что setheading() позволяет нарисовать сложный узор всего в нескольких строках, перебирая углы по кругу.

Полный оборот — готовая мандала

Тот же код, только цикл теперь идёт не до 60°, а до полных 360°:

mandala.py
import turtle

screen = turtle.Screen()
screen.setup(width=420, height=420)
artist = turtle.Turtle()
artist.speed(0)
artist.pencolor("#5B24F9")

shag_ugla = 10
ugol = 0
while ugol < 360:
    artist.setheading(ugol)
    artist.forward(150)
    artist.backward(150)
    ugol += shag_ugla

screen.exitonclick()
Результат выполнения
Симметричная мандала из множества прямых фиолетовых лучей, расходящихся из центра во все стороны
Тот же приём, доведённый до полного оборота 360° — мандала из прямых линий
mandala_kod.py
shag_ugla = 10
ugol = 0
while ugol < 360:
    artist.setheading(ugol)
    artist.forward(150)
    artist.backward(150)
    ugol += shag_ugla
★ Базовая практика
Другой шаг угла

Измените shag_ugla на 5 или на 30 — как меняется узор?

★★ Самостоятельная задача
Другая длина луча

Измените длину forward(150) — попробуйте 80 и 250.

★★★ Задача повышенной сложности
Цветная мандала

Добавьте artist.pencolor("violet") перед циклом и поэкспериментируйте с другими цветами.

Практика: мандала из прямых линий
Модуль turtle открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →

Финальная карта главы

Какая команда Turtle мне нужна?
Нужно узнать, где сейчас черепашка?
position() / xcor() / ycor()
Нужно переместиться, не рисуя?
penup() / pendown()
Нужно попасть в конкретную точку?
goto(x, y)
Нужен правильный многоугольник?
поворот = 360 / n
Нужна закрашенная фигура?
begin_fill() / end_fill()
Нужна окружность или дуга?
circle(радиус, [extent])
Нужна повторяемая случайность?
random.seed()
Главная сводная карта главы 6 — возвращайтесь к ней в будущих проектах

Итоги

Что мы узнали в этой главе

  • Экран (turtle.Screen()) и черепашка (turtle.Turtle()) — два разных объекта; у черепашки есть состояние: позиция, курс, перо, цвет.
  • Окно Turtle использует ту же координатную систему, что и математика: центр (0, 0), x вправо, y вверх.
  • forward()/backward() двигают черепашку; left()/right() поворачивают курс относительно текущего направления; setheading() задаёт направление абсолютно.
  • Угол поворота для правильного многоугольника — 360 / n.
  • penup()/pendown() управляют тем, рисуется ли линия при движении; goto(x, y) перемещает черепашку в конкретную точку экрана напрямую.
  • begin_fill()/end_fill() закрашивают замкнутый контур; circle() рисует окружности и дуги; dot() ставит точку без движения.
  • random.seed() делает случайную графику воспроизводимой — полезно и для документации, и для отладки.

Что дальше

В главе 7 мы вернёмся к Turtle и настроим её ещё тоньше — научимся точно настраивать экран, рисовать текст, освоим дуги подробнее и соберём собственного смайлика. Всё, что вы узнали здесь — координаты, углы, перо, заливка, — станет тем фундаментом, на котором строится более тонкая настройка.