Найти в Дзене

ЮНЫМ ПРОГРАММИСТАМ: Ёлки!

Давайте напишем программу на Питоне, которая рисует на экране компьютера много-много ёлок – тайгу. Понятно, что ёлки мы будем размножать с помощью оператора цикла. Равномерно по всему экрану. Это может быть одна и та же ёлка, просто размноженная. Значит, надо рассчитать саму ёлку. Мы будем исходить из экрана компьютера с разрешением 1920х1080. Но предусмотрим, если вдруг кто-то захочет запустить нашу программу на другом мониторе, например: 1280х1024. На нашем мониторе 1920х1080 пусть ёлка будет иметь размер примерно 1 см. Как изменить его, Вы поймёте и сможете сделать это самостоятельно. Надо спроектировать ёлку. Не будем сильно заморачиваться и придумаем вот такую ёлку. Масштаб увеличен: Значит, наша ёлка состоит из ствола и 10 ветвей: 5 налево, 5 направо. Для некоторой красоты сделаем ветви книзу немного расширяющимися. Ёлку будем привязывать к корню. Значит, у корня будут координаты (x, y). От корня идёт ствол. Какой длины? Ну, если ёлка должна быть примерно 1 см, то пусть ствол буд

Давайте напишем программу на Питоне, которая рисует на экране компьютера много-много ёлок – тайгу.

Понятно, что ёлки мы будем размножать с помощью оператора цикла. Равномерно по всему экрану. Это может быть одна и та же ёлка, просто размноженная. Значит, надо рассчитать саму ёлку. Мы будем исходить из экрана компьютера с разрешением 1920х1080. Но предусмотрим, если вдруг кто-то захочет запустить нашу программу на другом мониторе, например: 1280х1024.

На нашем мониторе 1920х1080 пусть ёлка будет иметь размер примерно 1 см. Как изменить его, Вы поймёте и сможете сделать это самостоятельно.

Надо спроектировать ёлку. Не будем сильно заморачиваться и придумаем вот такую ёлку. Масштаб увеличен:

Значит, наша ёлка состоит из ствола и 10 ветвей: 5 налево, 5 направо. Для некоторой красоты сделаем ветви книзу немного расширяющимися. Ёлку будем привязывать к корню. Значит, у корня будут координаты (x, y). От корня идёт ствол. Какой длины? Ну, если ёлка должна быть примерно 1 см, то пусть ствол будет длиной 33 пикселя. Значит, координаты вершины ствола, оно и ёлки – (x, y - 33):

-2

Координаты концов веток предложим такие:

-3

Ёлка готова. Она может быть нарисована операторами line:

c.create_line(x, y, x, y-33, fill='green', width = 2) # ствол

c.create_line(x, y-33, x-4, y-28, fill='green', width = 2) # 1 лев.ветка

c.create_line(x, y-33, x+4, y-28, fill='green', width = 2) # 1 прав.ветка

c.create_line(x, y-27, x-5, y-22, fill='green', width = 2) # 2 лев.ветка

c.create_line(x, y-27, x+5, y-22, fill='green', width = 2) # 2 прав.ветка

c.create_line(x, y-21, x-7, y-16, fill='green', width = 2) # 3 лев.ветка

c.create_line(x, y-21, x+7, y-16, fill='green', width = 2) # 3 прав.ветка

c.create_line(x, y-15, x-9, y-10, fill='green', width = 2) # 4 лев.ветка

c.create_line(x, y-15, x+9, y-10, fill='green', width = 2) # 4 прав.ветка

c.create_line(x, y-9, x-11, y-4, fill='green', width = 2) # 5 лев.ветка

c.create_line(x, y-9, x+11, y-4, fill='green', width = 2) # 5 прав.ветка

c.create_line – означает «на холсте c создать линию»,

fill – указать каким цветом, в данном случае green – зелёным,

width – толщина линии, пусть 2, чтобы ёлки были потолще, попушистее.

# – комментарий – не выполняется компьютером.

Но чему равны x и y? Мы хотим, чтобы ёлки росли по всему экрану. А может быть сделать ещё небо? Давайте сделаем ещё ночное небо. Пусть по нему будут звёзды и Луна. Тогда надо оставить часть экрана под небо. Сверху – полоса неба, ниже – всё в ёлках. Выделим под небо полосу: по горизонтали слева от 0 до 1920 направо, по вертикали сверху от 0 до 280 вниз, под ёлки – по горизонтали от 0 до 1920, по вертикали от 320 до 1080 самого низа экрана. Значит, корни ёлок (x, y) должны генерироваться так:

x = random()*1920; y = random()*760+320 # генерация места корня ёлки

random() принимает значения из полуинтервала [0; 1), значит, x будет от 0 до почти 1920, а y от 320 до почти 760 + 320 = 1080. Всё правильно, как хотели.

Сколько будет ёлок? Пусть 1000. Тогда блок генерации и рисования ёлок тысячу раз будет выглядеть с помощью оператора повторения, оператора цикла for, так:

# ГЕНЕРАЦИЯ И РИСОВАНИЕ ЁЛОК

for i in range(1000):

x = random()*1920; y = random()*760+320 # генерация места корня ёлки

c.create_line(x, y, x, y-33, fill='green', width = 2) # ствол

c.create_line(x, y-33, x-4, y-28, fill='green', width = 2) # 1 лев.ветка

c.create_line(x, y-33, x+4, y-28, fill='green', width = 2) # 1 прав.ветка

c.create_line(x, y-27, x-5, y-22, fill='green', width = 2) # 2 лев.ветка

c.create_line(x, y-27, x+5, y-22, fill='green', width = 2) # 2 прав.ветка

c.create_line(x, y-21, x-7, y-16, fill='green', width = 2) # 3 лев.ветка

c.create_line(x, y-21, x+7, y-16, fill='green', width = 2) # 3 прав.ветка

c.create_line(x, y-15, x-9, y-10, fill='green', width = 2) # 4 лев.ветка

c.create_line(x, y-15, x+9, y-10, fill='green', width = 2) # 4 прав.ветка

c.create_line(x, y-9, x-11, y-4, fill='green', width = 2) # 5 лев.ветка

c.create_line(x, y-9, x+11, y-4, fill='green', width = 2) # 5 прав.ветка

К сожалению, здесь в статье будут не видны отступы. А без них программа работать не будет. Все отступы вы увидите на фото, приведённом ниже.

Теперь звёзды. Сколько будет звёзд? Пусть 130. Известно, что звёзды имеют различный блеск. Мы, конечно, не будем рисовать какие-то точные созвездия с точным соблюдением блеска звёзд. Условимся, пусть ярких звёзд будет 25%, а остальные – слабые. Яркие будут иметь и размер побольше, и цвет поярче – white, а слабые будут мелкими и серыми – gray.

Звезду будем рисовать в виде кружка с помощью оператора oval:

c.create_oval(x-1, y-1, x+1, y+1, fill='white', outline='white') # яркая звезда

c.create_oval(x, y, x, y, fill='gray', outline='gray') # слабая звезда

outline – цвет окантовки кружка.

Здесь видно, что размеры яркой звезды (x+1) – (x-1) = 2; (у+1) – (у-1) = 2 – два.

Размеры слабой звезды х – х = 0; у – у = 0 – ноль.

Ясно, что 130 звёзд надо 130 раз сгенерировать и нарисовать тоже с помощью оператора цикла for. Но как for будет знать какую звезду генерировать: яркую или слабую?

Для этого используем оператор условия if и random(). Раз мы условились, что ярких звёзд будет 25%, то если random() примет значение меньше 0,25, то значит будем генерировать яркую звезду. Иначе – слабую. На Питоне это будет выглядеть так:

# ГЕНЕРАЦИЯ И РИСОВАНИЕ ЗВЁЗД

for i in range(130):

x = random()*1920; y = random()*280 # генерация места звезды

if random() < .25:

c.create_oval(x-1, y-1, x+1, y+1, fill='white', outline='white') # яркая звезда

else:

c.create_oval(x, y, x, y, fill='gray', outline='gray') # слабая звезда

Теперь Луна. Луну надо нарисовать некоторого размера. Например, в фазе «молодой Месяц». Как нарисовать серп? Сначала нарисуем жёлтый круг, а на него наложим, немного сдвинув, чёрный круг, он отъест от жёлтого круга часть и останется «молодой Месяц». Да, внутренняя граница Месяца вообще-то является полуэллипсом, а не полуокружностью, но мы такими тонкостями будем пренебрегать.

Луну надо рисовать после звёзд, иначе звёзды будут накладываться на Луну, что глупо. Поскольку звёзд много и все они всё-таки достаточно заметны, то много звёзд окажется слишком близко к Луне. Да, в жизни возле Луны бывают близко видны звёзды. Она даже иногда проходит по ним, покрывает их. Но, как правило, это довольно яркие звёзды, а их в жизни очень мало. Близость же слабых незаметна. Поэтому в жизни Луна обычно видна в одиночестве. Чтобы и у нас Луна смотрелась максимально правдоподобно, налепим сначала на наше звёздное небо чёрный кружочек немного больше Луны, а уже на него Луну. Луну поместим где-то в небе, например, с координатами (1100; 110). Радиус Луны выберем 15. На Питоне Луна будет выглядеть так:

# РИСОВАНИЕ ЛУНЫ

c.create_oval(1100-60, 110-60, 1100+60, 110+60, fill='black', outline='black') # кружок

c.create_oval(1100-15, 110-15, 1100+15, 110+15, fill='light yellow', outline='white') # луна

c.create_oval(1095-15, 108-15, 1095+15, 108+15, fill='black', outline='black') # невидимая часть луны

Вот, собственно, и вся картинка спланирована.

Понятно, что графические операторы, random() работать не будут без блока вызова графики и прочих нюансов. Эти обслуживающие команды мы выпишем в начало программы в блоке «ПОДГОТОВКА ГРАФИКИ». И мы хотели, чтобы картинка рисовалась и на других мониторах с иным разрешением. Для этого в блоке «ПОДГОТОВКА ГРАФИКИ» введём масштабные коэффициенты p и v соответственно по горизонтальной и вертикальной оси экрана. К сожалению, эти p и v придётся влепить куда надо и не надо – во все наши ёлки, звёзды и Луну. Они безусловно загромоздят текст программы, но что делать?

В итоге с кое-какими небольшими доработками получается программа:

-4
-5

Вы можете набрать её по приводимому фото. Точь-в-точь, соблюдая все отступы, иначе она работать не будет. Программа небольшая, благо строчки повторяются, их можно копировать и вставлять как в Worde, а символы # и всё после них можно вообще не набирать – это комментарии. А можете скачать текст программы по ссылке:

https://disk.yandex.ru/d/ozW0OUiBhBWKLQ

Вставьте текст программы в редактор Питона. Запустите программу. Вы увидите картинку:

-6

Поверьте, картинка, нарисованная этой программой на Вашем мониторе, намного эффектнее, чем здесь в статье.

Вы можете менять текст программы, менять разные числа – изменять число и форму ёлок, звёзд, Луну. Не советую только лезть в блок «ПОДГОТОВКА ГРАФИКИ» пока толком не разберётесь в нём.

Продолжением идеи ёлок является мультфильм "Тайна дремучего леса", который можно скачать по ссылке https://disk.yandex.ru/i/gsjA70GLI5YI8Q

Творческих успехов Вам в программировании!