Глава 13 з 27

Безкоштовно

3: Будуємо перші програми

⏱️ 45-60 хвилин
📊 intermediate

Розділ 13: "Малюємо за допомогою коду"

На наступній зустрічі Професор Біт зустрів Алісу із загадковою посмішкою.

— Сьогодні ми займатимемося мистецтвом, — оголосив він, вказуючи на великий монітор у центрі кімнати.

— Мистецтвом? — здивувалась Аліса. — Але хіба ми не вивчаємо програмування?

— Програмування і мистецтво цілком сумісні, — відповів Професор. — Сьогодні ми будемо малювати за допомогою коду!

Байт радісно підстрибнув і вивів на своєму екрані барвистий візерунок із геометричних фігур.

— Для створення графіки за допомогою коду ми будемо використовувати бібліотеку Turtle (Черепашка), — пояснив Професор. — Це простий, але дуже потужний інструмент для малювання.

Він на мить замовк і з натхненням прочитав:

В малюнку — слід часів та еволюцій,
В рядку — глибинні таємничі сни.
Сплетіння ніжних творчих конструкцій
Приносить в код дихання новизни.

Отак фрактали світ плете невпинно,
Беззвучний діалог ведучи знов.
Творитимем, доки живе людина,
Пускаючи у вічність нашу кров.

І кожен куплет пісні голосної
Співали голоси тих, хто вже жив.
Наповнюючи їх красою новою,
Ми збережем усе для нових див!

Професор набрав на клавіатурі перші рядки коду:

python
import turtle

Створюємо полотно і пензель


полотно = turtle.Screen()
полотно.bgcolor("white") # Білий фон
пензель = turtle.Turtle()
пензель.shape("turtle") # Форма черепашки
пензель.color("blue") # Синій колір
пензель.pensize(2) # Товщина лінії

Малюємо квадрат


for _ in range(4):
пензель.forward(100) # Рухатися вперед на 100 кроків
пензель.right(90) # Повернути праворуч на 90 градусів

полотно.exitonclick() # Закрити вікно при кліку

На екрані з'явилося вікно з білим фоном, на якому синя черепашка намалювала квадрат.

— Вау! — вигукнула Аліса. — Черепашка справді намалювала квадрат!

— Бібліотека Turtle працює за принципом "черепашачої графіки", — пояснив Професор. — Ти керуєш "черепашкою", яка залишає слід, коли рухається. Це схоже на те, ніби ти водиш олівцем по паперу.

— А що означає підкреслення в for _ in range(4)? — запитала Аліса.

— Влучне запитання! — кивнув Професор. — Підкреслення (_) використовується, коли нам не важлива змінна циклу. Ми просто хочемо повторити дію 4 рази, і нам не потрібно знати номер поточної ітерації (повторення).

— Давай намалюємо щось складніше! — запропонувала Аліса.

— Звичайно! Як щодо різнокольорової спіралі? — Професор написав новий код:

python
import turtle
import random

полотно = turtle.Screen()
полотно.bgcolor("black") # Чорний фон
пензель = turtle.Turtle()
пензель.speed(0) # Максимальна швидкість

Список кольорів для спіралі


кольори = ["red", "orange", "yellow", "green", "blue", "purple"]

Малюємо спіраль


for i in range(360):
пензель.color(random.choice(кольори)) # Випадковий колір
пензель.forward(i * 0.01 + 1) # Збільшуємо крок
пензель.right(10) # Повертаємо на 10 градусів

полотно.exitonclick()

На чорному фоні з'явилась барвиста спіраль, що переливається всіма кольорами веселки.

— Це неймовірно красиво! — захопилась Аліса. — А що означає пензель.speed(0)?

— Це встановлює максимальну швидкість руху черепашки, — пояснив Професор. — Значення можуть бути від 1 (найповільніший) до 10 (швидкий). А значення 0 означає, що анімація руху вимкнена, і черепашка малює миттєво.

— А можна намалювати щось, що більше схоже на справжній малюнок? — запитала Аліса.

— Так, можна створювати досить складні малюнки, — кивнув Професор. — Давай намалюємо квітку:

python
import turtle
import math

полотно = turtle.Screen()
полотно.bgcolor("skyblue")
пензель = turtle.Turtle()
пензель.speed(0)

Малюємо стебельце


пензель.color("green")
пензель.pensize(5)
пензель.penup()
пензель.goto(0, -200)
пензель.pendown()
пензель.left(90)
пензель.forward(200)

Малюємо серединку квітки


пензель.color("brown")
пензель.penup()
пензель.goto(0, 0)
пензель.pendown()
пензель.begin_fill()
пензель.circle(20)
пензель.end_fill()

Малюємо пелюстки


пензель.color("pink")
for i in range(12):
пензель.penup()
пензель.goto(0, 0)
пензель.pendown()
пензель.setheading(i 30) # Поворот на 30 i градусів

# Малюємо пелюстку
пензель.begin_fill()
for j in range(60):
пензель.forward(2)
пензель.left(3)
пензель.end_fill()

Ховаємо черепашку і завершуємо


пензель.hideturtle()
полотно.exitonclick()

На екрані з'явилась квітка з рожевими пелюстками, коричневою серединкою і зеленим стебельцем на блакитному фоні.

— Це прекрасно! — вигукнула Аліса. — Але код став набагато складнішим.

— Так, тут ми використали кілька нових команд, — погодився Професор. — Наприклад:

goto(x, y) переміщує черепашку у вказані координати.

penup() і pendown() дозволяють піднімати і опускати "перо", щоб переміщатися без малювання.

beginfill() і endfill() заповнюють кольором область всередині намальованого контуру.

setheading() встановлює напрямок, куди дивиться черепашка.

hideturtle() ховає черепашку, щоб вона не псувала малюнок.

Логік, що спостерігала за процесом, додала:
— У програмуванні графіки ми часто використовуємо математику. Координати, кути, відстані — все це математичні концепції.

— А можна створювати анімації? — запитала Аліса.

— Звичайно! — відповів Професор. — Давай створимо просту анімацію рухомого сонця:

python
import turtle
import time

полотно = turtle.Screen()
полотно.bgcolor("lightblue")
полотно.setup(600, 400) # Розмір вікна

Створюємо сонце


сонце = turtle.Turtle()
сонце.shape("circle")
сонце.color("yellow")
сонце.penup()
сонце.goto(-300, 0) # Початкова позиція зліва

Створюємо землю


земля = turtle.Turtle()
земля.penup()
земля.goto(-300, -100)
земля.pendown()
земля.color("green")
земля.pensize(3)
земля.forward(600) # Лінія землі
земля.hideturtle()

Анімація сходу і заходу


for x in range(-300, 301, 5):
y = 100 (1 - ((x / 150) * 2)) # Парабола для траєкторії
сонце.goto(x, y)
time.sleep(0.05) # Пауза для створення анімації

полотно.exitonclick()

На екрані з'явилась анімація: жовте сонце повільно піднімалося над зеленою лінією горизонту, а потім опускалося.

— Це вже справжня анімація! — захопилась Аліса. — Ми використовуємо цикл, щоб сонце рухалося по параболі від лівого краю до правого.

— Ще одне цікаве застосування програмування в графіці — це фрактали, — сказав Професор. — Фрактали — це геометричні фігури, які повторюють свою структуру в різних масштабах.

— Звучить складно, — насупилась Аліса.

— Насправді їх досить просто створювати за допомогою рекурсивних функцій, — посміхнувся Професор. — Дивись:

python
import turtle

полотно = turtle.Screen()
полотно.bgcolor("black")
пензель = turtle.Turtle()
пензель.color("green")
пензель.speed(0)

Рекурсивна функція для малювання гілки


def намалювати_гілку(черепашка, довжина, рівень):
if рівень == 0:
return

черепашка.forward(довжина)

черепашка.right(30)
намалювати_гілку(черепашка, довжина * 0.7, рівень - 1)

черепашка.left(60)
намалювати_гілку(черепашка, довжина * 0.7, рівень - 1)

черепашка.right(30)
черепашка.backward(довжина)

Налаштовуємо початкову позицію


пензель.penup()
пензель.goto(0, -200)
пензель.left(90)
пензель.pendown()

Малюємо фрактальне дерево


намалювати_гілку(пензель, 100, 6)

пензель.hideturtle()
полотно.exitonclick()

На екрані з'явилося витончене фрактальне дерево з безліччю гілок.

Черепашка малює фрактальне дерево

— Це дивовижно! — вигукнула Аліса. — Як це працює?

— Функція намалювати_гілку викликає сама себе, створюючи менші гілки на кінці кожної попередньої гілки, — пояснив Професор. — Параметр рівень визначає, скільки разів відбуватиметься це розгалуження. Коли рівень досягає нуля, рекурсія зупиняється.

— У природі теж багато фракталів, — зауважила Логік. — Дерева, сніжинки, листя папороті, системи кровоносних судин — усі вони мають фрактальну структуру.

— Комп'ютерна графіка — це величезна сфера, — підсумував Професор. — Від простих геометричних фігур до складних 3D-моделей і анімацій. І все це створюється за допомогою коду!

— Тепер я розумію, що програмування — це не тільки розв'язування задач і обробка даних, а ще й творчість, — сказала Аліса. — Це як справжня магія: пишеш кілька рядків коду, і з'являється красивий малюнок!


Завдання

Придумай і опиши, який рисунок ти хотів би створити за допомогою коду. Це може бути що завгодно: тварина, рослина, геометричний узір або абстрактна композиція. Як би ти використав основні команди (рух, повороти, кольори) для створення свого рисунка? Зроби начерк на папері і подумай, які цикли або функції могли б допомогти намалювати повторювані елементи.