К карте
ОСТРОВ ОБСЕРВАТОРИИ · PYTHON · КВЕСТ 5
Цвета созвездий
0
Прогресс0 / 6
СДЕЛАЙ ПЕРВУЮ КОМАНДУ

Нажми — и увидишь, что делает команда

Жми кнопки по очереди — это три настоящие команды.
ПЕРЕД СТАРТОМ
⏱ Сколько займёт
40–60 минут, 6 шагов. Каждый шаг заканчивается результатом на экране.
💻 Что нужно
Телефон или компьютер. Редактор открывается прямо в браузере, ставить ничего не надо.
⏸ Если прервёшься
Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
🎓 Чему научишься
списки · индексы · случайность
ШАГ 1 ИЗ 6 · ОСТРОВ ОБСЕРВАТОРИИ · КВЕСТ 5

Коробка на много значений

ЧТО ПРОИСХОДИТ
ЭПИЗОД 5Купол Обсерватории

Ночью купол раскрывается. Сова смотрит вверх и вдруг говорит: «Звёзды разного цвета. Заметил?»

Голубые — молодые и горячие. Красные — старые. Белые — посередине.

«Значит, цвет — это данные. А данные удобно держать не по одному, а списком».

Сова · звездочёт Обсерватории
ЧТО ПОЛУЧИТСЯ
ЗАПИСЬ ИСПОЛНЕНИЯ КОДА
Цвет каждой звезды программа берёт из списка по номеру. Поменяешь список — перекрасится всё созвездие.

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

КАПИТАН КВЕСТО
Читать текстом
Узорщик, переменная у тебя есть — но в неё влезает только одно значение. А если нужно хранить десять цветов? Заводить десять переменных? Так никто не делает. Есть список — коробка с отделениями, куда кладут сколько угодно значений подряд. И вторая вещь на сегодня — случайность: команда, которая делает программу каждый раз чуть другой. Вместе они дают то, чего раньше не было: рисунок, который не повторяется.

Соберём звёздное небо, где каждый запуск — новое созвездие.

spisok.py — как устроен список
1  # СПИСОК: много значений в одной коробке
2  
3  colors = ["gold", "orange", "white"]
4  
5  print(colors[0])   → gold   (счёт с НУЛЯ!)
6  print(colors[1])   → orange
7  print(colors[2])   → white
8  print(len(colors))  → 3   (сколько всего)

Список ты уже видел в «Спирали» — там из него брались цвета витков. Теперь разберём его как следует. Список пишется в квадратных скобках, значения через запятую. Берут из него по номеру — и вот тут главная ловушка: счёт идёт с нуля. Первый элемент это [0], а не [1]. Так во всех языках, привыкай сразу.

random.py — случайность
1  import random          # позвали случайность
2  
3  random.randint(1, 6)      # кубик: целое от 1 до 6
4  random.choice(colors)       # случайный ЭЛЕМЕНТ списка
5  
6  # каждый запуск даёт другой результат

Строка 1 обязательна: import random — без неё Python не знает этих команд. Дальше два инструмента: randint даёт случайное число в диапазоне, а choice вытаскивает случайный элемент из списка.

ШАГ 2 ИЗ 6 · СОБЕРИ НЕБО

Генератор созвездий

ПРОГРАММА НЕБА
12
Жми «Новое небо» — программа одна и та же, а созвездие каждый раз другое.

Нажми «Новое небо» несколько раз. Код слева не меняется ни на букву — а картинка каждый раз новая. Вот что делает random: одна программа, бесконечно много результатов.

Две новые команды черепашки penup() / pendown() поднять и опустить перо с поднятым пером черепашка едет, не оставляя следа goto(x, y) прыгнуть в точку по координатам dot(10) поставить точку — это и есть звезда Без penup() черепашка расчертит всё небо линиями по дороге

Про penup() забывают все и сразу видят результат: вместо аккуратных звёзд получается паутина из линий. Подними перо перед прыжками — и небо станет чистым.

НАШ РЕДАКТОР «PYTHON В КАРМАНЕ» — КУДА НАЖИМАТЬ
ТВОЙ ЭКРАН «PYTHON В КАРМАНЕ» — КУДА НАЖИМАТЬнажми на кружок — покажу место
Окно редактора
  • 1Верхние строки — место для списка цветовСюда впишешь import random и свой список: cveta = ["gold", "orange", "white"] — квадратные скобки, значения через запятую. Скобки и кавычки лежат в палитре «Знаки», а готовая кнопка import random — в палитре «Ещё».
  • 2Кнопка penup() — и рядом pendown()penup() поднимает перо: черепашка едет, но не рисует. Про неё забывают все и сразу видят результат — вместо аккуратных звёзд паутина из линий по всему небу. Прыгнул в новое место — опусти перо обратно кнопкой pendown().
  • 3Кнопка goto()goto(x, y) — прыжок в точку по координатам: центр холста это (0, 0), вправо и вверх числа растут. Саму звезду ставит dot(10) — вот этой кнопки в палитре нет, её печатают руками, она короткая.
  • 4Жёлтая кнопка ▶ Запустить — и ещё раз, и ещёЖми несколько раз подряд. Код не меняется ни на букву, а созвездие каждый раз другое — вот что делает random. Одна программа, бесконечно много результатов.
  • 5Холст — твоё небо целикомТут распахнётся всё созвездие. Небо вышло из линий, а не из точек — значит, забыл penup(). Все звёзды одного цвета — значит, random зовётся один раз до цикла, а надо внутри, на каждой звезде.
Отмечено:0 из 5

Это наш редактор «Python в кармане» со страницы /kod/ — открой её в соседней вкладке. На кадре он показан дважды: слева вкладка «Код», где ты пишешь, справа вкладка «Результат», куда программа переключится сама после запуска. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно.

ШАГ 3 ИЗ 6 · ПРОГРАММА ЦЕЛИКОМ

Небо в четырнадцать строк

nebo.py — звёздное небо
1  from turtle import *
2  import random
3  
4  speed(0); bgcolor("black"); hideturtle()
5  penup()                    # перо вверх, следов не будет
6  
7  colors = ["gold", "orange", "white"]
8  
9  for star in range(40):
10     x = random.randint(-250, 250)
11     y = random.randint(-180, 180)
12     goto(x, y)
13     color(random.choice(colors))
14     dot(random.randint(4, 14))   # разный размер звёзд

В строке 4 три команды написаны через точку с запятой — так тоже можно, это просто «три команды в одной строке»; обычно каждую пишут на своей. Дальше разбери по строкам: 10–11 выбирают случайное место, 12 прыгает туда, 13 берёт случайный цвет из списка, 14 ставит звезду случайного размера. Три случайности на каждую звезду — поэтому небо никогда не повторяется.

Настоящая запись — в нашем редакторе «Python в кармане», том самом, что открывается по кнопке ниже. Тот же код, тот же результат — и ставить ничего не надо

Небо рисуется по-настоящему. Тридцать звёзд появляются одна за другой: каждая в случайном месте, случайного цвета и размера. Фон чёрный — это строка bgcolor("black") в самом начале, без неё звёзды на белом почти не видно. Запустишь — получится другое небо.

Два способа взять цвет — и разница между ними colors[i % 3] ПО ОЧЕРЕДИ золотой, оранжевый, белый, золотой, оранжевый, белый… ровный повторяющийся ритм random.choice(colors) СЛУЧАЙНО белый, белый, золотой, оранжевый, белый… живой беспорядок, как в природе Для узоров лучше по очереди, для звёзд — случайно

Оба способа нужны, просто для разного. Ровный ритм [i % 3] хорош в узорах, где важна симметрия. А random.choice даёт естественный беспорядок — как настоящее небо, где звёзды разбросаны без системы.

Проверка · В списке 4 цвета. Какой номер у последнего?

4
3
5
Счёт с нуля: 0, 1, 2, 3. Четыре элемента — последний под номером 3.

Что случится, если забыть строку import random?

Программа выберет числа сама
Все звёзды встанут в центр
Ошибка NameError: Python не знает слова random
Ровно как с черепашкой в первом квесте: сначала инструмент надо достать из ящика.

Оба верных ответа — +10 дублонов.

ЭКСКУРС
КАК ЭТО УСТРОЕНО

Цвет — это тоже число

Компьютер не знает слова «красный». Он знает три числа: сколько красного, зелёного и синего. Из них собирается любой оттенок.

Поэтому цветом можно считать: сложить, усреднить, поменять по формуле. Так работают фильтры в телефоне и градиенты в играх.

А список цветов — это уже данные. Тот же приём, что и таблица очков: одна коробка, много значений, доступ по номеру.

ШАГ 4 ИЗ 6 · ТРЕНАЖЁР

Список закончился

nebo.py — падает на четвёртой звезде
1from turtle import *
2colors = ["gold", "orange", "white"]
3for i in range(10):
4 color(colors[i])
5 dot(8)
ЧТО ПИШЕТ PYTHON
IndexError: list index out of range
Три звезды нарисовались, четвёртая уронила программу

Три звезды нарисовались и всё оборвалось. IndexError — новая для тебя ошибка, но говорит она прямо: попросили элемент, которого в списке нет. Найди строку.

Два способа не выйти за границу списка colors[i % len(colors)] крутится по кругу, длина любая random.choice(colors) сам выбирает из существующих len(colors) — длина списка, считает Python С len() можно добавлять цвета в список — код чинить не придётся

Пиши len(colors) вместо числа 3 — и добавляй в список сколько угодно цветов, код останется рабочим. Это тот же приём, что с углом на «Розе ветров»: не вписывай руками число, которое можно посчитать.

ШАГ 5 ИЗ 6 · ДОРАБОТКА

Небо, в которое веришь

Приёмы, от которых картинка оживает · Разный размер звёзд — dot(random.randint(3, 14)) · Много мелких и мало крупных — так на настоящем небе · Луна: goto(180, 120) и dot(60) белым · Созвездие: соедини 5 точек линиями pendown() · Внизу тёмный силуэт гор — несколько треугольников Добавляй по одному приёму и каждый раз запускай

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

Созвездие: точки, соединённые линиями
1  # координаты звёзд созвездия — СПИСОК СПИСКОВ
2  constellation = [[-80, 60], [-20, 90], [40, 50], [70, -10], [20, -60]]
3  
4  penup()
5  goto(constellation[0][0], constellation[0][1])
6  pendown()          # перо вниз: линии рисуются
7  
8  for point in constellation:
9      goto(point[0], point[1])
10     dot(12, "gold")

Тут две новинки. Список списков: каждая звезда — пара координат в своих скобках. И цикл for точка in созвездие — он идёт прямо по элементам, без номеров. Часто так удобнее.

Судовой журнал — отметь сделанное:
Сделал список цветов
Подключил random и нарисовал случайные звёзды
Запустил дважды — небо получилось разное
Не забыл penup() — линий по дороге нет
Звёзды разного размера
Добавил луну или созвездие из точек
Сохранил картинку неба

Третья галочка — суть острова. Запусти программу дважды и убедись, что небо разное. Это первый раз, когда твоя программа даёт непредсказуемый результат — и это не поломка, а замысел.

ШАГ 6 ИЗ 6 · ФИНАЛ

Карта твоего неба

Задание: собственная карта звёздного неба · Фон-небо со случайными звёздами — 40 штук · Своя палитра из 3–5 цветов · Одно созвездие из 5–7 точек, соединённых линиями · Придумай ему имя и подпиши: write("Квесто", font=("Arial", 14)) · Для смелых: падающая звезда — линия под наклоном Созвездие придумай своё — хоть кота, хоть самолёт

Координаты созвездия удобно подобрать на бумаге в клетку: нарисуй фигуру, посчитай клетки от центра и перепиши числа в список. Так делают, когда рисуют по точкам что-то конкретное.

Как сдать работу: в «Python в кармане» код сохраняется сам — закрыл страницу, вернулся, и он на месте. Кнопки «поделиться» там нет и ссылки на твою работу тоже: покажи экран взрослому или пришли скриншот — этого достаточно. Поле выше нужно, только если ты писал в другом редакторе, который выдаёт ссылку. Запусти небо при зрителях несколько раз подряд. Каждый раз новое — и объясни, что это не разные программы, а одна и та же со случайностью. Обычно именно тут у людей меняется представление о том, что такое код.

КАПИТАН КВЕСТО
Читать текстом
Отличная работа! Ты собрал списки и случайность — два инструмента, без которых не обходится ни одна большая программа. Списки хранят что угодно: цвета, имена, координаты, счёт игроков. А случайность — это то, из-за чего игры интересно переигрывать. Дальше научимся давать имя целому куску кода: напишешь один раз, а вызывать будешь строчкой. С этого места твои программы перестанут быть простынёй и станут аккуратными.

Жми — Гильдия отметит пятый остров Обсерватории.

Небо готово!

Пятый артефакт: списки и случайность — небо, которое каждый раз новое. Бейдж «ЗВЕЗДОЧЁТ-ПОДМАСТЕРЬЕ» твой. Дальше — свои функции.

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

🏅 Забрать диплом Следующий квест: Своё заклинание Вернуться на карту экспедиции
🔒

Этот остров ещё закрыт

Сначала пройди предыдущий квест — хотя бы просмотри все шаги.

⚑ Экспедиционный режим