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