---
tags: materials
---
# Черепашка. Структури даних

### У попередніх серіях
#### [LVL 1](https://hackmd.io/@pythondemo-v2/Sk6_t3Viw#Level-1)
Де ви знайомитесь з віртуальним роботом-черепашкою і керуєте ним за допомогою команд.
#### [LVL 2](https://hackmd.io/@pythondemo-v2/Sk6_t3Viw#Level-2)
Де ви знайомитесь з процедурами, першим потужним способом організації програм, та параметрами процедур, способом об'єднання процедур для зменшення кількості коду.
#### [LVL 3](https://hackmd.io/@pythondemo-v2/Sk6_t3Viw#Level-3)
Де ви знайомитесь з подіями (events) та хуками (процедурами, які прив'язуються на події).
## LVL 3.5. MEGA PROGRAM
:::info
**Завдання**
Зробити одну велику **мега програму**, яка буде складатись з усіх ваших маленьких програм (окрім інтерактивних). При натисненні на клавішу (abcdefghijklmnop....) черепашка очищує екран і малює фігуру з одного з завдань.
Наприклад, <kbd>a</kbd> --- малює квадрат, <kbd>b</kbd> --- малює шестикутник, <kbd>c</kbd> --- малює сітку, <kbd>d</kbd> --- малює зигзаг, і так далі.
Для цього потрібно буде, щоб кожна ваша програма стала процедурою у мега-програмі.
:::
:::info
**Завдання**
В черепашці є команда `turtle.write("blabla")`, яка малює текст на екрані. Але, ця команда не вміє робити поворот тексту.
Щоб зробити поворот тексту, нам потрібно свою команду `super_write()`. А для цієї команди нам потрібно усі букви алфавіту.
**Це завдання групове.** Кожен отримує як завдання список букв, які треба зробити черепашкою, і потім все це об'єднати у одну мега-програму АЛФАВІТ.

**Деталі**:
- кожна буква повинна бути у своїй процедурі
- малюємо великі букви (ABCDEF...), а не маленькі
- коли черепашка починає малювати букву, треба вважати що вона знаходиться у лівому верхньому кутику букви
- коли черепашка закінчує малювати букву, вона повинна перейти у місце, де має починатись наступна буква (правий верхній кут + відступ). На картинці вище --- точки старту позначені червоним квадратиком
- у процедури букви є один параметр --- `height`, який відповідає за висоту букви. Буква не повинна бути більша за `height` (і, бажано, не повинна бути менша). Це потрібно для того, щоб не сталось як на картинці --- одна буква більша за інші
:::
## LVL 3.8. MOVE
Ось програма, яка заставляє черепашку рухатись по формулі, описаній в процедурі `move()`. Параметр `x` означає скільки секунд пройшло після старту програми, а отже, цей параметр з часом змінюється (постійно росте).
Як нові використано дії:
- `import math` --- додає різні математичні формули
- `import time` --- додає різні функції та процедури для роботи з часом
- `time.time()` --- повертає кількість секунд, які пройшли з 1 січня 1970 року. Результат кожен раз змінюється коли ви запускаєте програму (постійно росте)
- `time.sleep(x)` --- поставити програму на паузу на `x` секунд. Це дозволяє контролювати FPS. Наприклад, `time.sleep(0.01)` у вічному циклі означає, що максимальний FPS буде встановлено як `1сек / 0.01cек = 100`.
- `a*b` --- помножити два числа і повернути результат
- `a**b` --- піднести `a` в степінь `b`. Наприклад, `x**2` це $x^2$, `(a+1)**3` це $(a+1)^3$
```python=
import turtle
import math
import time
turtle.tracer(0,0)
def move(x):
turtle.goto(x*10, 10*x**2 - x*20)
def scene(t0):
while True:
move(1 * (time.time() - t0))
time.sleep(0.01)
turtle.update()
scene(time.time())
```
:::info
**Завдання**
Знайти де змінюється швидкість черепашки та збільшити швидкість у 10 разів.
:::
:::info
**Завдання**
Знайти місце, де написана формулу руху черепашки і змінити її параметри так, щоб виглядало як на малюнку:

:::
:::info
**Завдання**
Перевірити інші формули, подивитись як вони працюють:
- `turtle.goto(10*x, 100*math.sin(x))`
- `turtle.goto(10*x, 100 / x)`
- `turtle.goto(10*x, 100*(math.sin(x) + math.sin(2*x) + math.sin(7*x)) )`
- `turtle.goto(-x, -x)`
- `turtle.goto(10*x, 10*x + 5*math.sin(10*x))`
- `turtle.goto(100*math.sin(x), 100*math.cos(x))`
- `turtle.goto(100*math.sin(x), 100*math.cos(x)**2)`
- `turtle.goto(math.sin(x)*(10*math.sin(x) + x**2- 50), 100*math.cos(x)-x)`
- `turtle.goto(x*math.sin(x), x*math.cos(x))`
- `turtle.goto((int(x) % 10)*10, 0)`
Колір також можна змінювати по формулі, наприклад:
- `turtle.color(0, abs(math.sin(x)), abs(math.cos(7*x)))`
:::
:::info
**Завдання**:
- запам'ятати (або записати) як будуються найважливіші криві:
* пряма лінія — вміти її направляти в будь-яку сторону
* парабола — це крива польоту снаряду
* хвилька (синусоїда) — вміти міняти кількість гребенів (частоту), і розмір гребенів (амплітуду)
* коло — це рух повороту. Дуже важлива штука. Розуміти як міняти радіус
* спіраль
- розуміти, як направити криву у зворотньому або дзеркальному напрямку
- розуміти як управляти швидкістю анімації
- розуміти, що формулу можна поставити будь-де — навіть колір може бути по формулі, і формула може бути інша
(для кольору є обмеження, що кожен елемент R, G, B має бути >= 0 та <=1)
:::
## LVL 4. Many turtles + Random
Окрім руху по формулі, існує також хаотичний, випадковий рух. Для створення хаосу потрібно використати додаткові функції Пайтона:
- `import random` --- підключає рандом. Після того, як рандом підключено, можна запускати такі функції:
- `random.random()` --- випадкове число з 0 до 1, наприклад, 0.377. Може використовуватись у команді `turtle.color()`
- `random.randrange(a, b)` --- випадкове число >= a та < b. Наприклад, `random.randrange(10, 15)` може бути будь-яким з 10, 11, 12, 13, 14.
Щоб зробити нову черепашку, потрібно написати так:
```python=
carl = turtle.Turtle()
joe = turtle.Turtle()
```
Тепер `carl` та `joe` --- імена для двох черепашок. Кожну з них можна окремо рухати через, наприклад, `carl.forward(100)` та `joe.goto(-100, -100)`.
:::info
**Завдання**
Зробити багато черепашок, всі з яких рухаються по особливим правилам:
- всі черепашки мають різні імена
- всі черепашки мають різні кольори
- дві черепашки рухаються по формулі спіралі (по різним формулам)
- 5 черепашок рухаються у випадковому напрямку
- 1 черепашка рухається у випадкові точки екрану
- 1 черепашка завжди рухається вперед, але клавішами можна управляти напрямком її руху
- 1 черепашка, яка рухається фіксовано як п'ятикутна зірочка
Якщо натиснути пробіл (`"space"`), то всі шляхи всіх черепашок стираються і починають малюватись наново.
:::