---
# System prepended metadata

title: Черепашка. Структури даних
tags: [materials]

---

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

![](https://i.imgur.com/mSmih2v.gif)

### У попередніх серіях

#### [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()`. А для цієї команди нам потрібно усі букви алфавіту.

**Це завдання групове.** Кожен отримує як завдання список букв, які треба зробити черепашкою, і потім все це об'єднати у одну мега-програму АЛФАВІТ.

![](https://i.imgur.com/OzT2vRV.png)


**Деталі**:
- кожна буква повинна бути у своїй процедурі
- малюємо великі букви (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
**Завдання**

Знайти місце, де написана формулу руху черепашки і змінити її параметри так, щоб виглядало як на малюнку:
![](https://i.imgur.com/bs63rON.png)
:::

:::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"`), то всі шляхи всіх черепашок стираються і починають малюватись наново.
:::