Перевод с английского
Станислава Ломакина
Москва
«Манн, Иванов и Фербер»
2018
УДК 087.5:004.43 Penguin
ББК 39.973.26-018.1 Random
П78 House
ISBN 978-5-00117-399-1
ISBN 978-5-00117-399-1
КЭРОЛ ВОРДЕРМАН — одна из самых популярных британских телеведущих,
известная своими познаниями в математике, кавалер ордена Британской
империи. Вела телешоу, посвященные науке и технике, такие как Tomorrow's
World и How 2. На протяжении 26 лет была соведущей интеллектуальной
математической телеигры Countdown. Кэрол — выпускница Кембриджа,
она страстно увлекается популяризацией науки и программирования.
ЗНАКОМСТВО С PYTHON
12 Программирование
14 Знакомься: Python
16 Установка Python
18 Работа с IDLE
ЧЕРЕПАШЬЯ ГРАФИКА
72 «Сборщик роботов»
82 «Радуга-пружинка»
ПЕРВЫЕ ШАГИ 90 «Звездное небо»
24 Переменные
28 Принятие решений
32 Циклы
36 Тест «Животные»
ЗАБАВНЫЕ
ПРОГРАММЫ
44 Функции
158 «Гусеница»
168 «Снэп»
180 «Мемори»
190 «Яйцелов»
СПРАВОЧНЫЕ
МАТЕРИАЛЫ
220 Глоссарий
КЭРОЛ ВОРДЕРМАН
Знакомство
с Python
Программирование
Программист — это человек, составляющий
инструкции для компьютеров. Он может придумать
такую программу, которая будет сама писать
музыку, или управлять домашним роботом,
или отправлять на Марс космические корабли.
Я зы ки п р о г р а м м и р о в а н и я
Чтобы посылать компьютеру команды, нужно
освоить какой-нибудь язык программирования.
Визуальные языки хороши для новичков,
а профессионалы используют текстовые языки.
В этой книге мы расскажем о Python — популярном
текстовом языке программирования.
Scratch Python
Scratch — это визуальный язык программирования. Он подходит Python — это текстовый язык программи
для создания игр, мультфильмов и интерактивных мультимедийных рования. Программы на Python состоят
проектов. Код на Scratch составляют из разноцветных командных из слов, букв, чисел и других символов.
блоков. Чтобы ввести код, программисты набирают
его на клавиатуре.
СЛЕНГ
Баги
Н ачни п р о гр а м м и р о в а ть
Багами называют ошибки в коде, Программирование может показаться
из-за которых программы работают
непростым делом, но учиться программи
неверно. Слово bug переводится как «жук».
Дело в том, что первые компьютеры порой ровать легко — надо лишь начать. Эта книга
сбоили из-за насекомых, застрявших предлагает тебе попробовать свои силы
между контактами. в несложных проектах. Приступай к созда
нию игр и приложений прямо сейчас!
Знакомься: Python СЛЕНГ
О тк уд а н а зв а н и е ?
Python — один из самых популярных Python был назван вовсе не в честь
языков программирования. Появился питона, а в честь британской комик-
он в 1990-х годах, а сейчас на нем работают группы «Монти Пайтон». Создатель
языка Гвидо ван Россум — ее большой
миллионы приложений, игр и веб-сайтов. поклонник. Python-программисты
часто отдают этому должное
и включают в код шутки и цитаты
П о ч е м у P y th o n ? из телепередачи «Летающий цирк
Python отлично подходит для знакомства Монти Пайтона».
с программированием. Его изучают во многих
школах и университетах. Вот несколько причин
его популярности. Батарейки в комплекте
«Батарейки в комплекте» — говорят
программисты про Python, потому что
вместе с языком в установочных файлах
имеется все необходимое, чтобы сразу
приступить к программированию.
Удобные инструменты
Python укомплектован множеством полезных
инструментов и готовых фрагментов кода,
вместе составляющих стандартную библиотеку.
С ее помощью писать программы гораздо проще.
Отличная поддержка
Работает везде Python отлично докумен
Код на Python является переносимым: его можно тирован. Документация
писать и запускать на самых разных компьютерах. включает руководство
Один и тот же код подходит для операционных для начинающих, справоч
систем Windows, macOS, Linux и даже Raspberry ный раздел и множество
Pi: он везде работает одинаково. примеров кода.
P y th o n в д е й с т в и и СОВЕТЫ ЭКСПЕРТА
Python применяют для решения Интерпретатор
множества интересных задач в области
бизнеса, науки и техники. Например, Многие языки программирования используют
интерпретатор — специальную программу,
с помощью программ, написанных
переводящую команды одного языка на другой.
на Python, можно управлять освеще При каждом запуске Python-программы интерпре
нием и температурой в доме. татор строка за строкой превращает ее в особый,
понятный компьютеру машинный код.
Python и интернет
Python широко используется в сети
Интернет. На нем написаны части
поискового движка Google. YouTube
по большей части тоже работает
на Python.
Чудеса медицины
На Python пишут программы для роботов,
выполняющих сложные хирургические операции.
Робот-хирург может работать быстрее и точнее
Серьезный бизнес человека, при этом вероятность, что он допустит
Python помогает банкам следить за средствами ошибку, меньше.
на счетах вкладчиков, а сетевым магазинам —
устанавливать цены на товары.
На большом экране
На студии Disney Python помогает автоматизировать
Другие миры шаблонные задачи. Вместо того чтобы снова и снова
В Центре управления полетами NASA Python- рисовать однотипные кадры, аниматоры поручают
программы помогают космонавтам готовиться такую работу программе. Это значительно сокращает
к полетам и отслеживать ход экспедиций. время работы над мультфильмом.
Установка Python IDLE
СЛЕНГ
Для всех проектов в этой книге требуется IDLE — это бесплатная среда
Python 3. Скачай эту версию программы разработки, предназначенная
и следуй инструкциям, подходящим для для начинающих программистов.
Она устанавливается вместе
операционной системы твоего компьютера. с Python и включает в себя
простой текстовый редактор
для ввода и редактирования
P y t h o n д л я W in d o w s команд.
Прежде чем устанавливать Python 3 для Windows, узнай,
32-битная или 64-битная у тебя система. Кликни «Пуск»,
правой кнопкой мыши кликни «Компьютер» и выбери
«Свойства». Выбери «Система», если такая опция появится.
Запусти инсталлятор
Сделай двойной клик по значку инсталлятора. Если у тебя 32-битная Если у тебя 64-битная
Выбери «Установить для всех пользователей», версия Windows, выбери версия Windows, выбери
кликни «Далее», не меняя настроек по умолчанию. этот инсталлятор. этот инсталлятор.
Это номер
версии Этот текст
Python. будет зависеть
от того, какая
у тебя опера
ционная
Вводи код система.
после знака
приглашения
>>>
Вводи код здесь. В верхней части окна Этот пункт меню позволяет
Эта программа отображается имя файла. запустить программу.
выдает список Меню окна программы
чисел, помечая отличается от меню
каждое как четное окна консоли.
или нечетное.
Это команда
print — с ее по
мощью результат
работы кода вы
водится на экран.
СОВЕТЫ ЭКСПЕРТА
Запусти IDLE
К а к это р аб о тае т После запуска IDLE появится окно консоли.
Программа выведет на экран фразу «Привет, Зайди в меню File и выбери New File —
мир!», а затем спросит, как тебя зовут. После откроется пустое окно программы,
в котором можно вводить код.
ввода имени она снова поздоровается,
но уже обратится к тебе лично. Программа
запоминает имя с помощью переменной.
В программировании переменные служат
для хранения информации.
Блок-схема программы
«Привет, мир!»
При написании кода програм
мисты используют особую
диаграмму — блок-схему.
Каждый шаг программы показан
на ней в виде блока со стрелкой, Введи первую строку
ведущей к следующему блоку. Введи строку кода, показанную ниже.
Если шаг соответствует вопросу, Слово print — это команда, которая
от него может идти несколько выводит на экран данные. В нашем
стрелок, означающих разные случае — фразу «Привет, мир!».
ответы.
Сохрани файл
Открой меню File и выбери Save
(«Сохранить»).
Заверши сохранение
СЛЕНГ
Появится диалоговое окно. Введи название файла на английском
helloworld.py («привет, мир») и кликни Save. файлы .ру
Имена Python-программ
обычно оканчиваются
на «.ру», чтобы их легче
Введи здесь было отличать от других.
название При сохранении кода IDLE
программы автоматически добавляет
на английском.
к имени «.ру», так что вводить
это расширение необязательно.
Проверь код
Запусти первую строку, чтобы
проверить, работает ли программа.
Для этого открой меню Run и выбери
Run Module («Запустить модуль»).
В окне консоли должно появиться
сообщение «Привет, мир!».
Исправь ошибки
СОВЕТЫ ЭКСПЕРТА
Если код не работает, сохраняй
спокойствие! Все программисты Горячие клавиши
допускают ошибки. Чтобы стать
настоящим профессионалом, нужно Запустить код в окне программы
уметь находить баги. Проверь свой можно, нажав клавишу F5. Так
код: не пропустил ли ты скобки? получится гораздо быстрее, чем
Правильно ли введена команда открывать меню Run и выбирать
print? Исправь ошибки и снова Run Module.
запусти программу.
Последний шаг
Привет, мир!
Запусти программу в окне консоли. Введи свое имя
Как тебя зовут? Дима Имя
и нажми ENTER — должно появиться приветствие
пользователя.
с обращением. Ура, ты написал свою первую Python- Привет, Дима
программу! Продолжай в том же духе!
Переменные
Чтобы программа могла воспользоваться данными,
они должны где-то храниться. Для этого и существуют
переменные. Они нужны для самых разных действий:
от подсчета очков в игре до создания списков.
Присвой значение
>>> age = 12
Чтобы создать переменную age
(«возраст») и присвоить ей значение,
Имя переменной.
введи в окне консоли эту строку кода.
СОВЕТЫ ЭКСПЕРТ А
Имена переменных
Переменным нужно давать понятные Как можно и как нельзя
имена, чтобы программу было легче • Имя переменной должно начинаться с латинской буквы.
читать. Например, переменную для • Имя может состоять из цифр и латинских букв.
учета жизней игрока лучше назвать • Не используй символы вроде -, /, # или
lives_remaining («оставшиеся жизни»),
• Не ставь пробелы.
а не просто lives («жизни») или
сокращенно lr. Имена могут • Пробел можно заменить подчеркиванием ( _ ) .
содержать цифры, латинские буквы • Регистр букв имеет значение. Python будет считать Score
и знак подчеркивания, однако в начале и score двумя разными переменными.
всегда должна стоять буква. Следуй • Не называй переменные так же, как ключевые слова
этим правилам, и все будет в порядке. Python, например print.
СЛЕНГ
Целые и вещественные числа
В программировании используются два
типа чисел: целые и вещественные.
Вещественные числа — это десятичные
дроби, которые записываются через точку.
Целые числа хороши для подсчета чего- 0.5 овечки
либо, а вещественные — для измерений. 1 овечка (целое число) (вещественное число)
Реши пример
>>> х = 6
Введи этот код в окне консоли. В нем
используются две переменные: х хранит >>> у = х * 7
число, а у — произведение двух чисел. >>> p r in t ( y )
Нажми ENTER, чтобы получить ответ.
42
Обнови значение
>>> х = 10
Чтобы получить правильный ответ, значение
у нужно обновить. Для этого добавь в код >>> у = х * 7
эту строчку. Теперь после изменения х >>> p r in t ( y )
переменная у примет новое значение.
70
Р аб о та со с т р о к а м и
Строками программисты называют данные,
состоящие из букв, пробелов и других знаков.
Строки используются почти в каждой про
грамме. Это могут быть слова, предложения
или просто набор символов — тех, которые Строка — это набор символов.
Строковые переменные
>>> name = 'инопланетянин Ино'
Строки можно хранить в переменных. Введи
этот код в окне консоли: он помещает строку >>> p r i n t ( name)
'инопланетянин Ино' в переменную name инопланетянин Ино
(«имя»), а затем выводит ее на экран. Строки
всегда нужно брать в кавычки — двойные
или одинарные. Нажми ENTER, чтобы
вывести строку на экран. Не забывай
про кавычки.
Склеивание строк
>>> name = 'инопланетянин Ино'
Значения переменных часто объединяют
для получения новых значений. Результат >>> g re e tin g = 'Привет, '
объединения (склейки) двух строк можно >>> message = g re e tin g + name
поместить в новую переменную. Попробуй
ввести в окне консоли этот код. >>> p rin t(m e ssag e)
Привет, инопланетянин Ино
СОВЕТЫ ЭКСПЕРТА
Знак + склеивает
Длина строки При выводе строки строки.
на экран кавычки
Для подсчета количества символов в строке не отображаются.
(включая пробелы) есть удобная команда
len() (сокр. от length — «длина»). По сути,
len() — это так называемая функция (ты
будешь часто пользоваться функциями,
работая над проектами из этой книги).
Чтобы узнать длину строки 'Привет,
инопланетянин Ино', введи этот код
после объявления переменной message
(«сообщение») и нажми ENTER.
>>> len(message)
25
Количество
символов в строке.
С пи ски
Сохранить сразу несколько данных (особенно
если важен их порядок) поможет список.
Каждому его элементу Python присваивает
номер, означающий позицию в списке.
Содержимое списка можно изменять как
угодно и когда угодно.
Не много ли переменных?
>>> rockets_player_l = 'Рома'
Представь, что ты пишешь программу
для многопользовательской игры и хочешь >>> rockets_player_2 = 'Игорь'
сохранить в ней имена игроков двух >>> rockets_player_3 = 'Алена'
команд. Можно создать для каждого
>>> planets_player_l = 'Миша'
имени по переменной, примерно так...
>>> planets_player_2 = 'Павел'
Создай список
>>> ro c k e ts _ p la y e rs = ['Р о м а ', 'И го р ь',
...но что если в каждой команде окажется
шесть игроков? Тебе будет нелегко уследить 'А л е н а ', 'Р е н а т а ', 'Саш а', 'Л ена']
за таким количеством переменных. Гораздо ,>>> p la n e ts _ p la y e rs = ['Миша', 'П авел',
проще создать список. Для этого укажи
элементы, которые в нем будут храниться, 'Полина', 'Н а с т я ', 'А н я ', 'Леша']
внутри квадратных скобок.
Этот список хранится в переменной Элементы списка нужно
planets_players («игроки команды разделять запятыми.
“Планеты”»).
Так можно получить
значение первого элемента
списка (в позиции 0).
Вопросы и ср авн ен и я
Вопросы, которые задает себе компьютер, обычно
подразумевают сравнение чего-то с чем-то. Например,
больше ли одно число другого. Если это так, программа
выполняет один блок кода, если нет — другой.
Сравнения
>>> zeb ras < pineap p les
Введи следующие строчки кода, чтобы сравнить
значения двух переменных. В конце каждой строки True
нажимай ENTER, и Python сообщит, истинно это
выражение (True) или ложно (False). Зебр меньше, чем ананасов.
Логическая операция,
>>> age = 10 означающая «старше
Присваивают значения >>> heigh t = 1 .5 8 лет и выше 1,4 метра:
переменным.
>>> (age > 8) and (h e ig h t > 1 .4 )
True
В етвлен и е
Компьютеру часто приходится решать, какую часть
кода выполнять дальше: ведь большинство программ
при разных условиях должны работать по-разному.
Работа программы похожа на путешествие по дороге
с развилками, когда от выбора направления зависит,
в какое место ты попадешь.
Множество путей
w eather = in p u t ('К а к а я сегодня погода? (дож дь/снег/солнце)')
Когда нужно больше двух
ветвлений, на помощь при Первое условие.
ходит конструкция elif (сокр. i f weather == 'дож дь': Этот блок кода выполнится,
от else-if— «еще-если»). если первое условие вернет
p r in t ('H e забудьте з о н т и к !') True.
Этот код спрашивает, какая
сегодня погода: дождь, снег e l i f weather == 'с н е г ':
или солнце. Затем он выбирает p r in t ('H e забудьте вареж ки!') Второе условие.
один из трех путей и выводит
e ls e :
на экран подходящий совет.
p r i n t ('Н е забудьте солнечные о ч к и !')
Цикл for
Если ты знаешь, сколько раз программе нужно
выполнить блок кода, тебе подойдет цикл for («для»).
Эмма написала код, который десять раз выводит
на экран «Тайный штаб Эммы О ' Брайен!», чтобы потом
распечатать этот текст и повесить его на дверь. Попробуй
запустить ее программу в окне консоли. (Введи строки
кода и нажми ENTER, сотри пробелы, которые
добавятся автоматически, и снова нажми ENTER.)
>>> fo r counter in ra n g e (1 , 1 1 ):
p r i n t ( 'Тайный штаб Эммы 0 \ ' Брайен! ' )
Ц и к л w h ile
А что если ты не знаешь, сколько раз программе
нужно повторить блок кода? Может, стоит
заглянуть в хрустальный шар и увидеть будущее?
Нет, просто воспользуйся циклом w hile («пока»).
Условие цикла
У цикла while нет переменной, которая перебирает все
значения, зато у него есть условие — логическая операция,
возвращающая True или False. Работа цикла while похожа
на работу билетного контролера. Если у тебя есть билет
(True), он тебя пропустит в зал, а если нет (False), то ты
не сможешь войти. В нашем случае если условие цикла
не вернет True, программа не сможет войти в цикл!
Башня из бегемотов
Ахмед написал программу, которая считает количество
бегемотов в акробатической пирамиде. Изучи код
и постарайся разобраться, как он работает.
>>> hippos = 0
>>> answer = 'д '
Эта строка кода выводит на экран
>>> w h ile answer == ' д ' : сообщение о количестве бегемотов
hippos = hippos + 1 в акробатической пирамиде.
Ответ пользователя
Добавляет еще p r i n t ( ' Бегемотов в пирамиде: ' + s t r (h ip p o s ))
становится новым
одного бегемота. answer = in p u t( 'Добавить бегемота? (д /н ) ') значением перемен
ной answer («ответ»).
Как это работает
В коде Ахмеда условием цикла служит
логическая операция answer == 'д'. Если
она возвращает True, значит, пользователь
хочет добавить бегемота. Тогда в теле
цикла количество бегемотов увеличива
ется на 1 и на экран выводится вопрос,
нужно ли добавить еще одного бегемота.
Если пользователь отвечает «да» (д),
условие цикла возвращает True, и цикл
повторяется. А если «нет» (н), условие
возвращает False, и программа выходит
из цикла.
>>> w h ile T ru e :
answer = in p u t('Я тебе надоела? (д /н ) ')
i f answer == ' д ' : Если пользователь
введет 'д', запустится
p r i n t ('К а к невежливо!')
блок кода с командой
break break.
Ц икл в н у т р и ц и к л а СОВЕТЫ ЭКСПЕРТА
Может ли один цикл находиться в теле Отступы в теле цикла
другого цикла? Да! Такой вложенный
цикл похож на матрешку, куклы которой Строки кода, составляющие тело цикла, нужно
вводить с отступом в 4 пробела, иначе Python
вставляются одна в другую. Получается,
выдаст ошибку и программа не запустится.
что внутренний цикл запускается внутри А если цикл вложен в другой, тело внутреннего
внешнего цикла. цикла должно идти с отступом еще в 4 пробела.
Обычно IDLE ставит отступы автоматически,
но ты все равно не забывай проверять количество
пробелов в начале каждой строки.
Цикл в цикле
>>> for pobeda_counter in range(l, 4):
Эмма переделала свой код
про тайный штаб так, чтобы for ura_counter in range(1, 3): Тело внешнего цикла
идет с отступом
программа трижды выводила print('ypa') в 4 пробела.
на экран «ура, ура, победа!».
Поскольку в этой фразе два print('победа!')
слова «ура», Эмма решила
использовать вложенный цикл. Переменная внутреннего цикла — Тело внутреннего цикла идет
ura_ counter. с отступом в 8 пробелов.
ура
pobeda_counter = 1 ура ura_co u n ter = 1
Что п р о и с х о д и т
Программа задает игроку вопросы про животных.
Для ответа на каждый из них отводится три попытки —
тест не стоит делать чересчур сложным! За каждый
правильный ответ начисляется 1 очко. В конце теста
Так выглядит игровой
программа показывает счет игрока. тест в окне консоли.
Вызов функции
Чтобы воспользоваться
функцией, ее надо вызвать,
написав имя и поставив скоб
ки. Для нашего теста тебе
предстоит создать функцию,
которая будет сравнивать
ответ игрока с правильным,
и вызвать ее несколько раз —
после каждого вопроса.
СЛЕНГ
Регистр букв
Сравнивать ответ игрока с правильным
нужно без учета регистра букв: не важно,
прописными он будет написан или строчными,
лишь бы слова совпадали. Это уточнение
подходит не для всех случаев: если программа,
проверяющая пароль, не учитывает регистр
букв, подобрать пароль злоумышленнику
станет легче. Но в нашем тесте слова «Гепард»
и «гепард» лучше считать одинаковыми.
П р и сту п и м к н а п и с а н и ю
Пришло время написать код для игрового теста!
Сперва нужно ввести вопросы и создать механизм
проверки ответов. Затем — добавить код, позволя
ющий игроку отвечать на каждый вопрос три раза.
Запусти программу
Запусти программу. Для этого
открой меню Run и выбери
Run Module. В окне консоли
должно появиться название
игры.
Проверь ответ
guess1 = in p u t ('Какой медведь живет за полярным кругом? ')
Добавь в конец программы
вызов функции check_guess(). ch e ck_g u ess(g u e ss1 , 'белый медведь')
Ее первым аргументом должен
быть ответ игрока, а вторым —
правильный ответ «белый
медведь».
Тест «Животные»
Какой медведь живет за полярным кругом? белый медведь
Ответ верный
Какое сухопутное животное самое быстрое? ГЕПАРД
Ответ верный
Какое животное самое большое? СиНиЙ кИт
Ответ верный
Вы набрали очков: 3 При проверке ответов регистр
букв не учитывается.
Дай игроку больше попыток
Сейчас у игрока есть только один шанс угадать
животное. Можно облегчить ему жизнь
и подарить не одну, а три попытки. Измени
функцию check_guess() так, как показано ниже.
sco re = sco re + 1
s t ill_ g u e s s in g = F a ls e Конструкция else позволяет игроку дать другой
ответ на тот же самый вопрос, если он не смог
e ls e : ответить правильно с первого раза.
i f attempt < 2:
guess = in p u t('О тв е т неверный. Попробуйте еще раз. ')
attempt = attempt + 1
Прибавляет 1 к количеству
использованных попыток.
i f attempt == 3:
p r i n t ( ' Правильный о тв е т: ' + answer)
Выводит на экран правильный ответ
после трех неудачных попыток.
score = 0
Сделай длиннее
Добавь в свой тест еще несколько вопросов.
Например: «У какого животного есть длинный
хобот?» (слон), «Какое млекопитающее умеет
летать?» (летучая мышь). Или посложнее:
«Сколько сердец у осьминога?» (три).
ЗАПОМНИ
Перевод строки
Вопросы с вариантами ответов
guess = in p u t('К ако е из этих животных рыба?\п \
лучше смотрятся, если ответы
стоят в столбик, как в примере 1) Кит\п 2) Дельфин\ п 3) Акула\п 4) Кальмар\ п \
справа. Набрать текст с новой Введите 1, 2 , 3 или 4 . ')
строки позволяет символ \п.
ch e ck _g u e ss(g u e ss, ' 3 ' )
Измени сложность
def check_g u ess(g uess, answ er):
Чтобы усложнить тест, уменьши
количество попыток ввода. Если glo bal score
это ответ типа «да — нет», не стоит s t ill_ g u e s s in g = True Измени это число.
давать игроку больше одной
попытки, а для ответа на вопрос attempt = 0
с несколькими вариантами ответа w h ile s t ill_ g u e s s in g and attempt < 3:
хватит, пожалуй, и двух попыток.
i f g u e s s .lo w e r() == answer. lo w e r()
Попробуй сам догадаться, как
нужно изменить выделенные числа p r in t ('О твет верный')
для одного и другого варианта. score = score + 1
s t ill_ g u e s s in g = F a lse
e ls e : Измени это число.
i f attempt < 2:
guess = input ('Ответ неверный. Попробуйте еще раз. ')
attempt = attempt + 1
Измени это число.
i f attempt == 3:
p r i n t ( ' Правильный о твет: ' + answer)
Измени тему
Составь тест на другую тему, например
про спорт, кино, музыку или на общую
эрудицию. Можешь придумать вопросы
про своих родных или друзей, в том числе
провокационные, например: «У кого самый
противный смех?»
Функции СЛЕНГ
У функции есть...
Программисты любят хитрости, которые Аргумент — значение, которое
облегчают написание программ. Один передается внутрь функции.
из их самых известных трюков — дать особо Возвращаемое значение —
полезному блоку кода имя. Тогда можно данные, которые можно вернуть
из функции в основной код.
не вводить этот код каждый раз заново,
Для этого служит ключевое
а просто вызывать его по имени по мере слово return («вернуть»).
необходимости. Такие именованные
блоки кода называются функциями. А еще функцию можно...
Запрашивает имя
В стр о е н н ы е ф у н к ц и и пользователя.
В Python есть встроенные функции
для выполнения разных полезных >>> name = in p u t('К а к тебя зовут? ')
задач: от ввода информации и вывода Как тебя зовут? Сара
сообщений на экран до преобразования
>>> g re e tin g = 'Привет, ' + name
данных из одного типа в другой.
>>> p r in t (g r e e t in g )
Некоторыми встроенными функциями
ты уже пользовался, например print() Привет, Сара
>>> max(1 0 , 16, 30, 21, 25, 28) >>> m in(1 0 , 16, 30, 21, 25, 28)
30 10
Д р у го й с п о с о б в ы з о в а
У всех известных тебе типов данных — Не забудь Пустые скобки означают, что
про точку. аргументов у функции нет.
целых чисел, строк и списков — есть
собственные функции. Чтобы их вызвать,
>>> 'б аб а х' .u p p e r()
нужно ввести сами данные или имя
переменной, в которой они хранятся, 'БАБАХ'
В переменной хранится
Эта функция принимает два аргумента. список целых чисел.
[3, 2 , 1]
Заменяет слово «весело» на смайлик.
86400
Вызов функции.
В окне консоли отобразится количество
секунд в сутках.
Добавь аргументы
Если для работы функции нужны какие-нибудь
значения, укажи их внутри скобок в качестве аргу
ментов. Чтобы функция print_seconds_per_day()
сообщала, сколько секунд в заданном количестве
СОВЕТЫ ЭКСПЕРТА суток, измени ее код, как показано ниже. Теперь
функция принимает аргумент days («дни»), так что
Главное правило при вызове ей нужно передавать количество суток.
Это количество
Преобразует общее количество
миллисекунд в 7 сутках.
секунд в миллисекунды, сохраняя
результат в переменной milliseconds.
СОВЕТЫ ЭКСПЕРТА
Имя функции
На шаге 3 ты поменял название Тогда твой код будет гораздо проще
функции p rin t_seco n d s_p er_d ay() понять. Правила именования функций
(«напечатать количество секунд в сутках») такие же, как для переменных: имя может
на convert_days_to_seconds() («перевести содержать цифры и латинские буквы,
дни в секунды»). Так же как в случае но начинаться должно с буквы. Если
с переменными, важно, чтобы имя в имени несколько слов, разделяй их
функции точно описывало ее назначение. знаком подчеркивания.
Исправление ошибок
Если с кодом что-то не так, Python постарается выдать
сообщение об ошибке. Поначалу такие сообщения могут
сбивать с толку, однако они полезны, поскольку помогают
понять, почему код не работает и как это исправить.
Сообщение об ошибке
в окне консоли
Ошибка синтаксиса
В окне консоли сообщение об ошибке означает, что
выделяется красным, а программа какая-то команда
при этом завершается. Вот пример введена неверно.
сообщения, в котором указана строка
кода с ошибкой.
>>>
Блоки и отступы
О ш и б к а о тс ту п а
В Python один блок кода нередко находится
Чтобы показать начало и конец блока кода, внутри другого блока: например, частью
в Python используются отступы. Ошибка отступа функции может быть цикл. Все строки
(IndentationError) означает, что в структуре определенного блока должны идти с одинаковым
отступом. Хоть IDLE и старается ставить отступы
программы что-то не так. Запомни: если в конце
автоматически, все равно нелишним будет
строки стоит двоеточие, следующая строка проверить количество пробелов в каждом блоке.
должна начинаться с отступа. Чтобы добавить
отступ, нажми клавишу ПРОБЕЛ 4 раза.
i f weekday == T ru e :
p r i n t ('Пора в школу')
i f weekday == T ru e :
p r i n t ( ' Пopa в школу')
Ош ибка им енования
Ошибка именования (NameError) возникнет, если ввести
в код имя еще не созданной переменной или функции.
Чтобы такого не случилось, всегда объявляй переменные
и создавай функции до того, как используешь их. Код
функции лучше вводить в самом начале программы.
Видишь ошибку?
p r in t ( ' Караул! Вы потеряли ж и зн ь !')
Этот код успешно запускается, и все же в нем
p r in t ( li v e s ) есть логическая ошибка: значение переменной
liv e s = liv e s - 1 lives выводится на экран прежде, чем количество
жизней уменьшается на 1. Игрок увидит неверное
Все команды введены правильно, число! Чтобы это исправить, команду print(lives)
но стоят не в том порядке. нужно перенести в конец кода.
Строка за строкой
Находить логические ошибки непросто,
но со временем ты научишься их вылавливать.
Для этого нужно тщательно, строка за строкой,
проверять, что делает код. Прояви терпение,
и в конце концов ты найдешь ошибку.
СОВЕТЫ ЭКСПЕРТА
Подсказка
Пароль хорош, если его
легко запомнить, но сложно
подобрать или угадать.
С виду этот пароль
сложен, но программа-
взломщик подберет
Имя хорошо запоминается, его за пару секунд.
но угадать его слишком
просто.
СЛЕНГ
Ч то п р о и сх о д и т
Взломщик паролей
Генератор паролей соединяет случайные
Взломщик — это программа, с помощью
слова, числа и символы в надежные
которой хакеры подбирают пароли. Некоторые
комбинации. После запуска программа взломщики выдают миллионы вариантов
создаст пароль и выведет его на экран. в секунду, составляя их из распространенных
Ты можешь запрашивать новый пароль слов и имен. Необычный пароль — лучшая
снова и снова, пока не получишь тот, защита от таких программ.
который тебе понравится.
«ГЕНЕРАТОР ПАРОЛЕЙ»
Блок-схема программы
К а к это р а б о т а е т
«Генератор паролей»
Программа случайным образом В ходе этого проекта ты научишься пользоваться
выбирает каждую из четырех частей модулем random («случайный»). С его помощью
пароля, соединяет их и выводит программа случайным образом выбирает прилагательные,
результат на экран. Если ты запросишь
существительные, числа и символы. Скоро к твоим
другой пароль, программа повторит эти
шаги, а если нет, завершит работу. услугам будут сложные, но запоминающиеся пароли
вроде «oldapple14(» или «hotgoat&»!
Символ вроде
Предмет. «!» или «?».
Х и т р о , н о п р о сто !
Программа составляет хитрые пароли,
но строчек кода в ней всего ничего,
так что ее написание не займет много
времени.
Добавь модули
import random
Загрузи модули string
(«строка») и random import s t r in g
из стандартной библио
теки Python, добавив Модуль string позволяет работать
этот код в самое начало со строками — например, делить
программы. их на части или менять их вид.
Случайные числа
Случайные числа позволяют Выбери слова
имитировать вытаскивание карты Чтобы создать пароль, программе нужно выбрать случайное
из колоды, подбрасывание монетки прилагательное и случайное существительное. Получить
и т. д. Больше о случайных числах их можно с помощью функции choice() («выбрать»)
и модуле random можно узнать из модуля random. Введи этот код после команды print().
из справки (раздел Python Docs (Функция choice() возвращает случайный элемент
в меню Help). из переданного ей списка.)
Это константа.
Пароль будет храниться Преобразует случайное
в этой переменной. число в строку.
Создай пароль
Пришла пора соединить все password = a d je c t iv e + noun + str(num b er) + s p e c ia l_ c h a r
имеющиеся части в один надежный p r i n t ('Новый пароль: %s' % password)
пароль. Добавь эти строчки кода
в конец программы.
Выводит на экран новый пароль.
СОВЕТЫ ЭКСПЕРТА
Строки и целые числа
Функция str() преобразует
>>> p r i n t ( 'тр асса ' + 95)
целое число в строку. Если
попытаться сложить число Traceback (most recen t c a l l l a s t ) :
и строку без этой функции, F ile ' < pyshell# 0> ' , lin e 1, in <module> Сообщение
Python выдаст ошибку. об ошибке.
p r i n t ( 'тр асса ' + 95)
Попробуй сам: введи
в окне консоли команду T y p e E rro r: C a n 't co n ve rt ' i n t ' o b je ct to s t r im p lic it ly
print ('трасса * + 95).
w hile True:
a d je c tiv e = ra n d o m .ch o ic e (a d je ctiv e s) Эти строчки нужно
вводить с отступом,
noun = random .choice(nouns) чтобы они попали
number = random .randrange(0, 100) в цикл while.
s p e c ia l_ c h a r = ra n d o m .c h o ic e (strin g .p u n c tu a tio n )
Завершает цикл while. Функция input() запрашивает При ответе «да» (д)
у пользователя ответ. цикл запустится снова,
а при ответе «нет» (н)
он завершится.
Выбери лучший пароль
Вот и всё! Теперь ты можешь создавать надежные
пароли, которые легко запоминаются!
Больше слов
nouns = [ 'a p p le ', 'd in o s a u r ', 'b a ll',
Чтобы увеличить количество паролей,
которые может выдать программа, ' c a t ' , 'g o a t ', 'd ra g o n ',
добавь в списки прилагательных ' c a r ' , 'd u c k ', 'p a n d a ',
и существительных новые слова.
' te le p h o n e ' , ' banana' , ' te a c h e r']
w hile T ru e :
fo r num in ra n g e (3 ):
a d je c t iv e = ra n d o m .c h o ic e (a d je c tiv e s)
noun = random .choice(nouns)
Эти строки должны
number = random .randrange(0, 100) быть с отступом.
s p e c ia l_ c h a r = ra n d o m .c h o ic e (strin g .p u n c tu a tio n )
Несколько паролей
Измени код так, чтобы программа
выдавала сразу три пароля. В этом
тебе поможет цикл for. Помести
его внутрь цикла while.
Встроенные модули I I
random webbrowser
Ты уже использовал Этот модуль позволяет
этот модуль для управлять веб-браузером,
генерации случайных открывая интернет-
паролей. Он хорош, страницы прямо
если в код нужно из твоего кода.
добавить элемент
случайности.
socket
Модуль socket («разъем») позволяет
программам общаться по сети или
через интернет. Его можно использовать
при создании онлайн-игры.
И спол ьзовани е модуля
Для начала модуль нужно загрузить в программу
с помощью команды im port. Сделать это можно
разными способами, в зависимости о т того, как
именно ты хочешь его использовать.
Загружает модуль
webbrowser.
import...
>>> import webbrowser
Ключевое слово import открывает
доступ ко всему содержимому модуля, >>> webbrowser. open( ' h t t p s : //d o c s . python.o r g / 3 / lib ra ry ' )
однако название модуля придется
писать перед вызовом каждой принад
Название модуля следует писать перед
лежащей ему функции. Этот код загру
названием каждой принадлежащей ему
жает все функции модуля webbrowser функции.
и открывает сайт Python с помощью
функции open() («открыть»). Из модуля random загрузится
только функция choice().
from... import...
>>> from random import choice
Если тебе нужна лишь часть модуля,
ключевое слово from («из») позволит >>> d ir e c t io n = c h o i c e ( [ 'C ', 'Ю' З ', ' В ' ] )
загрузить только ее. При этом названия >>> p r in t ( d ir e c t io n ) ■Название модуля
функций можно вводить как обычно. указывать не нужно.
Вот пример загрузки из модуля random
функции choice(), которая выбирает
случайный элемент из списка. Выводит на экран случайно
выбранную сторону света.
Загружает и переименовывает
функцию time().
В этой остросюжетной игре нужно [ '? ' , '? ' , '? ' , '? ', '?']
называть буквы и угадывать слова. Осталось жизней:
Если букву угадать не получается, Угадайте букву или слово целиком: а
игрок теряет жизнь. Думай над ['?','?', '? ' , '? ', 'а']
каждым ответом, ведь когда жизни Осталось жизней:
закончатся, игра завершится! Угадайте букву или слово целиком: и
['?', ' и' , ' ? ' , ' ? ' , 'а']
Осталось жизней:
Что п р о и с х о д и т
Угадайте букву или слово целиком: у
Программа выводит на экран загаданное Неправильно. Вы теряете жизнь
слово, в котором вместо букв — знаки
['?' , ' и ' , ' ? ’ , ' ? ' , ' а ' ]
вопроса. Если ты отгадаешь букву, программа
Осталось жизней:
ее «откроет». Если же ты знаешь слово,
введи его целиком. Игра закончится, если Угадайте букву или слово целиком: ц
слово угадано либо израсходованы все [ ' ? ' , 'и', ' ц' , ' ц ' , 'а']
жизни. Осталось жизней:
Угадайте букву или слово целиком: н
При каждом правильном Неправильно. Вы теряете жизнь
ответе в слове «открывается»
угаданная буква. ['?, 'и ' , ' ц' , 'ц' , 'а']
Осталось жизней:
Если ответ неправильный, Угадайте букву или слово целиком: пицца
одно сердечко исчезает
Победа! Было загадано слово пицца
(жизнь сгорает).
СОВЕТЫ ЭКСПЕРТА
Символы Юникода
В письменных языках мира
буквы, цифры, знаки препи
нания, смайлики и другие
элементы записываются
при помощи символов. Чтобы
компьютер мог отобразить
их на экране, символы нужно
закодировать. Для кодирова
ния используются различные
системы. Так, для знаков
английского языка применя
ется набор символов ASCII.
Сердечки для нашего проекта
можно взять из набора Юникод,
в котором есть множество
значков, включая эти.
Подготовка
Создавать код игры «Девять жизней» лучше
в два этапа. Сначала загрузим необходимые
модули и объявим несколько переменных,
а затем напишем основной код программы.
im port random
Объяви переменную
import random
После строки с командой import объяви В начале игры у игрока
переменную lives, в которой будет 9 жизней.
храниться количество оставшихся жизней liv e s = 9
(попыток ввода).
Добавь слова
words = ['пицца', 'ангел', 'мираж', 'носки',
В начале каждой игры программа
будет случайным образом выбирать 'выдра', 'петух']
слово и сохранять его в переменной secret_w o rd = random .choice(w ords)
secret_word («секретное слово»).
Добавь команду, объявляющую
Здесь используется
эту переменную.
функция choice()
из модуля random.
Создай список с подсказкой
СОВЕТЫ ЭКСПЕРТА
Создай еще один список с подсказкой.
Поначалу в нем будут только знаки вопроса, Длина слова
но по мере отгадывания слова они будут
заменяться буквами. Список можно записать Будь внимателен: добавляй в игру только
так: clue =['?', '?', '?', '?', '?',], однако удобнее слова из 5 букв, ведь в списке с подсказкой
ввести следующий код, который делает то же есть место только для 5 символов. Если
самое. Добавь эту строку после объявления слово будет длиннее, при попытке обра
переменной secret_word. титься к несуществующим элементам списка
c lue («подсказка») Python выдаст ошибку.
[?','?' ' ]
Покажи количество жизней
Осталось жизней:
Для отображения жизней в этом проекте
используется символ Юникода «сердечко». Угадайте букву или слово целиком: ж
Добавь код, сохраняющий его в переменной ['ж', '? ', '? ', '? ', '? ']
heart_symbol («символ “сердечко”»).
Осталось жизней:
Угадайте букву или слово целиком: у
clue = l i s t ( ' ? ? ? ? ? ’ )
['ж', 'у', ' ? ' , ' ? ' , '?']
heart_sym bol = u ' \ u 2 7 6 4 '
Осталось жизней:
Угадайте букву или слово целиком: к
['ж', 'у', 'к', ' ? ' , '?']
Состояние игры
Осталось жизней:
Объяви переменную, которая будет хранить данные
о том, угадал игрок слово или нет. Присвой ей Угадайте букву или слово целиком:
значение False, поскольку в начале игры слово,
разумеется, еще не отгадано. Введи этот код после Последние два знака вопроса лишние:
объявления переменной heart_symbol. таких букв в слове нет.
Повторение строк
В строке print('Осталось жизней:' +
heart_symbol * lives), которая выводит >>> heart_sym bol = u '\u2 76 4'
на экран сердечки, использован хитрый >>> p rin t(h e a rt_s y m b o l * 10)
трюк: чтобы повторить строку указанное
количество раз, ее можно умножить на число.
Например, код print(heart_symbol * 10)
выведет на экран 10 сердечек. Попробуй
ввести его в окне консоли.
Игрок победил?
Когда игрок введет слово целиком, нужно проверить,
угадал ли он его. Если значение переменной
guessed_word_correctly равно True, значит,
цикл завершился прежде, чем закончились
жизни, и игрок победил. Иначе (else) он проиграл.
Добавь этот код в конец программы.
liv e s = liv e s - 1
Сокращенная запись команды
if guessed_word_correctly = True
i f g u e sse d _w o rd _c o rre ctly :
p r i n t ( ' Победа! Было загадано слово * + se cre t_w o rd )
e ls e : Не забудьсохранить
p r i n t ( ' Проигрыш! Было загадано слово ' + se cre t_w o rd ) свою работу.
Добавь слова
Увеличь список слов для отгадывания: их может
быть сколько угодно много, однако не забывай,
что все слова должны состоять из 5 букв.
words = ['п и ц ц а ', 'а н г е л ', 'мираж', 'н о с к и ', 'вы д р а', 'п е т у х ', 'б а н а н ', 'к о к о с ', 'о ле н ь ']
Д о б а в ь у р о в н и сл о ж н о с ти
Чтобы играть стало интереснее, предложи
игроку выбрать уровень сложности: чем выше
сложность, тем меньше жизней.
Запроси уровень
Перед циклом while добавь код, предлагающий
игроку выбрать уровень сложности.
Задай сложность
С помощью команд if, elif и else задай
количество жизней для каждого уровня
сложности: например, 12 для легкого,
9 для среднего и 6 для трудного. Добавь
следующий код после команд, запрашива
ющих у пользователя уровень сложности.
i f d i f f i c u l t y == 1:
l i v e s = 12
e l i f d i f f i c u l t y == 2:
liv e s = 9
e ls e :
liv e s = 6
Ум ное з а в е р ш е н и е и гр ы
Сейчас, чтобы закончить игру, надо ввести слово целиком. Давай
изменим код так, чтобы игра прекращалась, как только игрок
откроет последнюю неотгаданную букву. В начале игры все
буквы неизвестны.
Измени функцию
Измени код функции update_clue(), как
показано ниже. Когда игрок отгадает букву,
программа вычтет из значения переменной
unknown_letters («неотгаданные буквы») то
количество букв, которое откроется в слове.
i f guess in se c re t_w o rd :
u n kno w n_letters = u p d a te _clu e (g u e ss, se cre t_w o rd , c lu e , unknown_l e t t e r s )
e ls e :
Передача значения переменной
p r i n t ( ' Неправильно. Вы теряете ж изнь') unknown_letters в функцию
liv e s = liv e s - 1 update_clue().
Выигрыш
Если значение переменной unknown_ letters
уменьшилось до 0, значит, игрок отгадал все
буквы. Добавь этот код в конец основного цикла.
Теперь программа автоматически распознает
выигрыш, если все буквы в слове открыты.
liv e s = l i v e s - 1
i f unknown_l e t t e r s == 0 :
g u e sse d _w o rd _co rre ctly = True
break
Что п р о и сх о д и т
После запуска программы появляется графическое
окно, по которому движется черепашка, рисуя
дружелюбного робота. Можно наблюдать, как
она создает его часть за частью.
Цвета частей
робота можно
менять.
Создай другого
робота, изменив
размеры прямо
угольников, из ко
торых он состоит.
Блок-схема программы
Как это р а б о т а е т «Сборщик роботов»
Сначала создадим функцию, которая рисует Блок-схема показывает, какие команды
прямоугольники, а затем научим программу выполняет программа. Сначала она задает
составлять из них робота. Размер и цвет цвет фона и скорость черепашки, затем
черепашка по частям рисует робота,
прямоугольников можно выбирать, меняя
начиная с ног и заканчивая головой.
аргументы функции: ноги могут быть длин
ными и узкими, глаза квадратными и т. д.
Рисование черепашкой
Модуль turtle позволяет управлять инструментом
«черепашка», который оснащен пером. С помощью
функций модуля черепашку можно заставить двигаться
в нужном направлении и рисовать самые разные картинки.
Также можно указать, когда опустить перо и начать
рисовать, а когда поднять и переместиться в другую
часть экрана, не оставляя за собой следа.
t .fo rw ard(100)
t . l e f t (90)
t .fo r w a r d (50)
Создай новый файл
Рисуем п р я м о у г о л ь н и к и
Открой IDLE и создай
Загрузим модуль tu rtle и нарисуем новый файл, сохранив
с его помощью прямоугольники. его как robot_builder.py
(«сборщик роботов»).
СОВЕТЫ ЭКСПЕРТА
Режим черепашки
Твоя черепашка работает в стандартном Обычно черепашка выглядит
как стрелочка. Эта строчка
режиме. Это значит, что после запуска
превращает ее в черепашку.
программы она будет смотреть вправо.
С помощью функции setheading() («задать
направление») ее можно развернуть t . sh a p e (' t u r t l e ')
на определенный угол: значение 90 на t . se th e ad in g (0 )
правит ее вверх, 180 — влево, а 270 —
t . fo rw a rd (80)
вниз.
Добавь фон
СОВЕТЫ ЭКСПЕРТА
Теперь нужно подготовить черепашку к рисованию
Скорость черепашки и задать цвет фона графического окна. Вначале перо
черепашки должно быть поднято — до тех пор, пока
Скорость черепашки можно менять она не начнет рисовать ступню робота (шаг 5). Введи
от самой медленной до самой следующие строки после кода, добавленного на шаге 3.
быстрой, вызывая функцию t.speed()
(«скорость») с одним из этих значений
в качестве аргумента: slowest, slow,
Поднимает перо черепашки.
normal, fast и fastest.
Устанавливает
скорость «медленно».
t .penup(
)
t.speed('slow')
t .b g c o lo r ( ' Dodger b lu e ')
С о зд а е м р о б о т а
Теперь можно приступать к созданию робота.
Давай нарисуем его по частям, начиная со ступней.
Робот будет состоять из прямоугольников разного
размера и цвета, которые нужно расположить
в разных частях окна.
Нарисуй ступни
Помести черепашку в позицию первой ступни и нарисуй
прямоугольник, вызвав функцию rectangle(). То же
касается и второй ступни. Введи эти строчки кода после
тех, что были добавлены на шаге 4, запусти программу
и проверь, появились ли ступни робота.
СОВЕТЫ ЭКСПЕРТА
Координаты черепашки
Python выставляет размеры графического
окна так, чтобы оно вписывалось в экран.
Предположим, что размер окна 400 х 400 пик
селей. Для определения местоположения
черепашки Python использует координаты.
Это значит, что любой точке окна соответствуют
2 числа. Первое — координата х — показы
вает, насколько черепашка смещена влево
или вправо от центра окна. Второе число —
координата у — обозначает смещение чере
пашки от центра вверх или вниз. Координаты
обычно пишут в скобках и первой ставят х: (х, у).
Нарисуй туловище
# туловище
Введи эти строчки после кода,
Рисует красный
добавленного на шаге 6. Запусти t .g o t o (- 9 0 , 100) прямоугольник
программу: должно появиться re c ta n g le (100, 150, 'r e d ') размером 100
туловище робота. на 150 пикселей.
Нарисуй руки
# руки
Каждая рука состоит из двух
частей: верхней — плеча — t.g o to (- 1 5 0 , 70) Плечо левой
и нижней — предплечья. re c ta n g le (6 0 , 15, 'g r e y ') руки.
Введи эти строчки после кода,
добавленного на шаге 7, t .g o to (- 1 5 0 , 110)
запусти программу и убедись, re c ta n g le (1 5 , 40, 'g r e y ')
что у робота появились руки.
Плечо правой
руки.
Нарисуй шею
# шея
Теперь создадим шею. Введи
команды рисования шеи после t . goto(- 5 0 , 120)
кода, добавленного на шаге 8. re c ta n g le (1 5 , 20, 'g r e y ')
Нарисуй голову
# голова
Упс, ты нарисовал безголового
робота! Чтобы снабдить беднягу t .g o t o (- 8 5 , 170)
головой, введи эти команды re c ta n g le (8 0 , 50, 'r e d ') Незабудьсохранить
после кода, добавленного свою работу.
на шаге 9.
Нарисуй глаза
# глаза
Давай добавим роботу глаза, чтобы он видел, Рисует
куда направляется. Для этого нарисуем в райо t .g o t o (- 6 0 , 160) белки глаз.
не головы белый прямоугольник с двумя re c ta n g le (3 0 , 10, 'w h it e ')
черными квадратиками (это белки и зрачки
глаз). Создавать функцию, рисующую квадраты, t . g o to (-5 5 , 155)
не нужно, ведь квадрат — это равносторонний re c ta n g le (5 , 5 , 'b la c k ')
прямоугольник. Введи эти команды после кода,
t .g o t o (- 4 0 , 155)
добавленного на шаге 10.
Рисует левый
re c ta n g le (5 , 5, 'b la c k ')
зрачок.
Рисует правый
зрачок.
Нарисуй рот
# рот
Теперь давай нарисуем роботу рот. Введи
эти строчки после кода, добавленного t .g o t o (- 6 5 , 135)
на шаге 11. re c ta n g le (4 0 , 5 , 'b la c k ')
Спрячь черепашку
t .h i d e t u r t l e ( )
И наконец, спрячь черепашку, иначе она
останется у робота на лице. Введи эту строчку
Делает черепашку
после кода, добавленного на шаге 12. Запусти
невидимой.
программу и наблюдай, как создается робот.
Что бы изменить?
Итак, программа запускается и работает.
А не хочешь ли ты изменить внешний вид робота?
Вот несколько идей, как это можно сделать.
Поменяй цвета
Робот и так разноцветный, но ты можешь
сделать его еще ярче! Например, подобрать
цвета, подходящие к обоям в твоей комнате,
или напоминающие цвета любимого футболь
ного клуба. Справа и ниже перечислены
некоторые оттенки, известные черепашке.
Misty Rose
Peru
Deep Pink
Forest Green Navy Aquamarine
Руки в движении
Теперь, когда руки рисуются цельными, несложно
поменять их положение, чтобы создать впечатление,
будто робот чешет затылок или танцует! Для этого,
перед тем как приступить к рисованию руки, разверни
черепашку с помощью функции setheading().
Разворачивает черепаш
# руки ку в сторону левого
t.g o t o (- 9 0 , 80) верхнего угла экрана.
t.s e th e a d in g (1 3 5 )
Рисует левую руку.
arm ('h o t p in k ')
Разворачивает
t .g o t o (1 0 , 80)
черепашку в сторону
t.s e th e a d in g (3 1 5 ) правого нижнего угла
экрана.
arm ('h ot p in k ')
Что п р о и с х о д и т
Черепашка рисует окружности разных
цветов и размеров в разных частях экрана,
создавая яркий замысловатый узор.
Растущая спираль
Окружности будут накладываться
одна на другую со сдвигом, образуя
выходящую из центра спираль.
Черепашка начинает
рисовать окружности
из центра экрана.
СОВЕТЫ ЭКСПЕРТА
Перебор цветов
Функция сусlе() («окружность») из модуля
itertools (сокр. от iterator tools —
«инструменты итераторов») делает узоры
разноцветными. Она перебирает элементы
в списке цветов по кругу, снова и снова.
Толщина пера.
Цвет
t u r t l e . p e n c o lo r( ' re d ') окружности.
t u r t l e .c i r c l e ( 3 0 )
Больше окружностей
import t u r t le
На экране появится окружность. Но нам мало
одной, поэтому поместим команды для рисова Здесь
ния окружности внутрь функции, добавив еще def d r a w _ c ir c l e ( s iz e ) : используется
одну строчку, чтобы функция сама себя вызывала. аргумент size
Этот трюк с бесконечным самозапуском t u r t le .p e n c o lo r ( ' re d ') («размер»).
называется рекурсией. Поскольку функцию t u r t le .c ir c le ( s iz e )
нужно создать до ее вызова, помести этот
d r a w _ c ir c le ( s iz e )
код перед основным кодом программы. Функция draw_circle()
(«нарисовать окружность»]
t u r t le .b g c o lo r ( ' b la c k ') сама себя вызывает
бесконечное количество
t u r t le .s p e e d ( ' f a s t ') раз.
t u r t le .p e n s iz e ( 4 )
draw c ir c le ( 3 0 )
import t u r t le
Загружает функцию cycle().
from it e r t o o ls import c y c le
c o lo rs = c y c l e ( [ ' re d ' , 'o ra n g e ', 'y e llo w ', 'g r e e n ', 'b lu e ', 'p u r p le '] )
Создает
def d r a w _ c ir c le ( s iz e ) : цикличный
t u r t le .p e n c o lo r (n e x t (c o lo r s )) список цветов.
t u r t l e .c i r c l e ( s i z e )
Берет следующий
d r a w _ c ir c le (s iz e + 5) цвет из списка.
def d r a w _ c ir c le ( s iz e , a n g le , s h i f t ) :
Добавь новые аргументы.
t u r t le .p e n c o lo r ( n e x t ( c o lo r s ) )
t u r t le .c ir c le ( s iz e )
Поворачивает черепашку по часовой стрелке.
t u r t le .r ig h t ( a n g le )
Продвигает черепашку вперед.
t u r t le .f o r w a r d ( s h if t )
d r a w _ c ir c le (s iz e + 5, angle + 1, s h i f t + 1)
Что бы изменить?
Итак, программа работает. А это значит, что
с ее кодом можно поэкспериментировать
и создать еще более фантастические узоры.
Широкие линии
Увеличь толщину линий и посмотри,
каким станет узор. Первоначальная
толщина равнялась 4 пикселям. А что
если указать 40?
t u r t l e . p e n size (4 0 )
import t u r t le
from it e r t o o ls im port c y c le
c o lo rs = c y c l e ( [ ' re d ' , 'o ra n g e ', 'y e llo w ', 'g r e e n ', 'b lu e ', 'p u r p le '] )
СОВЕТЫ ЭКСПЕРТА
Цвета на экране
Экранное изображение состоит из крохот
ных точек — пикселей, светящихся красным,
зеленым и синим. В этом проекте цвет
каждой звезды определяется тремя
числами, которые обозначают насыщен
ность красного, зеленого и синего цветов,
дающих при наложении нужный оттенок.
Смесь всех
трех цветов
дает белый.
Синий
и зеленый
дают голубой.
Я вижу звезды
Звезды появляются
в случайных местах.
Считая звезды
Безоблачной ночью
на небе можно увидеть
около 2500 звезд. Чтобы
программа нарисовала
столько же, придется
подождать больше
полутора часов!
Рисуем зве зд у
Прежде чем писать код функции, нужно разобраться,
как нарисовать одну звезду с помощью черепашки,
и тогда ты сможешь создать множество звезд.
Загрузи turtle
import t u r t le as t
Введи эту строку кода в окне
программы. Она загружает
модуль turtle, который Загружает модуль
и будет рисовать звезды. turtle.
Задай параметры звезды
import turtle as t
После строки с загрузкой модуля
добавь этот код. Он определяет
размер и форму звезды, а также s iz e = 300
объясняет черепашке, как нужно Эти переменные задают
двигаться. p o in ts = 5 размер и форму звезды.
angle = 144
Нарисуй звезду
Чтобы проверить работу
программы, открой меню
Run и выбери Run Module.
Появится графическое окно
(оно может оказаться позади
других окон), на котором
черепашка будет рисовать
первую звезду.
Незабудьсохранить
свою работу.
Черепашка-стрелочка
двигается, оставляя
за собой линию. Звезда создается поэтапно,
отрезок за отрезком.
Вычисли угол
im port t u r t le as t
Хорошо бы научить черепашку
рисовать звезды с разным
Величина угла зависит от количества
количеством лучей. Измени s iz e = 300 лучей (вершин) звезды.
эту строчку кода. Пусть она
вычисляет угол, на который p o in ts = 5
нужно развернуть черепашку, angle = 180 - (180 / p o in ts )
чтобы получилась звезда
с заданным количеством лучей.
fo r i in r a n g e (p o in ts ):
t . fo rw a rd (s iz e )
t . r ig h t(a n g le )
Раскрась звезду!
import turtle as t
Мы нарисовали отличную
звезду, но сейчас она выглядит
скучновато. Давай добавим ей s iz e = 300
цвет. Внеси в код следующие
изменения, чтобы звезда стала p o in ts = 5 Задает желтый
желтой. angle = 180 - (180 / p o in ts ) цвет для звезды.
t .e n d _ f ill( )
СОВЕТЫ ЭКСПЕРТА
Дырявые звезды
На разных компьютерах звезда
может выглядеть по-разному.
Если в середине ты увидишь дырку,
не волнуйся: вид звезды зависит
от типа компьютера, так что твой
код в этом не виноват. Не забудь сохранить
свою работу.
З ве зд ы в н е б е
А теперь давай поместим код, рисующий
звезду, в функцию, с помощью которой
можно будет усыпать звездами все небо.
def d ra w _ s t a r(p o in ts , s iz e , c o l, x , y ) :
t .penup()
Создай функцию draw_star() Координаты x и у задают
Измени код так, как показано t . goto( х , у) положение звезды
справа, чтобы команды для t.pendow n() на экране.
рисования звезды попали внутрь
angle = 180 - (180 / p o in ts )
функции. Теперь, чтобы изобразить
звезду, тебе будет достаточно t .c o lo r ( c o l)
просто вызвать в основном коде t . b e g i n _ f i l l ()
функцию draw_star() («нарисовать
звезду»). fo r i in r a n g e (p o in ts ):
t . fo rw a rd (s iz e )
t . rig h t(a n g le )
Комментарий начинается со знака
«решетка» (# ), поэтому Python его t.e n d _ f i l l ( )
пропускает. Это просто заметка, Задает темно-синий
которая поясняет код. цвет фона.
# Основной код
t .S c r e e n ( ) .b g c o lo r('d a rk b lu e ')
Вызов функции draw_star().
d ra w _ s ta r(5 , 50, 'y e llo w ', 0 , 0)
Создай цикл
# Основной код
Внеси следующие изменения
в основной код программы. Цикл t .S c r e e n ( ) .b g c o lo r('d a rk b lu e ')
while будет раз за разом обновлять
случайные числа, задающие размер
w h ile T ru e :
звезды, ее форму, цвет и положение
на экране. ra n P ts = r a n d in t (2 , 5) * 2 + 1
ra n S iz e = r a n d in t (1 0 , 50)
Строчка с переменной ranPts
[сокр. от random points — «случайное ranCol = (random( ) , random (), random ())
количество вершин») задает диапазон ranX = ra n d in t(- 3 5 0 , 300)
для количества вершин звезды; сейчас
это нечетные числа от 5 до 11. ranY = ra n d in t(- 2 5 0 , 250)
# Основной код
t .h id e t u r t le ()
Что бы изменить?
Теперь ты умеешь создавать звезды и можешь
применить новые знания в собственных проектах.
Вот тебе еще несколько идей на эту тему.
Звезды и мышка
Попробуй с помощью функции
t.onScreenClick() («кликнуть
по экрану») сделать так, чтобы
звезды возникали по щелчку
мышки.
def d ra w _ p la n e t(c o l, х , у ) :
t.p e n u p ()
t . g o to (x , y)
t.pendow n()
t .c o lo r ( c o l)
Нарисуй планеты
t .b e g in _ f ill( )
Изучи работу функции t.circle()
и попробуй нарисовать с ее t .c i r c l e ( 5 0 )
помощью планеты. Начать t .e n d _ f ill( )
можно с этого кода.
«Безумная радуга»
С помощью черепашки можно рисовать
самые разные картинки и узоры. Похоже,
в этом проекте черепашка разошлась:
такой радуги на небе не увидишь!
Что п р о и с х о д и т
Программа просит пользователя выбрать
длину и толщину линий, которые будет
рисовать черепашка. Затем черепашка
начинает сновать по экрану, оставляя
за собой линии разных цветов. Узор,
который при этом получится, будет
зависеть от выбранных значений.
СОВЕТЫ ЭКСПЕРТ А
Какой цвет следующий?
В программе «Безумная радуга» функция
choice() из модуля random выбирает
случайные цвета линий. Это значит,
что предсказать цвет очередной линии
невозможно.
Функция get_line_length()
позволяет пользователю
задавать длинную, среднюю
и короткую линии.
Буйство красок
Поскольку в программе
используется бесконечный
цикл while, черепашка будет
рисовать линии до тех пор,
пока ты не закроешь окно.
Кроме цвета, толщины
и длины линий, можно
поменять цвет, форму
и скорость самой черепашки.
Блок-схема программы
Как это р а б о та е т «Безумная радуга»
Каждый узор, который создает программа, не похож В коде используется бесконечный цикл,
на предыдущий, поскольку перед началом рисования рисующий линии все время, пока
новой линии черепашка разворачивается в случайном программа работает. Лишь когда ты
закроешь окно, черепашка прекратит
направлении. Цвет линии также выбирается случайно
перемещаться по экрану.
из списка цветов. Результат предугадать невозможно!
Начало
■
Длинные, широкие
Средние, тонкие
Короткие, суперширокие
Черепашка-беглец
Черепашка, которой дают полную
свободу, склонна убегать за границы
окна. Чтобы она не уходила слишком
далеко, добавь код, проверяющий
позицию черепашки. Иначе проект
«Безумная радуга» превратится
в проект «Сбежавшая черепашка»!
im port random
im port t u r t le as t
Запроси длину
im port t u r t le as t
Создай функцию Предлагает пользователю
get_line_length() («получить выбрать длину линий.
длину линии»), позволяю def g e t _ lin e _ le n g t h ( ) :
щую пользователю выбрать,
choice = inp u t( ' Выберите длину линий (длинные, средние, короткие): ')
какие линии рисовать
черепашке: длинные, i f cho ice == 'длинные':
средние или короткие. lin e _ le n g t h = 250
Эта функция понадобится
лишь на шаге 5, однако e l i f cho ice == 'ср ед н и е ':
лучше подготовить ее lin e _ le n g t h = 200
заранее. Введи этот код
e ls e :
после команд, добавлен
ных на шаге 2. lin e _ le n g t h = 100
re tu rn lin e _ le n g th
Возвращает значение
переменной line_length Для коротких линий задает
обратно в код. длину 100 пикселей.
Запроси толщину
re tu rn lin e _ le n g th
Создай функцию Предлагает
get_line_width() («полу пользователю выбрать
чить толщину линии»), def g e t_ l in e _w id th ( ) : толщину линий.
предлагающую пользо
choice = input( 'Выберите толщину линий (суперширокие, широкие, тонкие): ')
вателю выбрать, какие
линии рисовать черепаш i f choice == 'суперширокие' :
ке: суперширокие, широ lin e width = 40
кие или тонкие. Эта
функция (как и функция e l i f choice == 'широкие'
Если пользователь выбрал тонкие линии,
get_line_ length()) пона lin e _w id th = 25 присваивает переменной значение 10.
добится на шаге 5. Введи
e ls e :
следующие строчки пос Возвращает значение переменной
ле кода, добавленного lin e _ w id th = 10 line_width обратно в код.
на шаге 3. re tu rn lin e width
Используй функции
re tu rn lin e _ w id th
Итак, у тебя есть две функции, и теперь
их можно использовать для запроса
длины и толщины линий. Добавь эти lin e__le n g th = g e t _ lin e _ le n g t h ( )
строчки кода в конец программы
и сохрани файл. lin e _ w id th = g e t _ l in e _ w id th ()
Ответ пользователя.
Проверь работу программы
Выберите длину линий (длинные, средние, короткие): длинные
Запусти программу в окне консоли
и проверь, правильно ли работают Выберите толщину линий (суперширокие, широкие, тонкие): тонкие
функции.
П о зо ве м ч е р е п а ш к у
Пришло время написать код,
который создаст графическое окно Делает черепашку
похожей на черепаху,
и подготовит черепашку к работе. а не на стрелочку.
Создай окно
line_width = get_line_width()
Введи следующие строчки после
кода, добавленного на шаге 5. Красит черепашку
В них задается цвет фона, а также t .shape('turtle') в зеленый цвет.
параметры черепашки: ее форма,
t.fillcolor('green')
цвет, скорость и толщина пера, Задает черный цвет фона.
которым она будет рисовать линии. t.bgcolor('black')
Задает скорость
t.speed('fastest') черепашки.
Устанавливает толщину линий
в зависимости от выбора пользователя. t .pensize(line_width)
Запусти программу
Если снова запустить программу, после
запроса параметров линий появится
графическое окно, а в нем — черепашка.
Рассмотри ее хорошенько: недолго ей
стоять на месте!
Границы перемещений
Чтобы черепашка не убегала, обозначим
границы, отступив по 100 пикселей от каждого
края окна. Проверять, не выходит ли черепашка
за границы, будем с помощью функции. Введи
эти строчки после кода, добавленного на ша
ге 4, и перед кодом шага 5.
re tu rn lin e width
100 пикселей влево
Отступим 100 пикселей от правого края
вправо от левого края окна. окна.
def in s id e _w in d o w ():
l e f t _ l i m i t = ( - t . w indow _w idth() / 2) + 100 100 пикселей вниз
от верхнего края
r ig h t _ lim it = ( t . w indow _w idth() / 2 ) - 100
окна.
t o p _ lim it = (t.w in d o w _h e ig h t() / 2) - 100
b o tto m _lim it = (-t.w in d o w _ h e ig h t() / 2) + 100 100 пикселей вверх
от нижнего края
( x , y ) = t .p o s () окна.
in s id e = le f t _ _ lim it < x < rig h t_ _ lim it and b o tto m _lim it < у < to p _ l im it
re tu rn in s id e Если черепашка находится
внутри ограниченной области,
переменная inside принимает
l i n e _ l ength = get_l in e _ l e n g th () значение True, иначе — False.
Голубой прямоугольник
показывает границы;
на экране он виден
Незабудьсохранить не будет.
свою работу.
Ч ерепаш ка, за р аб оту!
Давай напишем функции, перемещающие черепашку,
а затем создадим цикл w hile, который отправит ее
рисовать безумную радугу!
Безумная линия
Добавь следующие строчки после кода, введенного на шаге 9,
и перед кодом шага 5. Эта функция поворачивает черепашку
в другую сторону. При этом за ней тянется линия случайно
выбранного цвета. Программа будет вызывать эту функцию
снова и снова, чтобы получилась безумная радуга. Если
черепашка выйдет за границы, заданные на шаге 9, функция
развернет ее назад.
lin e _ le n g t h = g e t _ lin e _ le n g t h ()
Если черепашка вышла
за границы окна, она
возвращается назад. Черепашка движется
Запускает бесконечный цикл, вперед на line_length
чтобы черепашка рисовала пикселей.
линии без остановки.
Черепашка, вперед!
И наконец, введи код, запускающий t . sp e e d (' f a s t e s t ')
процесс рисования. Добавь эти t . p e n s iz e ( l i ne_w idth)
строчки в самый конец программы, Рисует одну линию.
после команд, введенных на шаге 7.
Сохрани программу, запусти ее w h ile T ru e :
и полюбуйся на свою первую m o v e _ t u r tle (lin e _ le n g t h )
безумную радугу!
Что бы изменить?
Достаточно ли безумная получилась у тебя
радуга? Не очень? Вот несколько способов
сделать ее еще более фантастической!
Неожиданные цвета
Цвет в Python можно задавать RGB-значением, то есть комбинацией
красного (R), зеленого (G) и синего (В) цветов. Если выбрать насы
щенность этих трех составляющих случайным образом, получится
совершенно неожиданный результат. Попробуй изменить код
функции move_turtle() («переместить черепашку») так, чтобы
вместо названий цветов там использовались случайные RGB-
значения. Запусти код и посмотри, что выйдет!
Замени эти 2 строчки кода...
p e n _co lo rs = [ ' r e d ' , 'o ra n g e ', 'y e llo w ', 'g r e e n ', 'b lu e ', 'p u r p le ']
t . p e n c o lo r(ra n d o m .c h o ic e (p e n _ c o lo rs))
..на эти 5 .
СОВЕТЫ ЭКСПЕРТА
t.co lo rm o d e (2 5 5 ) RGB-цвет
red = ra n d o m .ra n d in t(0 , 255) Синему цвету соответствует RGB-значение
blue = ra n d o m .ra n d in t(0 , 255) (0 ,0, 255), поскольку в нем максимальное
green = ra n d o m .ra n d in t(0 , 255) количество синего (В) и совсем нет красного (R)
и зеленого (G). Чтобы использовать RGB-значения
t .p e n c o lo r (r e d , green, b lu e ) для пера черепашки, включи RGB-режим
командой t.colormode(255) («цветовой
режим»), иначе Python выдаст ошибку.
Это значение показывает насыщенность
красной составляющей цвета (от 0 до 255).
Разные линии
t .p e n c o lo r (0 , 0 , 255)
He стоит ограничиваться линиями одной толщины —
этот трюк позволит изобразить еще более сумасшедшую
Насыщенность Насыщенность
радугу! Толщина линий будет меняться случайным
зеленой синей
образом. Добавь эту строчку в функцию move_turtle() составляющей. составляющей.
после вызова t.pencolor() («цвет пера»).
t .p e n c o lo r ( 'b lu e ')
t .p e n s iz e (r a n d o m .r a n d in t (l,4 0 ))
Черепаховые штампы
Скрепи линии своей радуги отпечатками в виде черепашки.
Сделай это с помощью функции stamp() («штамповать»)
модуля turtle, которая добавит изображение черепашки
в начало каждой линии (а еще можешь написать функцию,
которая рисует линии, целиком состоящие из штампов,
и использовать ее вместо t.forward() («вперед»)
и t.backward() («назад»)). Добавь эти строчки в функцию
move_turtle() после вызова t.pencolor().
Создай функцию
Круты е или п л а в н ы е п о в о р о т ы ?
Создай функцию, позволяющую
Программа может запрашивать, на сколько выбрать тип поворота. Введи
градусов разворачивать черепашку, чтобы эти строчки перед функцией
на стыках ее путей получались тупые, прямые get_line_length(), добавленной
на шаге 3 при написании основного
или острые углы. Выполни эти шаги и посмотри,
кода.
что будет.
Запрашивает тип углов.
import t u r t le as t
def g e t _ t u r n _ s iz e ( ) :
tu rn _size = in p u t(' Выберите тип углов (тупые, прямые, острые): ')
re tu rn t u r n _ s iz e
Основная часть
w h ile T ru e :
И наконец, измени строчку с вызовом
функции move_turtle(), добавив m o v e _ t u r tle (lin e _ le n g t h , t u r n _ s iz e )
в нее аргумент turn_size.
Короткие широкие линии, тупые углы Средние суперширокие линии, Длинные тонкие линии, острые углы
прямые углы
Забавные
программы
«Календарь ожидания»
Предвкушая какое-то приятное событие, всегда хочется
знать, сколько дней до него осталось. В этом проекте
ты познакомишься с модулем Tkinter* и создашь
программу, считающую дни до важной даты.
Что п р о и с х о д и т
Программа выводит список событий и показывает,
сколько дней осталось до каждого из них. Запустив
программу на следующий день, ты обнаружишь,
что числа уменьшились на 1. Введи даты — и ты
больше не пропустишь важное событие или...
срок сдачи домашней работы!
После запуска
программы
откроется окно
со списком
событий.
* Tkinter (сокр.
от toolkit interface) —
набор инструментов
для интерфейса.
■
Блок-схема программы
Как это р а б о т а е т «Календарь ожидания»
Программа считывает информацию из текстового В этом проекте список событий создается
файла, в котором содержатся названия событий отдельно от кода — в обычном текстовом
и их даты. Это называется «ввод из файла». файле. Сперва программа считывает из него
события и даты, а затем вычисляет и выводит
С помощью модуля d a te tim e («дата-время»)
на экран количество оставшихся до них дней.
программа вычисляет разницу в днях между
текущей датой и датами событий, а результаты
выводит в окне, созданном модулем Tkinter.
Модуль Tkinter
Модуль Tkinter — это набор
инструментов, которые помогают
работать с графикой и вести диалог
с пользователем. Tkinter позволяет
выводить данные в отдельном
окне, вид которого ты можешь
запрограммировать сам.
СЛЕНГ
GUI
Графический интерфейс пользователя, или GUI
(graphical user interface), — это визуальная часть
программы, предназначенная для взаимодействия
с пользователем. К GUI относятся, например,
иконки и выпадающее меню на экране смартфона.
Модуль Tkinter позволяет конструировать эле
менты GUI с помощью виджетов — готовых частей
кода, создающих кнопки, ползунки, меню и т. д.
GUI смартфона
включает в себя
иконки, которые
показывают поль
зователю мощность
Wi-Fi-сигнала и заряд
батареи.
С озд ан и е и чтени е т е к с т о в о го ф ай л а
Все данные для программы «Календарь
ожидания» должны храниться в текстовом
Вводи даты в формате
файле. Создать его можно в IDLE. «день/месяц/год».
Сначала идет
название события.
Загрузи модули
from t k in t e r im port T k , Canvas
Для этого проекта нужны два модуля:
Tkinter и datetime. Tkinter поможет from datetim e im port d a te , datetim e
создать несложный графический
интерфейс, a datetime будет выполнять Загрузка модулей
подсчет дней. Добавь в программу Tkinter и datetime.
эти две строчки кода.
Создай холст
СЛЕНГ
Введи эти строчки после кода, добавленного на шаге 4. В первой
строке с помощью базового виджета Tkinter создается окно. Холст
Во второй благодаря виджету Canvas («Холст») в окно добавля
ется холст, который позволяет выводить текст и изображения Холст Tkin ter — это прямо
на экран. угольная область для отобра
Создает холст жения фигур, картинок и текста,
Помещает холст Создает окно размером с которыми пользователь
в окно Tkinter. Tkinter. 800 х 800 пикселей. может взаимодействовать.
Эта область похожа на холст
художника, только рисуют
root = T k ()
на ней не кистями и красками,
с = C a n v a s(ro o t, width=800 , height=800, b g = 'b la c k ') а кодом!
c .p a c k ()
c .c r e a t e _ t e x t (1 0 0 , 50, an ch o r= 'w ', f ill= 'o r a n g e ' ,\
fo n t = 'A ria l 28 bold u n d e r lin e ', t e x t = 'Календарь ожидания')
Запусти программу
Запусти код. Должно открыться окно с названием
программы. Если этого не случилось, посмотри,
нет ли в окне консоли сообщений об ошибках,
и тщательно, строчка за строчкой, проверь код.
СОВЕТЫ ЭКСПЕРТ А
Модуль datetim e
Введи день своего рождения Импортирует все
Модуль datetim e сильно упрощает в формате «год, месяц, день». элементы модуля.
вычисления, связанные с датами
и временем. Знаешь ли ты, например, >>> from datetim e im port *
в какой день недели родился?
Введи в окне консоли эти строки >>> p rin t(d a te (2 0 0 7 , 12, 4 ) .weekday( ) )
и получи ответ. 1
Позиции в списке
Python нумерует элементы в списке
начиная с 0. Так, первый элемент
списка current_event, 'Новый год',
находится в позиции 0, а второй,
'01/01/2019', — в позиции 1. Поэтому
твой код преобразует в дату именно
элемент current_event[1].
def g e t _ e v e n t s ( ):
lis t _ e v e n t s = []
w ith open( ' e v e n t s . t x t ' , encoding= 'u t f - 8 ' ) as f i l e :
fo r lin e in f i l e :
lin e = l i n e . r s t r i p ( ' \ n ')
c u rre n t_e v e n t = l i n e . s p l i t ( ' , ' )
event_d ate = d a te tim e .s trp tim e (c u rre n t_ e v e n t[ 1 ] , '%d/%m/%Y') .d a t e ()
c u rre n t_ e v e n t[1] = event_d ate
После выполнения этой строчки кода
li s t _ e v e n t s .append (c u rre n t_ e v e n t) цикл повторится для следующей
строки текстового файла.
re tu rn l i s t events
Найди разницу
def d a ys_b e tw e e n _d ate s(d a te 1 , d a te 2 ):
Создай days_between_dates()
(«дней между датами») — функцию, time_between = s t r ( d a t e l - date2)
которая будет возвращать разницу
в днях между двумя датами. Модуль Результат в виде Вычитает одну дату
datetime позволяет легко вычитать строки попадает из другой, чтобы получить
одну дату из другой. Введи после в эту переменную. разницу в днях.
функции get_events() следующий код,
сохраняющий строку с количеством
дней в переменной time_between
(«времени между»).
Раздели строку
Если до Нового года осталось 27 дней, в time_between
появится такая строка: '27 дн., 0:00:00' (нули обозначают
часы, минуты и секунды). Из этой информации тебе нужно
лишь число в начале строки, поэтому снова воспользуйся
командой split(). Введи выделенный черным код после
команд, добавленных на шаге 14: он превратит строку
в список number_of_days («количество дней»), состоящий
из трех элементов: '2 7 ','д н .' и '0 :00:00'.
events = g e t_ e v e n ts ()
today = d a te .to d a y ()
Отобрази результаты
Рассчитай количество дней, оставшихся до каждого
события из списка, и выведи результат на экран, —
для этого тебе понадобится цикл for. Вызывай функцию
days_between_dates() для каждого события, сохраняя
результат в переменной days_until («дней до»), а затем
выведи эти данные на экран с помощью функции
create_text() из модуля Tkinter. Введи эти строчки
после кода, добавленного на шаге 17.
v e rtic a l_ s p a c e = 100
fo r event in e ve n ts:
event_name = e v e n t[0]
d a y s _ u n til = d a ys_betw een _d ates(even t[1] , today)
d is p la y = '%s через %s д н .' % (event_nam e, d a ys__u n til)
c .c r e a t e _ t e x t (1 0 0 , v e r t ic a l_ s p a c e , an ch o r= 'w ', f i l l = ' l i g h t b l u e ', \
fo n t = 'A r ia l 28 b o ld ', te x t= d is p la y )
v e rt ic a l_ s p a c e = v e r t ic a l_ s p a c e + 30
Начинаем отсчет!
Готово! Ты написал весь код программы
«Календарь ожидания». Теперь запусти
ее и испытай в деле.
Что бы изменить?
Попробуй внести в программу несколько
изменений. Некоторые из них простые,
другие посложнее, но подсказки тебе
помогут.
Перекрась холст
с = C a n v a s(ro o t, width=800, height= 800, b g = 'g re en ')
Чтобы оживить внешний вид
программы, задай холсту другой
фоновый цвет. Для этого замени
строчку с = Canvas на эту. Цвет фона можно поменять .
на любой другой.
Отсортируй!
v e r t ic a l_ s p a c e = 100 Ставит события
Почему бы не сделать так, чтобы списка по порядку
события выводились по порядку? e v e n ts . sort(key= lam bda x : x [1 ]) в зависимости
Добавь прямо перед циклом for fo r event in e v e n ts : от количества
следующий код. Для сортировки оставшихся дней.
по возрастанию — от наименьшего
количества оставшихся дней
до наибольшего — в нем используется
функция sort() («сортировать»).
Апгрейд текста
Освежи вид графического окна, поменяв Укажи свой
размер, цвет и стиль заголовка. любимый цвет.
c .c r e a t e _ t e x t (1 0 0 , 50, a n ch o r= 'w ', f i l l = ' p ink' , fo n t= 'C o u rie r 36 bold u n d e r lin e ', \
t e x t = 'Долгожданные события')
Напоминания
Можно сделать так, чтобы события,
до которых осталось совсем мало
времени, подсвечивались. Пусть
события следующей недели
отображаются красным.
fo r event in e v e n ts:
event_name = e v e n t[0]
d a y s _ u n til = d a ys_b e tw e e n _d ate s(e ve n t[ 1 ] , today)
d is p la y = '%s через %s д н .' % ( d a y s _ u n t il, event_name)
if ( in t ( d a y s _ u n t il) <= 7 ) :
t e x t _ c o l = 're d '
Символ <= означает
e ls e : «меньше или равно».
t e x t _ c o l = 'lig h t b lu e ' Красит текст
c .c r e a t e _ t e x t (1 0 0 , v e r t ic a l_ s p a c e , an ch o r= 'w ', f i l l = t e x t _ c o l , \ в соответствующий
дате цвет.
f o n t = 'A r ia l 28 b o ld ', te x t= d is p la y )
Что п р о и с х о д и т
Перед пользователем появляется диалоговое окно
с просьбой ввести название страны. После ввода программа
сообщает название ее столицы. Если же компьютер не знает
ответ, то просит пользователя ввести название столицы
самому. Чем дольше люди будут взаимодействовать
с программой, тем умнее она станет!
Словари
Диалог с пользователем Названия стран и их столиц мы будем хранить
в словаре. Словарь в Python похож на список,
Программа использует два
каждый элемент которого состоит из двух
виджета модуля Tkinter.
частей: ключа и значения. Как правило,
Первый, sim pledialog
найти данные в словаре проще, чем в длинном
(«простой диалог»),
списке.
отображает всплывающее
окно с запросом страны.
Второй, messagebox
(«окно сообщения»), — Блок-схема программы
окно с названием столицы. «Знаток»
После запуска программа
считывает данные из тексто
СЛЕНГ вого файла. Затем входит
Экспертная система в бесконечный цикл, чтобы
задавать вопросы до тех
Экспертная система — это программа, которая пор, пока пользователь
является специалистом в конкретной области. ее не закроет.
Она знает ответы на многие вопросы, умеет
принимать решения и давать советы. Все это
возможно благодаря программисту, который
ввел в программу нужные данные, а также
правила их использования.
Автомобильный эксперт
Автомобильные компании создают экспертные
системы, которые знают всё о выпускаемых
машинах. Если автомобиль сломается, мастер
сервис-центра воспользуется одной-един
ственной экспертной системой вместо того,
чтобы обращаться к тысяче механиков!
П ервы е ш аги
Выполни эти шаги, чтобы создать свою
экспертную систему. Тебе нужно внести
названия стран и их столиц в текстовый
файл, а также создать окно Tkinter
и словарь для хранения данных.
Страна.* Столица.
Слеш ( / ) отделяет
название столицы
от названия страны.
Запусти Tkinter
Введи следующий код в окне программы. Он отобразит в окне
консоли название проекта, а также запустит модуль Tkinter,
который автоматически создаст ненужное нам окно (третьей
строчкой кода мы его закроем).
Подготовь словарь
th e_w o rld = { }
Введи после кода, добавленного
на шаге 5, эту строчку: она создаст
словарь the_world («мир»), в котором
будут храниться названия стран
и их столиц.
СОВЕТЫ ЭКСПЕРТА
Словарь
Словарь — это еще один способ хранить данные в Python.
Словарь похож на список, элементы которого состоят
из двух частей — ключа и значения. Попробуй ввести
этот код в окне консоли.
fa vo u rite _fo o d s = {'С а ш а ': 'п и ц ц а', 'М ила': 'о л а д ь и ', 'Р о м а ': 'п у д и н г'}
3. Мила подумала и решила, что суши 4. И, наконец, узнать, что любит Рома,
она любит больше, чем оладьи. Эти данные можно, просто указав его имя в качестве
в словаре можно обновить. ключа.
def r e a d _ f r o m _ f ile ( ) :
w ith open( 'c a p i t a l_ _ d a t a .t x t ', encoding=' u t f - 8 ') as f i l e :
fo r lin e in f i l e : Удаляет символ
lin e = l i n e . r s t r i p ( ' \ n ' ) «перевод строки».
Слово, стоящее перед Слово после слеша Символ '/' разделяет строку.
слешем, сохраняется сохраняется в переменной
в переменной country city («город»).
(«страна»).
Это ключ.
Вывод в файл
def w rite __to _file (c o u n try _n a m e , city_n a m e ):
Название столицы, которое введет
пользователь, нужно сохранить with open ('c a p it a l_ d a t a .t x t ', ' a ' , encoding='u tf-8 ') as f i l e :
в текстовом файле. Это называется
«вывод в файл». Работает он аналогично
вводу, но данные должны не считываться, Эта функция будет добавлять Буква «а» включает
а записываться. Для вывода в файл новые названия стран и их режим вывода в файл.
столиц в текстовый файл.
создай новую функцию write_to_file()
(«записать в файл») после кода,
добавленного на шаге 10.
Запиши данные в текстовый файл
Добавь код для записи новых данных. Сначала
программа запишет в текстовый файл символ
«перевод строки» (чтобы перейти на следующую
строку), затем название страны и через слеш (/)
название столицы. Например, так: Египет/Каир.
Python автоматически закроет текстовый файл
после того, как эти данные будут записаны.
О сн о в н о й код
Все необходимые функции написаны, пора
переходить к основному коду программы.
Вызов функции read_from_file()
(«считать из файла»).
re a d _ fro m _ file ()
w hile True:
query_country = s im p le d ia lo g .a s k s t r in g ('С т р а н а ', 'Введите название с тр а н ы :')
w hile T ru e :
q uery_co un try = s im p le d ia lo g .a s k s t r in g ('С тр ана' , 'Введите название с тр а н ы :')
Покажи ответ
Если в словаре the_world есть такая страна, нужно,
чтобы программа получила ее столицу и вывела
ответ на экран. Для этого воспользуйся функцией
messagebox.showinfo() («окно сообщения.показать
Ищет ответ в словаре,
информацию») из модуля Tkinter. Она покажет ответ используя значение переменной
в окошке с кнопкой ОК. Введи этот код после query_country («запрос страны») Не забудьсохранить
конструкции if. в качестве ключа. свою работу.
i f query_country in th e _w o rld :
re s u lt = th e _w o rld [q u e ry_co u n try]
m essagebox.show info(‘ О твет' ,
query__country + столица этой страны - ' + r e s u lt + ' ! ' )
e ls e : Просит пользователя ввести столицу
new _city = sim p le d ia lo g . a s k s t r in g ( 'Научите м еня', и помещает его ответ в переменную
new_city («новый город»).
'Я не знаю, ' +
'как называется столица страны ' + query__country + ' ! ' )
th e _w o rld [q u e ry_co u n try] = n e w _city
w r it e _ t o _ file (q u e r y _ c o u n t r y , n e w _city )
Добавляет значение переменной
new_city в словарь, используя
значение query_country как ключ.
root .m ainloop()
Что бы изменить?
Попробуй внести эти изменения,
чтобы вывести программу на новый
уровень и сделать ее еще умнее.
Вокруг света
Сделай из программы географического гения.
Для этого введи в текстовый файл названия
всех стран мира и их столиц. Не забудь,
что каждая запись должна идти отдельной
строкой и выглядеть так: Страна/Столица.
Регистр букв
Если пользователь забудет, что страну надо писать
с прописной буквы, программа не найдет ответ.
Как решить эту проблему? Вот один из способов.
Другие данные
Сейчас программа знает только страны и их столицы.
Это можно изменить, заполнив текстовый файл
сведениями из той области, в которой ты разбираешься,
Например, ввести в файл названия футбольных
команд и имена их тренеров.
Имя тренера.
Название команды.
Сверка фактов
def w rite _to _ file (c o u n try _ n a m e , city_n a m e ):
Программа записывает в текстовый
файл новые сведения, однако она w ith open( ' n e w _ d a t a .t x t', ' a ' , encoding= 'u t f - 8 ') as f i l e :
не может знать, верны ли они. f i l e . w r i t e ( ' \ n ' + country_name + ' / ' + city_name)
Измени код, чтобы новые ответы
попадали в отдельный текстовый
файл. Потом ты сможешь просмотреть Сохраняет новые данные
его, исправить и добавить верные в текстовый файл
сведения в основной файл. new_data.txt («новые
данные»).
«Тайная переписка» СЛЕНГ
Криптография
Стань криптографом и отправь друзьям С лово « кр и п то гр аф и я» о б р азо ван о
зашифрованные сообщения — так, от гр е ч е ск и х сло в «скр ы ты й » и «письм о».
чтобы не посвященные в вашу тайну О коло 4 00 0 л е т эта наука и зуч ае т ш иф ры ,
котор ы е лю ди пр и д ум ы ваю т д л я обм ена
люди не смогли ничего понять! секр е тн ы м и со о б щ ен и ям и .
Поделись кодом
Если передашь код
программы другу, вы
сможете обмениваться
с ним секретными
сообщениями.
Как это р а б о т а е т
Программа меняет порядок букв в сообщении, делая
его нечитаемым. Для этого она выясняет, какие буквы
стоят в четных, а какие — в нечетных позициях, и меняет
местами сначала буквы в первой паре, затем во второй
и т. д. Кроме того, программа может снова сделать
зашифрованное сообщение понятным, вернув буквы
на прежние места.
Шифрование Дешифровка
После ввода сообщения в программу Когда ты или твой друг расшифровываете
она меняет местами буквы внутри сообщение, программа ставит буквы
каждой пары, скрывая смысл текста. на прежние места.
Блок-схема программы
«Тайная переписка»
В коде используется бесконечный цикл
с вопросом, желает ли пользователь
зашифровать или расшифровать текст.
Этот выбор определяет дальнейшие
действия программы. Запрос данных
и вывод сообщений производятся
с помощью диалоговых окон. Программа
завершает свою работу при вводе
любого ответа, кроме «зашифровать»
или «расшифровать».
Пользователь вводит
что-либо, кроме
«зашифровать»
или «расшифровать»
Загадочный «икс»
Программе нужно, чтобы в сообщении было
четное количество символов (включая пробелы).
Если пользователь введет нечетное количество
знаков, программа добавит в конец букву х («икс»).
Тебе и твоим друзьям-агентам это не помешает,
ведь вы знаете, что «икс» ничего не значит!
С о зд а н и е G U I
Тебе предстоит писать код в 2 этапа: сначала создать
функции, запрашивающие ввод пользователя, а затем —
код шифрования и дешифровки. Приступай не мешкая:
отправить кому-нибудь секретное сообщение может
понадобиться в любой момент!
def g e t _ t a s k ( ) :
ta sk = s im p le d ia lo g .a s k s t r in g ('З а д а н и е ', 'Что сделать: зашифровать или расшифровать?')
re tu rn ta s k
Введи сообщение
Создай функцию get_message() («получить сообщение»),
Эта строчка предлагает
которая будет выводить на экран окошко с запросом текста пользователю ввести
для шифрования или дешифровки. Добавь ее после кода, сообщение и сохраняет
введенного на шаге 3. его в переменной message.
w hile True:
Запрашивает задание.
task = g e t _ ta s k ()
i f ta sk == 'зашифровать': Получает открытый текст.
message = get_m essage() Выводит сообщение
в диалоговом окне.
m essagebox.show info('Сообщение для зашифровки:', message)
e l i f ta sk == 'расшифровать': Получает зашифрованный
Выводит сообщение
message = get_m essage() текст.
в диалоговом окне.
m essagebox.show info('Сообщение для дешифровки:', message)
e ls e :
break Завершает цикл при вводе чего-либо, кроме
слов «зашифровать» или «расшифровать».
Введи нужное
тебе действие.
Четное ли количество?
Нам понадобится функция, которая проверяет, четное
ли количество символов во введенном пользователем
сообщении. При помощи оператора % она узнаёт,
делится ли это число на 2 без остатка. Если делится, СОВЕТЫ ЭКСПЕРТА
значит, символов четное количество. Добавь функцию О статок от деления (%)
is_even() («является четным числом») после кода,
введенного на шаге 2. Если между двумя числами поставить
оператор %, Python выдаст остаток
от деления первого числа на второе.
def is_e v e n (n u m b e r): Таким образом, 4 % 2 будет 0,
а 5 % 2 — 1, поскольку 5 не делится
re tu rn number % 2 == 0
на 2 без остатка, а остаток от деления —
число 1. Проверь работу этого оператора
Возвращает True Вернет True, если число в окне консоли.
или False в код, вызываю четное.
щий функцию is_even().
Целочисленные позиции
В цикле for используется значение
>>> m ystrin g = 'се кр е т'
len(message)/2, поскольку списки
с буквами в четных и нечетных >>> m y s trin g [3 .0 ]
позициях вдвое короче, чем исходное Traceback (most recen t c a l l l a s t ) :
сообщение. Тем не менее при делении
F i l e "< p y s h e ll# l> " , lin e 1 , in <module>
получится вещественное число (такое,
как 3.0 или 4.0), а не целое (3 или 4). m y s trin g [3 .0 ]
Python выдает ошибку при попытке T y p e E rro r: s t r in g in d ic e s must be in te g e rs
использовать вещественное число
в качестве позиции в списке, поэтому
нам понадобится функция int(),
превращающая вещественное Указав позицию в списке в виде
вещественного числа (3.0 вместо
число в целое.
целого 3), ты увидишь такое
сообщение об ошибке.
Измени цикл
Функция swap_letters() обладает ценным
свойством: если применить ее к зашифрованному
сообщению, она его расшифрует. Иначе говоря,
функция годится как для шифрования, так и для
дешифровки. Внеси эти исправления в цикл while,
созданный на шаге 6.
w h ile T ru e :
ta s k = g e t _ t a s k () Использует swap_letters()
для зашифровки сообщения.
i f ta sk == 'зашифровать':
message = get_m essage() Показывает зашифрованное
encrypted = sw ap _le tte rs(m e ssa g e ) сообщение.
Расшифруй это!
Твоя программа-дешифровщик
готова. Проверь ее, расшифровав
эти строки. Теперь можешь
передать код своему другу
и начать секретную переписку!
Что бы изменить?
Вот несколько способов усложнить
жизнь вражескому агенту (например,
любопытному брату или сестре),
который может перехватить твои
сообщения.
Убери пробелы
Один из способов сделать шифровку
более надежной — убрать из текста
все пробелы и знаки препинания
(точки, запятые и т. д.). Просто введи
сообщение без них и предупреди
друга, что так и задумано.
Задом наперед
Чтобы взломать шифр стало еще сложнее, поменяй порядок
букв в тексте, зашифрованном функцией sw ap _letters(),
на обратный. Для этого тебе пригодятся две отдельные
Меняет порядок букв
функции для шифрования и дешифровки. на обратный после
перестановки букв в парах.
Функция шифрования
def e n cry p t(m e ssa g e ):
Пусть функция encrypt()
(«зашифровать») меняет swapped_message = sw a p _le tte rs(m e ssa g e )
местами буквы в парах, encrypted_m essage = ' ' .jo in (reversed (sw ap p ed _m essag e))
а затем меняет порядок
букв в строке на обратный. re tu rn encrypted_m essage
Введи эти строчки после
функции swap_letters().
Отменяет обратный порядок букв.
Функция дешифровки
def d e c ry p t(m e ssa g e ):
Добавь функцию decrypt()
(«дешифровать») после функции unreversed_m essage = ' ' . jo in (re v e rs e d (m e s s a g e ))
encrypt(). Она сначала «разво decrypted_m essage = sw ap _le tte rs(u n re verse d _m e ssag e )
рачивает» зашифрованный
текст, а потом восстанавливает re tu rn decrypted_jnessage
порядок букв с помощью
swap_letters(). Меняет местами буквы
в парах, возвращая их
Измени код цикла в исходное положение.
Незабудьсохранить
Измени код бесконечного цикла так, свою работу.
чтобы вместо swap_letters() в нем
вызывались новые функции.
w h ile T ru e :
ta sk = g e t _ t a s k ()
i f ta sk == 'зашифровать': Замени функцию swap_letters()
на encrypt().
message = get_m essage()
encrypted = encrypt(m essage)
m essagebo x.show info ('Зашифрованное сообщ ение:', encryp ted )
e l i f ta s k == 'расшифровать': Замени функцию swap_letters()
на decryptO.
message = get_m essage()
decrypted = decrypt(m essage)
m essagebo x.show info ('Расшифрованное сообщ ение:', decrypted)
e ls e :
break
Д обавь лиш ние буквы
Еще один способ усложнить шифровку —
добавить после каждого символа по случайной
букве. Так слово «секрет» может превратиться
в «сбегкираеато» или «сневкариежте». Как и для
трюка с разворачиванием строки, тут нужны
две функции.
«Лишние» буквы
помечены зеленым.
Зашифруй
Для шифрования нужен список с буквами, которые мы
будем вставлять в сообщение. Следующий код перебирает
символы сообщения в цикле, каждый раз добавляя в список
encrypted_ list («список для шифрования») по одной
исходной и одной «лишней» букве.
w h ile T ru e :
ta sk = g e t _ t a s k ()
i f ta sk == 'зашифровать':
message = get_m essage()
encrypted = encrypt(m essage)
m essagebo x.show info ('Зашифрованное сообщ ение:', encryp ted )
e l i f ta s k == 'расшифровать':
message = get_m essage()
decrypted = decrypt(m essage)
m essagebo x.show info (' Расшифрованное сообщ ение:', decrypted)
e ls e :
break
> Мультишифрование
Чтобы еще больше усложнить шифр, можно
использовать в программе сразу все хитрости
из этого раздела: добавить лишние буквы,
поменять местами буквы в парах, а затем
изменить порядок букв на обратный!
«Экранный питомец»
Ты хотел бы, чтобы во время выполнения на компьютере
домашней работы тебя развлекал милый зверек?
Цель этого проекта — создать компьютерного
питомца. С ним не заскучаешь, ведь для счастья
ему нужны уход и внимание.
Счастливая мордашка
Что п р о и с х о д и т Щеки питомца покроются
румянцем, если ты
Сразу после запуска программы на экране появится зверек «погладишь» его мышкой.
небесно-голубого цвета, который будет улыбаться и моргать.
Выражение мордочки этого милого создания будет
то нейтральным (как на картинке внизу), то счастливым,
то нахальным, то грустным — в зависимости оттого, как ты
к нему относишься. Не бойся, кусаться он точно не станет!
Нахальная мордашка
Если «пощекочешь»
зверька двойным кликом
мышки, он покажет язык.
Грустная мордашка
Если забыть про зверька,
он загрустит. «Погладь»
его, чтобы питомец снова
повеселел.
Анимация
Кроме того, функция
ro o t.m ain lo o p () подходит
для создания анимации.
Поручи ей вызов функций,
меняющих картинку в заданные
моменты времени, и зверек
«оживет».
СЛЕНГ
Код, управляем ы й собы тиями
«Экранный питомец» — программа,
управляемая событиями. Это значит, что ее
работа зависит от пользовательского ввода.
Программа ожидает событий, таких как
нажатие клавиши или клик мышкой, вызывая
разные функции для их обработки. Текстовые
и графические редакторы, видеоигры — все
это программы, управляемые событиями.
Рисуем з в е р ь к а
Итак, приступим. Сначала нужно
создать окно, в котором будет жить
экранный питомец, а затем — код,
который его нарисует.
Создай холст
from t k in t e r import HIDDEN, NORMAL, T k , Canvas
Создай холст синего цвета с именем
«с». На нем ты будешь рисовать root = T k ()
зверька. Введи этот код после
c = C a n v a s(ro o t, width=400 , height=400)
команды, создающей окно Tkinter.
Эти 4 строчки — начало основного c .c o n fig u re (b g = 'd a rk b lu e ', h ig h lig h tth ic k n e s s = 0 )
кода. c .p a c k ()
Упорядочивает содержимое
ro o t.m a in lo o p () окна Tkinter.
Все команды с «с.» в начале
относятся к холсту.
Запускает функцию,
которая отслеживает
события, такие
Запусти программу как клики мышкой.
Запусти программу. Что ты видишь?
На экране должно появиться пустое
синее окно. Пока что оно выглядит
уныло, но вскоре здесь появится
зверек!
Незабудь сохранить
своюработу.
Нарисуй экранного питомца
Сохраняет цвет зверька
Чтобы изобразить зверька, введи этот код перед последними двумя в переменной c.body_color
строчками. Каждая часть питомца рисуется отдельной командой. Числа («цвет туловища»), чтобы
(координаты) указывают, в каком месте они должны располагаться. не вводить каждый раз 'SkyBlue1'.
left и right
e y e _ le f t = c .c r e a t e _ o v a l(1 3 0 , 110, 160, 170, o u t lin e = 'b la c k ', f i l l ='w h it e ' )
обозначают здесь
p u p il_ le f t = c .c r e a t e _ o v a l(1 4 0 , 145, 150, 155, o u t lin e = 'b la c k ', f i l l = 'b la c k ') левую и правую
стороны окна.
e y e _ rig h t = c .c r e a t e _ o v a l(2 3 0 , 110, 260, 170, o u t lin e = 'b la c k ', f i l l = ' w h i t e ' )
p u p il_ r ig h t = c .c r e a t e _ o v a l(2 4 0 , 145, 250, 155, o u t lin e = 'b la c k ', f i l l = 'b la c k ')
mouth_normal = c .c r e a t e _ lin e ( 1 7 0 , 250, 200, 272, 230, 250, smooth=1 , width=2, state=NORMAL)
СОВЕТЫ ЭКСПЕРТА
Координаты T kinter
В командах рисования Координаты записываются
используются х- и у-коор парами, начиная с х.
динаты. Левому краю окна
T k in t e r соответствует
х-координата 0. Значение х
возрастает слева направо,
достигая 400 у правой
границы. Верхнему краю
окна соответствуету-коорди
ната 0, а нижнему — 400. Снова запусти программу
Запусти программу:
в середине окна Tkinter
должен появиться твой
экранный питомец!
М оргаю щ ий зверек
Выглядит экранный питомец мило, однако он совершенно
неподвижен! Научи его моргать с помощью двух функций:
одна будет открывать и закрывать глаза, а другая —
указывать, сколько им быть открытыми и закрытыми.
СЛЕНГ
Переключение
Смена состояния на противоположное называется
переключением. Это подобно тому, как с помощью
кнопки выключателя ты то включаешь, то выключа
ешь свет в комнате. Код моргания «переключает»
состояние глаз: «закрывает» их, если они открыты,
и «открывает», если закрыты.
Научи питомца моргать
с . ite m c o n fig u re (e y e _ rig h t, fill= n e w _ c o lo r)
Моргание можно показать, сделав
так, чтобы глаза долго оставались Закрывает
открытыми, а закрывались лишь def b l i n k ( ) : глаза.
на мгновение. Добавь после кода, Открывает глаза через
to g g le _e y e s () 250 миллисекунд.
введенного на шаге 7, функцию
blink() («моргать»). Она «закрывает» r o o t .a f t e r (250, to g g le _e ye s)
глаза зверька на четверть секунды
ro o t. a f t e r (3000, b lin k )
(250 миллисекунд), а затем просит Заставляет зверька
функцию m a in lo o p () снова снова моргнуть через
вызвать ее через 3 секунды root = T k () 3000 миллисекунд.
(3000 миллисекунд).
Создай анимацию!
Добавь эту команду в основной код, прямо
перед последней строкой, и запусти программу. ro o t. a f t e r (1000, b lin k )
Ждет 1000 миллисекунд
Через 1 секунду (1000 миллисекунд) твой ro o t.m a in lo o p () и включает моргание.
питомец моргнет и будет это делать, пока
ты не закроешь окно.
Смена настроения
Сейчас зверек выглядит довольным, но давай
сделаем его еще более радостным — добавим
счастливую улыбку и яркий румянец!
Счастливая мордочка
Добавь этот код к командам создания зверька после
строки, рисующей «нейтральный» рот. Кроме счаст
ливой улыбки и румянца этот код также создает
«грустный» рот, но пока все эти рисунки невидимы.
mouth_normal = c .c r e a t e _ lin e ( 1 7 0 , 250 ,20 0 , 272, 230, 250, smooth=1 , width=2, state=NORMAL)
mouth_happy = c .c r e a t e _ lin e ( 1 7 0 , 250, 200, 282, 230, 250, smooth=1 , width=2, state=HIDDEN)
mouth_sad = c .c r e a t e _ lin e ( 1 7 0 , 250, 200, 232, 230, 250, smooth=1 , width=2, state=HIDDEN)
c h e e k _ le ft = c .c r e a t e _ o v a l(7 0 , 180, 120, 230, o u t lin e = 'p in k ', f i l l = 'p in k ', state=HIDDEN)
c h e e k _rig h t = c .c r e a t e _ o v a l(280, 180, 330, 230, o u t lin e = 'p in k ', f i l l = ' p i n k ' , state=HIDDEN)
re tu rn
Прячет «грустный» рот.
К а к о в нахал!
До сих пор твой питомец вел себя примерно. Давай
добавим ему нахальства! Напиши код, благодаря
которому зверек высунет язык и скосит глаза, если
ты «пощекочешь» его двойным кликом мышки.
Нарисуй язык
Добавь эти строчки в код рисования зверька после
команды, изображающей «грустный» рот. Язык будет
состоять из двух фигур: прямоугольника и овала.
mouth_sad = c .c r e a t e _ lin e ( 1 7 0 , 250, 200, 232, 230, 250, smooth=1 , width=2, state=HIDDEN)
tongue_main = c .c r e a t e _ r e c t a n g le (1 7 0 , 250, 230, 270, o u tlin e = 'r e d ' , f i l l = ' r e d ' , state=HIDDEN)
tong ue_tip = c .c r e a t e _ o v a l(1 7 0 , 250, 230, 300, o u tlin e = 'r e d ' , f i l t e r e d ' , state=HIDDEN)
cheek_ l e f t = c .c r e a t e _ o v a l(7 0 , 180, 120, 230, o u t lin e = 'p in k ', f i l l ='p in k ', state=HIDDEN)
Настрой флаговые переменные
СОВЕТЫ ЭКСПЕРТА
Добавь две флаговые переменные, чтобы
отслеживать, скошены ли зрачки зверька Ф лаговы е перем енны е
и высунут ли его язык. Введи этот код перед
строкой, запускающей моргание, которую Флаговые переменные позволяют отслеживать
ты добавил в основной код на шаге 9. что-либо, находящееся в одном из двух состояний.
Изменив состояние, флаг нужно обновить.
Табличка «занято/свободно» на дверях
туалета — такой же флаг: закрывая дверь,
c.e yes_cro sse d = F a lse
ты включаешь режим «занято», а открывая —
c.tongue_out = F a lse режим «свободно».
r o o t .a f t e r (1000, b lin k )
Флаговые переменные
для зрачков и языка.
«Переключи» язык
Функция toggle_tongue() («переключить язык»)
«переключает» положение языка, делая его или
высунутым, или убранным. Введи этот код перед
функцией show_happy(), созданной на шаге 11.
Возвращает зрачки
в нормальное состояние
через 1 секунду
Свяжи двойной клик с нахальством (1000 миллисекунд).
Чтобы управлять нахальством зверька, свяжи событие «двойной
клик» с функцией cheeky() («нахальный»). Введи эту строчку кода
после команды, добавленной на шаге 14. Запусти программу,
сделай двойной клик в окне и полюбуйся на нахала!
Вызови функцию
Введи следующую строчку кода после команды моргания, добавленной
на шаге 9. Это указание через 5 секунд (5000 миллисекунд) вызвать
функцию sad() («грустный»), которую тебе предстоит создать на шаге 23.
ro o t. a f t e r (1000, b lin k )
ro o t. a f t e r (5000, sad)
root .m ainloop()
Больш е радости
Похож ли твой зверек на идеального Приятно то и дело гладить зверька,
питомца? Если нет, можешь изменить его однако это отвлекает от выполнения
повадки или добавить программе новые домашней работы. Чтобы твой
питомец расстраивался не так часто,
возможности. Вот несколько советов. увеличь максимальный уровень его
настроения.
Радуж ны й з в е р е к
Изменив значение переменной c.body_color, можно
покрасить экранного питомца в любой другой цвет.
Не знаешь, какой выбрать? Тогда напиши функцию,
постоянно меняющую цвет зверька!
П о к о р м и м еня!
Помимо щекотки и поглаживаний, питомцы
нуждаются в еде. Подумай, как можно
накормить экранного жителя. Растущему организму
нужно много еды!
Размер окна
Убери за мной!
Раз экранный питомец ест, значит, Если добавить в окно питомца кнопки
он должен и какать! Пускай после или другие элементы интерфейса, зверьку
кормления зверька в окне возникает может стать тесно. В этом случае увеличь
теплая кучка. Добавь кнопку размер окна Tkinter, поменяв его ширину
«Убрать туалет», связав ее нажатие и высоту в строке, создающей холст
с функцией, убирающей кучку в начале программы.
с экрана.
Игры
на Python
« Гусеница»
Если ты так долго сидишь за компьютером, что успел
проголодаться, знай: ты не одинок. Встречай звезду
этого проекта — прожорливую гусеницу! С помощью
модуля turtle ты научишься анимировать ее и других
персонажей, а также управлять ими с клавиатуры.
Что п р о и с х о д и т
С помощью клавиш-стрелок игрок управляет гусеницей.
Каждый съеденный ею лист приносит очки, а также
повышает уровень сложности игры, делая гусеницу
длиннее и проворнее. Не выпускай ее за пределы
графического окна, иначе игре конец!
Счет выводится
в правом верхнем углу
игрового окна.
Съеденный гусеницей
лист исчезает, а затем
в другом месте игрового
поля появляется новый.
Возрастание сложности
Чем больше листьев съест
гусеница, тем сложнее
станет игра. По мере того
как наша героиня растет
и ускоряется, игроку тоже
придется действовать
энергичнее, иначе гусеница
выйдет за пределы
графического окна.
К ак это р а б о т а е т
В этом проекте используются две основные черепашки:
одна рисует гусеницу, другая — листья. Новые листья
возникают в случайных местах графического окна. Обнаружив,
что гусеница съела лист, программа увеличивает значения
переменных, хранящих счет игры, скорость гусеницы и ее
длину. Функция проверяет, вышла ли гусеница за пределы
окна, и если это так, то игра прекращается.
Первые шаги
Код для этой веселой игры на удив
ление прост. Тебе предстоит задать
параметры черепашек, написать код
основного цикла и настроить интер
фейс для управления гусеницей.
Приступим
Открой IDLE, создай новый файл
и сохрани его как caterpillar.py
(«гусеница»).
Загрузи модули
Добавь в программу команды,
импортирующие модули turtle
и random. Третья строчка кода
задает фоновый цвет игрового
окна.
Добавь текст
game__started = F a ls e
Создай еще двух черепашек —
для вывода текста. Одна будет t e x t _ t u r t le = t . T u r t l e ()
сообщать, что для начала игры t e x t _ t u r t le .w r it e ('Нажмите ПРОБЕЛ, чтобы начать и г р у ',\
следует нажать ПРОБЕЛ, а другая -
показывать в углу экрана счет. a lig n = 'c e n t e r ' , fo n t = (' A r i a l ' , 16, 'b o ld '))
Добавь эти строчки после кода, t e x t _ t u r t l e .h i d e t u r t l e ()
введенного на шаге 4. Отображает на экране
текст.
s c o r e _ t u r t le = t . T u r t l e ()
s c o r e _ t u r t le .h id e t u r t le () Прячет черепашку,
Создает черепашку, оставляя текст.
выводящую на экран счет. s c o r e _ t u r t le . speed(0 )
def o u ts id e _w in d o w ():
pass
СОВЕТЫ ЭКСПЕРТА
def g a m e_o ver():
Чтобы скорее
Заглушка pass pass получить
работающую
Если пока неясно, что будет основу программы
внутри функции, в ее теле (кото def d is p la y _ s c o r e (c u r r e n t _ s c o r e ): (скелет), можно
рое нельзя оставлять пустым) использовать
pass заглушки для
помещают команду-заглушку
функций, код
pass, чтобы вернуться к ней которых еще
позже и добавить в функцию def p la c e _ le a f( ) : не написан.
рабочий код. pass
Подготовься к запуску
def s t a r t _ g a m e ():
После четырех функций
с заглушками добавь функцию g lo b a l gam e_started
Если игра уже началась,
start_game() («начать игру»). i f gam e_started : команда return завершит
Она создает ряд переменных, вызов функции start_game(),
которые задают параметры re tu rn
когда та запустится повторно.
экрана и анимации перед gam e_started = True
началом игры.
sco re = 0
t e x t _ t u r t i e . c l e a r ()
Черепашка
создает гусеницу Очищает экран
нужной формы. c a t e r p illa r _ s p e e d = 2 от сообщений.
c a t e r p i l l a r _ l ength = 3
c a t e r p illa r .s h a p e s i z e ( 4 , c a t e r p illa r _ l ength, 1)
c a t e r p i l l a r .s h o w tu rtle ()
d is p la y _ s c o re (s c o re )
p la ce _ l e a f ( )
Создает на экране
первый лист.
Движущий цикл
Код основного цикла сдвигает гусеницу вперед
и проверяет 2 вещи. Во-первых, доползла ли
она до листа. Если это так, счет увеличивается,
на экране появляется новый лист, гусеница
становится длиннее и проворнее. Во-вторых,
не вышла ли гусеница за пределы окна. Если
это так, игра заканчивается. Добавь основной
цикл после кода, введенного на шаге 7.
p la c e _ le a f()
Если между
гусеницей и листом
меньше 20 пикселей,
w h ile T ru e :
она его съедает.
c a t e r p illa r .f o r w a r d ( c a t e r p illa r _ s p e e d )
Лист съеден, значит,
i f c a t e r p illa r .d is t a n c e ( le a f ) < 20: нужно создать
p la c e _ le a f () новый.
c a t e r p i l l a r _ l ength = c a t e r p i l l a r _ l ength + 1
c a t e r p illa r .s h a p e s i z e ( l, c a t e r p i l l a r _ l ength, 1)
c a t e r p illa r _ s p e e d = c a te rp illa r__ s p e e d + 1 Увеличивают
score = sco re + 10 длину гусеницы.
d is p la y _ s c o re (s c o re )
i f o u tsid e _w in d o w ():
game_over()
break
Конец игры!
Пускай, если гусеница выползет за край, на экране
появится сообщение о завершении игры. Добавь
в функцию game_over() («конец игры») код,
который спрячет гусеницу и лист, а затем выведет
надпись «Конец игры!».
Разверни гусеницу
game_over()
Для управления гусеницей
с помощью клавиатуры break
понадобятся 4 новые
функции — по одной для
def m ove_up():
каждого направления
движения. Создай их после i f c a t e r p illa r .h e a d in g ( ) == 0 or c a t e r p illa r .h e a d in g () == 180:
функции start_game(). c a t e r p illa r .s e t h e a d in g (90) Проверяет, ползет ли гусеница
Чтобы игра не выглядела вправо или влево.
слишком простой, нужно
научить гусеницу делать def move_down():
повороты только на 90°. i f c a t e r p illa r .h e a d in g () == 0 or c a t e r p illa r .h e a d in g () == 180:
Каждая функция сначала
c a t e r p i l l a r . se th e ad in g (270)
проверяет, куда ползет
Аргумент 270 разворачивает
гусеница, и с помощью
гусеницу вниз.
функции setheading() def m o v e _ le ft ():
меняет ее курс, если
i f c a t e r p illa r .h e a d in g ( ) == 90 or c a t e r p illa r .h e a d in g () == 270:
это возможно.
c a t e r p i l l a r . se th e ad in g (180)
Что бы изменить?
Теперь, когда игра готова, усовершенствовать
ее будет несложно. Давай добавим вторую
гусеницу — помощника или соперника!
И гр а д ля д в у х и г р о к о в
Если создать вторую гусеницу, управляемую другими
клавишами, ты сможешь позвать в игру друга, и тогда
гусеницы съедят в 2 раза больше листьев!
score = 0
t e x t _ t u r t l e .c l e a r ()
c a te rp illa r_ s p e e d = 2
c a t e r p illa r _ l ength = 3
c a t e r p illa r .s h a p e s iz e ( 1 , c a t e r p illa r _ le n g t h , 1) Задает начальную длину
второй гусеницы.
c a t e r p illa r .s h o w t u г t i e ()
c a t e r p illa r 2 .s h a p e s iz e ( 1 , c a t e r p i l l a r _ l e n g th , 1)
c a t e r p i l l a r 2 . seth ead in g (1 80 )
c a t e r p i l l a r 2 .s h o w tu rtle ()
d is p la y _ s c o re (s c o re ) Разворачивает вторую
гусеницу влево.
p la c e _ le a f()
w h ile T ru e :
При каждом проходе цикла
c a t e r p i l l a r .fo rw a rd (c a te rp illa r_ s p e e d ) вторая гусеница сдвигается
c a t e r p i l l a r 2 .fo r w a rd (c a te rp illa r_ s p e e d ) вперед.
score = score + 10
d is p la y _ s c o re (s c o re )
i f o u tsid e _w in d o w (cate rp illa r) or o u ts id e _w in d o w (c a te rp illa r2 ): Вышла ли вторая
гусеница за пределы
game_over () окна?
Управляй!
def c a t e r p illa r 2 _ m o v e _ u p ():
Назначь клавиши
управления второй i f c a t e r p illa r 2 .h e a d in g () == 0 or c a t e rp illa r2 .h e a d in g () == 180:
гусеницей. В нашем c a t e r p i l l a r 2 . se th e ad in g (9 0 )
случае это будут
w (вверх), а (влево),
s (вниз) и d (вправо), def c a te rp illa r2 _ m o v e _ d o w n ():
но ты можешь выбрать
i f c a t e r p illa r 2 .h e a d in g ( ) == 0 or c a t e r p illa r 2 .h e a d in g () == 180:
любой другой вариант.
Также тебе понадобят c a te rp il l a r 2 .setheading (270)
ся 4 новые функции
и 4 вызова onkey(),
которые свяжут эти def c a te rp illa r2 _ m o v e _ l e f t ( ) :
функции с клавишами. i f c a t e r p illa r 2 .h e a d in g ( ) == 90 or c a t e r p illa r 2 .h e a d in g () == 270:
c a t e r p illa r 2 .s e t h e a d in g (180)
Игра-состязание
Подумай, как можно доработать программу, чтобы она
сохраняла счет каждого игрока, а в конце объявляла
победителя. Подсказка: для хранения счета второго
игрока понадобится еще одна переменная. Когда
чья-нибудь гусеница съест лист, нужно увеличить счет
только этого игрока. И наконец, когда игра завершится,
необходимо сравнить очки и узнать, кто победил.
«Снэп»
Сразись с друзьями в цифровую версию карточной
игры «Снэп»! Эта динамичная игра для двоих
требует внимательности и молниеносной реакции.
Вместо карт на экране будут появляться цветные
фигуры.
V Запуск игры
Игра работает в окне Tkinter.
Что п р о и с х о д и т
При запуске программы оно
На экране сменяют друг друга фигуры разных цветов: черные, может открыться позади
красные, зеленые, синие. Когда один цвет выпадает второй раз других окон, так что его
не будет видно. В этом
подряд, нужно нажать кнопку «снэп» (для первого игрока это
случае подвинь окна IDLE,
клавиша q, а для второго р) и получить очко. Если нажать однако не мешкай, ведь
кнопку не вовремя, очко снимается. Набравший большее фигуры начинают появляться
количество очков побеждает. на экране через 3 секунды
после запуска игры.
Блок-схема программы
«Снэп»
Игра продолжается, пока все
фигуры не будут показаны. Игроки
нажимают клавиши, и программа
обрабатывает эти нажатия. Когда
фигур не остается, объявляется
победитель, и игра заканчивается.
СОВЕТЫ ЭКСПЕРТА
Функция sleep ()
Если ты попросишь
компьютерную программу
показать фигуру и тут же ее
убрать, это произойдет так
быстро, что пользователь
ничего не заметит. Чтобы
такого не произошло, в игре
«Снэп» используется функция
sleep() («спать») из модуля
time, которая выдерживает
паузу в заданное количество
секунд. Так, команда
time.sleep( ) ) приостановит
выполнение программы
на 1 секунду.
Приступим
Сначала нужно загрузить модули и настроить
графический интерфейс пользователя (GUI).
Затем — создать холст для рисования фигур.
Загрузи модули
im port random
Загрузи модули random, time и части модуля
Tkinter. Time позволит делать паузы, чтобы im port time
игрок успел прочитать надписи «СНЭП!» from t k in t e r im port T k , Canvas, HIDDEN, NORMAL
и «МИМО!» перед показом следующей фигуры.
Режим HIDDEN поможет спрятать фигуры,
Tkinter нужен
а режим NORMAL — показывать их по одной для создания GUI.
(иначе будут видны все фигуры сразу).
Настрой GUI
from t k in t e r im port T k , Canvas, HIDDEN, NORMAL
Введи следующий код, в котором создается
окно Tkinter с заголовком «Снэп». Проверь
работу программы, запустив ее. Окно игры root = T k ()
может открыться позади других окон —
тогда сдвинь их или сверни. r o o t . t i t l e ( 'С н э п ')
Р и со ван и е ф и гур
Создать фигуры тебе поможет функция виджета Canvas.
Она нарисует круги, квадраты и прямоугольники
четырех разных цветов.
c i r c l e = с . c r e a t e _ o v a l(3 5 , 20, 365, 350, o u t lin e = 'b la c k ', f i l l = 'b la c k ', state=HIDDEN)
s h a p e s .a p p e n d (c irc le )
c i r c l e = c .c r e a t e _ o v a l(3 5 , 20, 365, 350, o u t lin e = 'r e d ' , f i l l = ' r e d ' , state=HIDDEN)
s h a p e s .a p p e n d (c irc le )
c i r c l e = c .c r e a t e _ o v a l(3 5 , 20, 365, 350, o u tlin e = 'g re e n ' f i l l = ' g r e e n ' , state=HIDDEN)
sh a p e s. a p p e n d (c irc le )
c i r c l e = c .c r e a t e _ o v a l(3 5 , 20, 365, 350, o u t lin e = 'b lu e ', f i l l = ' b l u e ' , state=HIDDEN)
sh ap e s. a p p e n d (c irc le )
c .p ack()
sh a p e s.ap p e n d (circle )
rectang le = c .c r e a t e _ r e c t a n g le ( 3 5 , 100, 365, 270, o u tlin e = ' b l a c k ', f i l l =' b l a c k ', state=HIDDEN)
shapes. append (rectangle)
rectang le = c .c r e a t e _ r e c t a n g le (3 5 , 100, 365, 270, o u t lin e = 'r e d ' , f i l l = ' r e d ' , state=HIDDEN)
shapes. ap pend (rectangle)
rectan g le = c .c r e a t e _ r e c t a n g le (3 5 , 100, 365, 270, o u tlin e = ' g re e n ' , f i l l = 'g re e n ' , state=HIDDEN)
shapes. append( re c ta n g le )
rectan g le = c .c r e a t e _ r e c t a n g le (3 5 , 100, 365, 270, o u t lin e = 'b lu e ', f i l l = ' b l u e ' , state=HIDDEN)
shap es.ap p end (rectang le)
c .p a c k ()
Добавь квадраты
Теперь создай квадраты. Их можно рисовать
той же функцией, что и прямоугольники,
сделав все стороны одинаковыми. Введи
эти строчки после кода, добавленного
на шаге 8, и перед вызовом с.раск().
square = c .c r e a t e _ r e c t a n g le (3 5 , 20, 365, 350, o u t lin e = 'b la c k ', f i l l = 'b l a c k ', state=HIDDEN)
shapes. append(square)
square = c .c r e a t e _ r e c t a n g le (3 5 , 20, 365, 350, o u t lin e = 'r e d ' , f i l l = ' r e d ' , state=HIDDEN)
shapes.append(square)
square = c .c r e a t e _ r e c t a n g le (3 5 , 20, 365, 350, o u tlin e = 'g re e n ' , f i l l = ' g r e e n ' , state=HIDDEN)
shapes. append(square)
square = c .c r e a t e _ r e c t a n g le (3 5 , 20, 365, 350, o u t lin e = 'b lu e ' , f i l l = ' b l u e ' , state=HIDDEN)
shapes.append(square)
c .p a c k ()
Перемешай фигуры
ra n d o m .sh u ffle (sh a p e s)
Чтобы фигуры появлялись вразнобой, их нужно
«перемешать» — как колоду карт. Для этого
подойдет функция shuffle() из модуля random.
Добавь эту строчку кода после вызова с.раск().
П о д г о т о в к а к и гр е СОВЕТЫ ЭКСПЕРТА
Следующий этап — это создание нескольких Ничто им еет значение
переменных и написание вспомогательных
частей кода. Однако до запуска самой игры Программисты часто присваивают переменным
начальное значение 0, например переменной,
дело пока не дойдет.
хранящей счет. Но что делать, если в переменной
должна быть строка, а не число? Тогда после
«равно» можно поставить пару кавычек,
означающих пустую строку. Однако есть
переменные, для которых не подойдет ни О,
ни пустая строка. Используй для них ключевое
слово N o n e («Ничто»), как в коде ниже.
У переменной shape
пока нет значения.
Настрой переменные
Тебе понадобятся переменные для отслеживания
разных игровых параметров: формы фигуры,
предыдущего и текущего цветов, а также счета
обоих игроков.
Добавь паузу
p la y e r2 _s c o re = 0
Добавь трехсекундную паузу перед показом
первой фигуры. За это время игрок сможет
найти OKHo Tkinter, если оно скрыто под другими ro o t . a f t e r (3000, next_shape)
окнами. Функцию next_shape() («следующая
фигура») ты создашь позже, на шагах 16 и 17.
Перед тем как показать фигуру,
программа ждет 3 секунды
(3000 миллисекунд).
Свяжи клавиши и «снэп»
r o o t .a f t e r (3000, next__shape)
Добавь в программу эти две строчки.
Функция bind() связывает нажатие c .b i n d ( ' q ' , snap)
клавиш q и р с функцией snap(), c .b in d ( ' p ' , snap)
которую ты создашь позже.
с .d e le te (s h a p e )
Получает из списка следующую
i f le n (sh a p e s) > 0 : фигуру, если фигуры еще остались.
shape = s h a p e s.рор()
Делает новую фигуру видимой.
с . ite m c o n fig u re (sh a p e , state=NORMAL)
Сохраняет цвет новой
c u rre n t_ c o lo r = c .ite m c g e t(s h a p e , 'f ill') фигуры в current_color.
ro o t . a f t e r (1000, next_sh ape) Ждет 1 секунду перед тем,
e ls e : как показать следующую фигуру.
СОВЕТЫ ЭКСПЕРТА
def sn a p (e v e n t):
global shape Пометим переменные как глобальные,
чтобы потом их можно было менять
global p la y e rl_ s c o re
из функции.
global p la ye r2 _sc o re
v a lid = F a lse
c .d e le te (sh a p e )
i f v a lid :
Если цвета совпадают, этот код
i f e v e n t.c h a r == ' q ' : проверяет, какой игрок нажал
кнопку, и зачисляет ему 1 очко.
p la y e rl_ s c o re = p la y e rl_ s c o re + 1
e ls e : Выводит сообщение о том,
p la y e r2 _sc o re = p la y e r2 _sc o re + 1 что игрок заработал очко.
Больше цветов
Сейчас игра заканчивается быстро.
Чтобы сделать ее продолжительнее,
добавь побольше квадратов, прямо
угольников и кругов разных цветов.
Н о в ы е т и п ы ф и гу р
Изменив аргументы функции create_oval(), можно получить
овал вместо круга. Также T k in te r позволяет рисовать
сегменты, линии и многоугольники. Испытай эти примеры
кода и поиграй со значениями. Не забывай задавать режим
HIDDEN, чтобы фигуры не появлялись раньше времени.
Если задать
arc = c .c r e a t e _ a r c (- 2 3 5 , 120, 365, 370, o u t lin e = 'r e d ' , \ стиль CHORD,
получится
f i l l = 're d ' , state=HIDDEN, style=CHORD) сегмент.
Нарисуй линии
Воспользуйся функцией create_line() («создать линию»)
и добавь в список фигур несколько линий.
Измени сообщения
Если оба игрока нажмут свои клавиши почти одновременно,
Не забудьсохранить
будет неясно, кто из них должен получить очко. Чтобы свою работу.
это исправить, можно изменить сообщения, возникающие
при нажатии кнопок.
i f v a lid :
i f e v e n t.c h a r == ' q ' :
p la y e rl_ s c o re = p la ye rl__sco re + 1
shape = c .c r e a t e _ t e x t (2 0 0 , 200, text='CH3n! Игрок 1 получает о ч к о !')
e ls e :
player2__score = p la y e r2 _sc o re + 1
shape = c .c r e a t e _ t e x t (2 0 0 , 200, text='CH3n! Игрок 2 получает о ч к о !')
p re v io u s_ c o lo r = ' '
e ls e :
i f e v e n t.c h a r == 'q ' :
p la y e rl_ s c o re = p la y e rl_ s c o re - 1
shape = c .c r e a t e _ t e x t (2 0 0 , 200, text='MHM0! Игрок 1 теряет о ч к о !')
e ls e :
p la y e r2 _sc o re = p la y e r2 _sc o re - 1
shape = c .c re a te _ _ te x t(2 0 0 , 200, text='MHM0! Игрок 2 теряет о ч к о !')
«Мемори»
У тебя хорошая память? Узнать это
поможет веселая игра на поиск парных
символов. Поглядим, насколько быстро
ты отыщешь все 12 пар!
Что п р о и с х о д и т
Игрок видит на экране окно с кнопками. После клика
по двум любым на их месте появляются символы. Если
оба символа одинаковые, они остаются «открытыми»,
а если нет, программа снова их прячет. Постарайся
запомнить, под какой кнопкой какой символ находится,
чтобы как можно быстрее открыть все пары. В окне 4 ряда
по 6 кнопок —
всего 24 кнопки.
Кликни по кнопке,
чтобы увидеть символ.
Каждый символ
встречается дважды.
Окно GUI
Окно и кнопки отно
сятся к графическому
интерфейсу пользо
вателя (GUI). Создает
их модуль Tkinter.
Если ты откроешь непарные Одинаковые символы
символы, они снова исчезнут. остаются «открытыми».
К ак это р а б о т а е т Блок-схема программы «Мемори»
Для отображения кнопок на экране используется Программа «перемешивает» символы,
создает элементы интерфейса, а затем
модуль Tkinter. Его функция mainloopO отслеживает
ожидает кликов по кнопкам. Игра
клики по кнопкам и обрабатывает их с помощью завершается, когда все пары символов
особой лямбда-функции, которая показывает символ. «открыты».
Если «открыты» 2 символа, программа проверяет их
на совпадение. При этом кнопки хранятся в словаре,
а символы — в списке.
СОВЕТЫ ЭКСПЕРТА
Лямбда-функция
Подобно def, ключевое слово
lambda служит для создания
функций. Такие лямбда-функции
пишутся в одну строку, не имеют
имени, а использовать их можно
в любом месте программы. Напри
мер, функция lambda х: х*2 удва
ивает число. Можно сохранить
ее в переменной, вот так:
double = lambda х: х*2, а потом
вызывать, вот так: double(x), где
х — это любое число. Например,
double(2) вернет 4. Лямбда-функ
ции удобны при создании эле
ментов GUI, чтобы при нажатии
на кнопки вызывалась одна
функция с разными аргумен
тами, а не множество разных
(в нашем примере — 24).
Приступим?
На первом этапе создания программы
необходимо настроить GUI и связать
кнопки с символами, которые сначала
будут скрыты.
Загрузи модули
im port random
Введи эти строчки, чтобы загрузить
необходимые модули. Модуль im port time
random поможет «перемешать» from t k in t e r im port T k , B u tto n , DISABLED
символы, time — сделать паузу,
a Tkinter — создать игровой GUI.
Виджет Button служит
для создания кнопок
в окне Tkinter. Создают окно Tkinter
с нужным заголовком.
Настрой GUI
Сразу после команд import введи root = T k ()
код настройки GUI. Функция ro o t . t i t l e ( ' Мемори')
root.resizableO («основа,
ro o t . re s iz a b le (w id th = F a ls e , h e ig h t= F a lse )
изменяемый») позволяет сделать
размер окна неизменным. Это
важно, поскольку, изменив Делает размер окна
неизменяемым.
размер окна, игрок собьет
позиции кнопок, которые тебе
скоро предстоит создать.
Не забудь сохранить
свою работу.
Создай переменные
ro o t .re s iz a b le (w id t h = F a ls e , he ig h t= F alse )
Создай в конце программы необходимые
переменные, включая словарь для Словарь для кнопок.
хранения кнопок. После каждого клика buttons = { }
программа должна определять, какой Эта переменная служит для проверки,
символ из пары открылся: первый или f i r s t = True первый ли это символ в паре.
второй. Также необходимо сохранять p re vio u sX = 0
Переменные для хранения координат
координаты первой нажатой кнопки,
p re vio u sY = 0 первой из двух нажатых кнопок.
чтобы затем сравнивать их с коорди
натами второй.
Добавь символы
Чтобы добавить в игру символы, введи
следующий код. Как и в проекте «Девять
жизней», здесь используются знаки
Юникода. В игре 12 пар символов.
Добавь этот код после переменных,
созданных на шаге 5.
p re vio u sY = 0
Словарь для хранения
символа каждой кнопки.
button_sym bols = { }
symbols = [u '\ u 2 7 0 2 ', u '\ u 2 7 0 2 ', u '\ u 2 7 0 5 ', u '\ u 2 7 0 5 ', u '\ u 2 7 0 8 ', u '\ u 2 7 0 8 ',
u '\u 27 0 9' , u '\u27 0 9' , u '\ u 2 7 0 A \ u '\ u 2 7 0 A \ u '\ u 2 7 0 B \ u '\ u 2 7 0 B \
u '\u270C' , u *\u270C' , u '\ u 2 7 0 F \ u ’ \ u 2 7 0 F \ u '\ u 2 7 1 2 \ u * \u 2 7 1 2 \
u '\ u 2 7 1 4 ', u *\u 2 7 1 4 ', u '\ u 2 7 1 6 \ u '\ u 2 7 1 6 \ u '\ u 2 7 2 8 ', u '\u 2 7 2 8 ']
«Перемешай» символы
ra n d o m .sh u ffle (sy m b o ls)
Нельзя, чтобы символы всегда находились
на одних и тех же позициях, иначе игрок
запомнит их расположение и в следующий
раз сможет открыть все пары с первой
попытки. Поэтому перед началом каждой
игры символы нужно «перемешать». Для
этого введи следующую строчку после
списка symbols.
Врем я к н о п о к СОВЕТЫ ЭКСПЕРТА
Теперь твоя задача — создать кнопки Видж ет Button
и разместить их в окне. А еще — функцию
show_symbol() («показать символ»), которая В Tkinter есть виджет под названием
Button («Кнопка»), который служит
обрабатывает клики по кнопкам.
для создания кнопок. Ему можно
передавать разные аргументы,
из которых для нас важны command,
width и height. Аргумент command
(«команда») указывает, какую
Размести кнопки
функцию вызывать при клике (у нас
Кнопки разместим в окне в 4 ряда по 6 штук. Расставить
это будет лямбда-функция), a width
их помогут вложенные циклы. Внешний цикл (с пере
(«ширина») и height («высота»)
менной цикла х) пройдет 6 столбцов слева направо,
задают ширину и высоту кнопки.
а внутренний цикл (с переменной цикла у) — каждый
столбец сверху вниз. В ходе работы циклов каждая
кнопка получит пару координат х и у, задающих
ее позицию в окне. Добавь этот код после вызова
shuffle().
def show_symbol(x, y ) :
global f i r s t Объявляют глобальные
global p re vio u sX , p re vio u sY переменные.
К о л и ч е с тв о х о д о в
Сейчас у игрока нет возможности оценить
свое мастерство или померяться силой
с друзьями. Как сделать игру более
соревновательной? Добавь в код
переменные для подсчета ходов!
def show_symbol( х , у ) :
g lo b al f i r s t
Игрок еще не сделал ходов
p reviousY = 0 и ничего не открыл, поэтому g lo b al p re vio u sX , previousY
moves = 0 здесь нули. g lo b al moves
p a irs = 0 g lo b al p a irs
Сосчитай ходы
if f ir s t :
Один ход — это 2 клика по кнопкам (попытка
открыть пару). Так что прибавлять 1 к значе p revio u sX = х
нию переменной moves нужно при вызове p re vio u sY = у
show_symbol() либо для первого, либо
для второго клика, но не для обоих. Пусть f i r s t = F a ls e
это будет первый клик. Измени код функции moves = moves + 1
show_symbol() следующим образом.
Выведи сообщение
Теперь добавь ближе к концу show_symbol()
такой код. Он будет считать открытые пары,
а когда игра завершится, покажет окошко
с количеством сделанных ходов и кнопкой
ОК. При клике ОК будет вызвана функция
dose_window() («закрыть окно») — ее мы
создадим дальше.
Эта команда
закрывает окно.
Ещ е б о л ь ш е к н о п о к
Чтобы проверить память
игрока по полной программе,
добавь в игру еще больше
кнопок и символов.
Новые символы
Чтобы добавить новые пары
символов, дополни код списка
symbols следующим образом.
symbols = [ u '\ u 2702* , u '\ u 2702' , u '\ u 2 7 0 5 \ u '\ u 2 7 0 5 \ u '\ u 2 7 0 8 \ u '\ u 2 7 0 8 ',
u '\ u 2 7 0 9 ', u '\ u 2709' , u '\ u 2 7 0 А \ u '\ u 2 7 0 А \ u '\ u 2 7 0 В \ u '\ u 2 7 0 В \
u '\ u 2 7 0 C ', u '\ u 270C' , u '\ u 2 7 0 F \ u '\ u 2 7 0 F \ u '\ u 2 7 1 2 \ u , \u2712‘ ,
u '\ u 2 7 1 4 ', u '\ u 2714' , u '\ u 27 16 \ u '\ u 2 7 1 6 \ u '\ u 2 7 2 8 \ u '\ u 2 7 2 8 \
u '\ u 2 7 3 3 ', u '\ u 2 7 3 3 ', u '\ u 2 7 3 4 \ u '\ u 2 7 3 4 ', u '\u 2 7 4 4 ’ , u '\u 2 7 4 4 ']
Новые кнопки
fo r х in ra n g e (6 ):
Добавь в список символов
новый ряд кнопок, указав fo r у in ra n g e (5 ):
в скобках функции range ()
вложенного цикла число 5 Теперь в игре будет 5 рядов
вместо 4. кнопок, а не 4.
Еще больше?
Сейчас в игре 30 кнопок. Если ты
захочешь добавить еще, помни,
что количество новых кнопок
должно быть кратно 6, то есть
длине полного ряда. Или можешь
поэкспериментировать, изменив
коды циклов и расставив кнопки
по-другому.
«Яйцелов»
Это игра на внимательность и быстроту
реакции. Собери волю в кулак и поймай
столько яиц, сколько сможешь,
заработав максимум очков. А потом
устрой с друзьями турнир на звание
лучшего яйцелова!
Что п р о и с х о д и т
Перемещая корзину в нижней части
экрана вправо-влево, старайся поймать
падающие яйца до того, как они коснутся
земли. Если яйцо окажется в корзине, ты
заработаешь очки, а упустив его, потеряешь
жизнь. Внимание: чем больше яиц ты
поймаешь, тем чаще и быстрее будут
падать новые. Если потеряешь все
3 жизни, игра закончится.
СОВЕТЫ ЭКСПЕРТА
Тайминг
Тайминг событий очень важен. Вначале
яйца должны появляться раз в 4 секунды
(иначе их будет слишком много на экране)
и сдвигаться вниз каждые полсекунды.
Если бы они падали быстрее, игра оказалась
бы чересчур сложной. Программа определяет,
поймал ли игрок яйцо, 10 раз в секунду. Делай
она это реже, проверка давала бы осечки.
По мере набора очков увеличивается
количество новых яиц и их скорость
падения.
С помощью модуля Tkinter программа
рисует объекты и создает анимацию, Новые яйца появляются
а модуль random помогает ей располагать в верхней части экрана
новые яйца на экране. в случайных позициях.
Аркадная игра
В этом проекте ты применишь
все свои навыки программиста,
создав эффектную аркадную
игру. Программа довольно
сложна — почаще проверяй
код на ошибки и не огорчайся,
если где-нибудь запутаешься.
Разобравшись с «Яйцеловом»,
ты будешь готов к созданию
собственных игр.
Как это р а б о та е т
Когда на экране появится фон, возникшие в верхней
части экрана яйца начнут медленно смещаться вниз,
что создаст иллюзию падения. При помощи циклов
код снова и снова будет проверять координаты яиц,
сопоставляя их с координатами нижней границы экрана
и корзины. Если яйцо попало в корзину или разбилось,
оно исчезает с экрана, а программа обновляет счет
и число оставшихся жизней.
Блок-схема программы
«Яйцелов»
В программе есть 3 цикла:
один создает новые яйца,
другой проверяет, попало ли
яйцо в корзину, а третий
перемещает яйца по экрану
и определяет, упало ли яйцо
на землю. Каждое из этих
действий происходит со своей
скоростью.
Создай файл
П о д го т о в к а
Открой IDLE и создай новый файл, сохранив
Давай сначала загрузим необходимые для его как egg_catcher.py («яйцелов»).
этого проекта модули, а затем подготовим
все, что требуется для создания основных
функций.
Загрузи модули
from it e r t o o ls im port c y c le
В программе «Яйцелов» используются
3 модуля: itertools для перевирания from random im port randrange
цветов, random для создания яиц from t k in t e r im port Canvas, T k , messagebox, font
в случайных позициях и Tkinter для
отрисовки графики и анимации. Добавь
в программу эти 3 строчки кода, чтобы
загрузить части этих модулей.
. Создает солнце.
c .p a c k ()
c o lo r_ c y c le = c y c l e ( [ ' lig h t b lu e ', ' l i g h t g re e n ', ' l i g h t p in k ', 'l i g h t y e llo w ', ' l i g h t c y a n '])
egg_width = 45
egg_height = 5 5 Поймав яйцо, игрок получает 10 очков.
egg_score = 10
Новое яйцо возникает каждые 4000 миллисекунд (4 секунды).
egg_speed = 500
egg_i n te rv a l = 4000 Коэффициент сложности показывает, с какой частотой
должны появляться яйца на экране и с какой скоростью
d if f ic u lt y _ f a c t o r = 0 .9 5 падать (чем ближе к 1, тем проще играть).
d if f ic u lt y _ f a c t o r = 0 .9 5
c a tc h e r_ c o lo r = 'b lu e '
catch e r_w id th = 100 Диаметр окружности, которая
используется для рисования дуги.
ca tch e r_h e ig h t = 100 Эти строчки задают начальную
позицию корзины (у нижнего
c a t c h e r_ s t a rt _ x = canvas_w idth / 2 - c a tc h e r_w id th / 2 края по центру холста).
c a t c h e r_ s t a rt _ y = canvas_ h e ig h t - c a tc h e r_ h e ig h t - 20
Начинает Заканчивает
c a tc h e r_ s ta rt_ x 2 = c a t c h e r _ s t a r t _ x + c a tch e r_w id th
рисовать дугу рисовать дугу
c a tc h e r_ s ta rt_ y 2 = c a t c h e r _ s t a r t _ y + c a tc h e r_ h e ig h t на отметке на отметке
200 градусов. 340 градусов.
catch e r = c .c r e a t e _ a r c ( c a t c h e r _ s t a r t _ x , c a t c h e r _ s t a r t _ y , \
c a t c h e r _ s t a r t _ x 2 , c a t c h e r _ s t a r t _ y 2 , s ta rt= 2 00 , exten t= 140, \ . Рисует
корзину.
s t y le = 'a r c ', o u tlin e = c a t c h e r _ c o lo r, width=3)
Как это работает
Корзина представляет собой дугу, то есть часть окружности.
Tkinter рисует окружности, вписывая их в невидимый прямоугольник.
Значения переменных catcher_start_x и catcher_start_y задают
координаты одного угла этого прямоугольника, а значения
catcher_start_x2 и catcher_start_y2 — противоположного ему
угла. У функции create_arc() есть 2 аргумента (число градусов),
определяющих, какую часть окружности нужно взять для создания
дуги: start («начало») — это место, в котором дуга начинается,
a extent («протяженность») — протяженность дуги в градусах.
c a tch e r = c .c r e a t e _ a r c ( c a t c h e r _ s t a r t _ x , c a t c h e r _ s t a r t _ y , \
c a t c h e r _ s t a r t _ x 2 , c a t c h e r _ s t a r t _ y 2 , sta rt= 2 0 0 , extent=140,
s t y le = ’ a r c ’ , o u tlin e = c a tc h e r _ c o lo r, width=3)
liv e s _ re m a in in g = 3
liv e s _ t e x t = c .c re a t e _ t e x t (c a n v a s _ w id th - 10, 10, a n ch o r= 'n e ', font=gam e_font, \
f i l l = 'd a r k b l u e ', t e x t ='Жизней: ' + s t r (liv e s _ r e m a in in g ) )
Создай яйца
Главные и гр о в ы е ф у н к ц и и
Введи этот код. Для учета яиц служит список
Все настройки сделаны, а значит, пришло eggs. Функция create_egg() выбирает
время написать код самой игры. Для этого позицию (координата х всегда случайная),
нам понадобятся функции, создающие яйца создает в этом месте яйцо в виде овала
и добавляет его в список яиц. В конце
и заставляющие их падать, а также функции,
функция ставит таймер, вызывающий
которые обрабатывают пойманные и упу ее после паузы.
щенные яйца.
def c re a te _ e g g ():
Выбирает случайную горизонтальную
x = randrange(10, 740) позицию для нового яйца.
у = 40
new_egg = c .c r e a t e _ o v a l( x , у , х + egg_w idth, у + eg g _h eig h t, f il l= n e x t ( c o lo r _ c y c le ) , width=0)
eggs. append(new_egg) Создает овал.
ro o t. a f t e r ( e g g _ in t e r v a l, cre ate _e g g )
r o o t .a f t e r ( e g g _ in t e r v a l, cre ate _e g g )
Получает координаты яйца.
Цикл проходит
def m ove_eggs(): по списку яиц.
Сдвигает яйцо на 10 пикселей вниз.
fo r egg in eggs:
(egg_x, egg_y, egg_x2, egg_y2) = c .c o o rd s(e g g ) Яйцо достигло нижнего края холста?
Потеря жизни
root .d e s t r o y () Эта переменная должна быть
При потере жизни нужно вычесть 1
глобальной, чтобы функция
из значения переменной lives_
def l o s e _ a _ l i f e ( ) : могла ее изменить.
remaining («осталось жизней»)
и обновить счетчик жизней g lo b al liv e s _ re m a in in g Игрок теряет 1 жизнь.
на экране. Введи этот код после
liv e s _ re m a in in g -= 1
функции eggs_dropped().
c .it e m c o n f ig u r e ( liv e s _ t e x t , text=')KH3He^ * \
+ s t r ( liv e s _ r e m a in in g ) )
root.after(100, check_catch)
score += points
egg_speed = int(egg_speed * difficulty__factor) Обновляет счетчик
очков на экране.
egg_interval = int(egg_interval * difficulty_f actor)
c.itemconfigure(score__text, text='C4eT: ' + str(score))
П о й м ай эти яй ц а!
Теперь у тебя есть все необходимые картинки
и функции. Осталось добавить управление корзиной
и ввести команды, запускающие игру.
Управляй корзиной
с . ite m c o n fig u re (s c o re _ te x t, te x t= 'C 4 e T : ' \
Функции move_left() и move_right()
проверяют координаты корзины, + s tr(s c o re ))
чтобы не дать ей выйти за пределы
экрана. Если до левой или правой Дошла ли
def m o v e _ le ft (e v e n t): корзина
границы окна еще есть место,
до левого
корзина смещается на 20 пикселей ( x l , y l , x 2 , y2) = c .c o o rd s (c a tc h e r) края холста?
по горизонтали. Команды bind() i f x l > 0:
связывают эти две функции
с клавишами-стрелками ВЛЕВО c .m o v e (c a tc h e r, -2 0 , 0) Если нет,
и ВПРАВО на клавиатуре, а вызов сдвигает
focus_set() позволяет программе def m o v e _ rig h t(e v e n t): корзину
влево.
отслеживать нажатия клавиш.
( x l , y l , x 2 , y2) = c .c o o rd s (c a tc h e r)
Добавь этот код после функции
increase_score(). i f x2 < c a n v a s_w id th :
c .m o v e (c a tc h e r, 20, 0)
Дошла ли корзина . Если нет,
до правого края холста? сдвигает
c .b in d ( '< L e f t > ', m o v e _le ft) корзину
Эти строчки связывают c .b in d ('< R ig h t > ', m o ve_rig h t) вправо.
вызовы функций
с нажатиями клавиш. c .f o c u s _ s e t ( )
Запусти игру
с .fo cu s__se t() 3 игровых цикла
Три зацикленные функции запускаются
с помощью таймеров. Это нужно для запускаются после паузы
в 1000 миллисекунд
того, чтобы они не начали работать ro o t . a f t e r (1000, cre ate _e g g ) (1 секунду).
раньше, чем основной цикл. Вызов
r o o t .a f t e r (1000, move_eggs)
mainloopO запускает основной цикл Запускает основной
модуля Tkinter, обслуживающий наши r o o t .a f t e r (1000, c h e ck _ca tch ) цикл модуля Tkinter.
циклы и таймеры. Игра готова — root .m ainloopO
вперед, яйцам от тебя не уйти!
Фоновые картинки
Tkinter позволяет отображать на холсте
графические файлы. Для загрузки файлов GIF
подойдет класс tkinter.Photolmage. Если же
тебя интересует файл другого формата,
попробуй Pillow — это удобный модуль
для работы с изображениями.
Пошумим?
im port time
Чтобы оживить игру, добавь в нее фоновую музыку
и звуковые эффекты для пойманного и разбитого яйца.
Проигрывать звуки тебе поможет виджет pygame.mixer, from pygame import m ixer
однако сначала его придется установить. Еще понадо
Подготавливает виджет
бится файл со звуком, который ты хочешь включать, —
к проигрыванию звука.
положи его в одну папку с файлом программы. Теперь, m ix e r. i n i t ( )
чтобы услышать звук, тебе остается написать лишь beep = m ixer.Sou nd("b eep .w av")
несколько строчек кода.
beep. p la y ()
Загружает звуковой файл.
t im e .s le e p (5 )
i f attempt == 3:
p r in t ( ' Правильный ответ: ' + answer)
score = 0
p r in t ('Т е ст «Животные»')
guessl = inp u t('Какой медведь живет за полярным кругом? ')
check_guess(guess1 , 'белый медведь')
guess2 = inp u t('Какое сухопутное животное самое быстрое? ')
check_guess(guess2, 'гепард')
guess3 = inp u t('Какое животное самое большое? ')
check_guess(guess3, 'синий к и т')
p r in t ('Добро пожаловать!')
w hile True:
a d je c tiv e = random .choice(adjectives)
noun = random.choice(nouns)
number = random.randrange(0, 100)
sp e c ia l_ch a r = random .choice(string.punctuation)
liv e s = 9
words = ['п ицца', 'а н ге л ', 'мираж', 'но ски', 'выдра', 'п е тух ']
secret_word = random.choice(words)
clue = 1i s t ( '? ? ? ? ? ')
heart_symbol = u'\u2764'
guessed_word_correctly = False
i f guess == secret_word:
guessed_word__correctly = True
break
i f guess in secret_word:
update_clue(guess, secret_w ord, clu e )
e lse : t.g o to (-1 5 0 , 110)
p r in t ( ' Неправильно. Вы теряете жизнь') re cta n g le (1 5 , 40, 'g re y ')
liv e s = liv e s - 1
t.g o to (10, 70)
i f guessed_word_correctly: rectan g le (6 0 , 15, 'g re y ')
p rin t ( 'Победа! Было загадано слово ' \ t.g o to (5 5 , 110)
+ secret_word) re cta n g le (1 5 , 40, 'g re y ')
e lse :
p rin t ( 'Проигрыш! Было загадано слово ' \ # шея
+ secret_word) t.g o to (-5 0 , 120)
rectan g le (1 5 , 20, 'g re y ')
# Основной код
t.S c re e n ( ) .b g co lo r('d a rk b lu e ')
w hile True:
ranPts = ra n d in t(2 , 5) * 2 + 1
ranSize = ra n d in t(1 0 , 50)
ranCol = (random( ) , random( ) , random( ) )
ranX = ran d in t(-3 50 , 300)
ranY = ra n d in t(-2 50 , 250)
def inside_window():
le f t _ lim it = (-t.window_width() / 2) + 100
rig h t_ l im it = (t.w indow _w idth() / 2) - 100
top _lim it = (t.w indow _height() / 2) - 100
bottom_limit = ( - t . window_height() / 2) + 100
(x , y) = t.p o s ()
inside = le f t _ lim it < x < rig h t_ lim it and bottom _lim it < у < to p _lim it
return inside
t .s h a p e ('t u r t le ')
t .f illc o lo r ( 'g r e e n ')
t .b g c o lo r ('b la c k ')
t .s p e e d ('fa s t e s t ')
t.p e n siz e (lin e _w id th )
while True:
m o ve_tu rtle(lin e_len g th )
root = T k ()
c = Canvas(root, width=800, height=800, bg= 'black')
c .p a c k ()
c .c re a te _ te x t(1 0 0 , 50, anchor='w', f ill= 'o r a n g e ', fo n t= 'A ria l 28 bold u n d e rlin e ', \
te x t= 'Календарь ожидания')
v e rtic a l_ sp a c e = 100
fo r event in events:
event_name = event[0]
d a y s_u n til = days_between_dates(event[1 ], today)
d isp la y = '%s через %s д н .' % (event__name, d a y s _u n til)
c .c re a te _ te x t(1 0 0 , v e rtic a l_ s p a c e , anchor='w', f i l l = 'lig h tb lu e ' , \
fo n t= 'A ria l 28 b o ld ', text= d isp lay)
v e rtic a l_ sp a c e = v e rtic a l_ s p a c e + 30
re a d _fro m _file ()
w hile True:
query_country = s im p le d ia lo g .a s k s trin g ('С трана', 'Введите название страны :')
i f query_country in the_world:
re su lt = the_world [query_country]
messagebox.showinfo('О тв е т',
query_countr y + ' : столица этой страны - ' + re s u lt + ' ! ' )
e ls e :
new_city = s im p le d ia lo g .a sk s trin g (' Научите меня’ ,
'Я не знаю, ' +
'как называется столица страны ' + query_country + ' ! ' )
the_world[query_country] = new_city
w rite _to _ file (q u e ry _ c o u n try , new_ci ty )
root .mainloop()
def is_even(number):
return number % 2 == 0
def get__task():
task = sim p le d ia lo g .a sk s trin g (' Задание' , 'Что сделать: зашифровать или расшифровать?')
return task
def get_m essage():
message = s im p le d ia lo g .a s k s trin g ('Сообщение', 'Введите секретное сообщение: ')
return message
root = T k ()
while True:
task = g e t_ta sk ()
i f task == 'зашифровать':
message = get_message()
encrypted = sw ap_letters(m essage)
messagebox.showinfo('Зашифрованное сообщение:', encrypted)
e l i f task == 'расшифровать':
message = get_message()
decrypted = swap_letters(m essage)
messagebox.showinfo(' Расшифрованное сообщение:', decrypted)
e ls e :
break
root .mainloop()
def to g g le _e y e s():
c u rre n t_co lo r = c .ite m c g e t(e y e _ le ft, ' f i l l ' )
new_color = c.body_color i f c u rre n t_co lo r == 'w hite' e lse 'w h ite'
c u rre n t_sta te = c .ite m c g e t(p u p il_ _le ft, 's t a t e ')
new_state = NORMAL i f c u rre n t_sta te == HIDDEN e lse HIDDEN
c .ite m c o n fig u re (p u p il_ L e ft, state=new_state)
c .ite m c o n fig u re (p u p il_ rig h t, state=new_state)
c . ite m co n fig u re (e y e _Le ft, fill= n e w _co lo r)
c . i tem configure(eye__right, f i ll= new _color)
def b lin k ( ) :
toggle_eyes()
r o o t .a f t e r (250, toggle_eyes)
r o o t .a ft e r (3000, b lin k )
def cheeky(event):
toggle_tongue()
to g g le_p up ils()
hide_happy(event)
r o o t .a ft e r (1000, toggle_tongue)
r o o t .a ft e r (1000, toggle_pupils)
return
def show_happy(event):
i f (20 <= event.x and eve n t.x <= 350) and (20 <= e v e n t.у and e v e n t.у <= 350):
c . item configure(cheek_Left, state=NORMAL)
c.ite m co n fig u re (ch e e k _rig h t, state=NORMAL)
c.itemconfigure(mouth_happy, state=NORMAL)
c.itemconfigure(mouth_norm al, state=HIDDEN)
c.item configure(m outh_sad, state=HIDDEN)
c.happy_level = 10
return
def hide_happy(event):
c.ite m c o n fig u re (ch e e k _le ft, state=HIDDEN)
c.item co n fig u re (ch ee k_rig h t, state=HIDDEN)
c.itemconfigure(mouth_happy, state=HIDDEN)
c.itemconfigure(mouth_norm al, state=NORMAL)
c.itemconfigure(mouth_sad, state=HIDDEN)
return
def s a d ():
i f c.happy_Level == 0:
c.itemconfigure(mouth_happy, state=HIDDEN)
c.itemconfigure(mouth_norm al, state=HIDDEN)
c . itemconfigure(mouth_sad, state=NORMAL)
e ls e :
c.happy_level -= 1
ro o t .a ft e r (5000, sad)
root = T k ()
c = Canvas(root, width=400, height=400)
c.configure(bg='dark b lu e ', highlightthickness= 0)
c.body_color = ' SkyB luel'
body = c .c re a te _ o v a l(35, 20, 365, 350, o u tline= c.b o d y_co lo r, fill= c .b o d y _ c o lo r)
e a r _ le ft = c.create_p o lyg o n(75, 80, 75, 10, 165, 70, o u tlin e = c. body_color, fill= c .b o d y _c o lo r)
e a r_ rig h t = c.create_p o lyg o n(255, 45, 325, 10, 320, 70, o utline= c.b o d y_co lo r, fill= c .b o d y _co lo r)
fo o t _ le ft = c .c re a te _ o v a l(6 5 , 320, 145, 360, o u tline= c.b o d y_co lo r, fill= c .b o d y _ c o lo r)
fo o t_rig h t = c .c re a te _o v a l(2 5 0 , 320, 330, 360, o utline= c.bo dy_colo r, fill= c .b o d y _ c o lo r)
mouth_normal = c .c re a te _ lin e (1 7 0 , 250, 200, 272, 230, 250, smooth=l, width=2, state=NORMAL)
mouth_happy = c .c re a te _ lin e (1 7 0 , 250, 200, 282, 230, 250, smooth=l, width=2, state=HIDDEN)
mouth_sad = c .c re a te _ lin e (1 7 0 , 250, 200, 232, 230, 250, smooth=l, width=2, state=HIDDEN)
tongue_main = c .c re a te _re c ta n g le (1 7 0 , 250, 230, 270, o u tlin e = 're d ' , f i l l = ' r e d ' , state=HIDDEN)
tongue_tip = c .c re a te _o v a l(1 7 0 , 250, 230, 300, o u tlin e = 're d ' , f i l l = ' r e d ' , state=HIDDEN)
ch e e k_le ft = c .c re a te _ o v a l(7 0 , 180, 120, 230, o u tlin e = 'p in k ', f i l l = ' p i n k ' , state=HIDDEN)
cheek_right = c .c re a te _o v a l(2 8 0 , 180, 330, 230, o u tlin e = 'p in k ', f i l l = ' p i n k ' , state=HIDDEN)
c .p a c k ()
c . happy_level = 10
c.eyes_crossed = False
c.tongue_out = False
c a t e r p illa r = t .T u r t l e ()
c a t e r p illa r .s h a p e ( 'sq u a re ')
c a t e r p illa r .c o lo r ( ' re d ')
c a t e r p illa r . speed(0)
c a t e r p illa r . penup((
c a t e r p illa r .h id e t u r t le ()
le a f = t .T u r t l e ()
leaf_shape = (( 0 , 0 ), (14, 2 ), (18, 6 ), (20, 2 0 ), (6 , 1 8), (2 , 14))
t . re g iste r_sh ap e (' le a f ' , leaf_shape)
le a f.s h a p e ('le a f')
le a f.c o lo r ( 'green')
le a f .penup()
le a f .h id e tu rtle ( )
leaf.sp e e d (0)
game_started = False
te x t_ tu rtle = t .T u r t l e ()
t e x t _ t u r t le .w r it e ( ' Нажмите ПРОБЕЛ, чтобы начать и гр у', a lig n = 'c e n te r' , fo n t= ('A r i a l ' , 16, 'b o ld '))
t e x t_ tu rtie .h id e t u r t le ()
def outside_window():
le ft _ w a ll = - t . window_width() / 2
rig h t_w a ll = t.window_width() / 2
top_wall = t.w indow _height() / 2
bottom_wall = -t.w indow _height() / 2
(x , y) = c a t e r p illa r .p o s ( )
outside = \
x < le ft _ w a ll or \
x > rig h t_w a ll or \
у < bottom_wall or \
У > top_wall
return outside
def game_over():
c a t e r p illa r .c o lo r ( 'y e llo w ')
le a f .c o lo r ( 'y e llo w ')
t.penup()
t .h id e t u r t le ()
t .w r i t e ( ' Конец игры!' , a lig n = 'c e n te r' , f o n t = ('A r ia l' , 30, 'n o rm a l'))
def p la c e _ le a f():
le a f . h t()
le a f.se tx(ran d o m .ran d in t(-20 0, 200))
le a f.se ty (ra n d o m .ra n d in t(-2 0 0 , 200))
le a f. s t()
score = 0
t e x t _ t u r t ie .c le a r ()
c a te rp illa r_sp e e d = 2
c a te rp illa r_ le n g th = 3
c a t e r p illa r . s h a p e s iz e (l, c a t e rp illa r_ le n g th , 1)
c a t e r p illa r . sh o w tu rtle ()
d isp la y _sco re (sco re )
p la c e _ le a f()
w hile True:
c a te rp illa r.fo rw a rd (c a te rp illa r_ s p e e d )
i f c a t e r p illa r .d is t a n c e (le a f ) < 20:
p la c e _ le a f()
c a te rp illa r_ le n g th = c a te rp illa r_ le n g th + 1
c a t e r p illa r .s h a p e s iz e ( l, c a t e rp illa r_ le n g th , 1)
c a te rp illa r_sp e e d = caterpillar__speed + 1
score = score + 10
d isp la y _sco re (sco re )
i f outside_w indow ():
game_over()
break
def move_up():
i f c a t e rp illa r.h e a d in g () == 0 or c a te rp illa r.h e a d in g () == 180:
c a t e rp illa r.s e th e a d in g (90)
def move_down():
i f c a t e r p illa r .heading() == 0 or c a t e r p illa r .heading() == 180:
c a t e rp illa r.s e th e a d in g (270)
def next_shape():
global shape
global previous_color
global current_co lo r
c.delete(shape)
i f len(shapes) > 0:
shape = shapes.pop()
c.item configure(shape, state=NORMAL)
cu rren t_co lo r = c.item cget(shape, ' f i l l ' )
r o o t .a ft e r (1000, next_shape)
e ls e :
c.u n b in d (' q ')
c.u n b in d (' p ')
i f p la ye rl_sco re > p layer2_score:
c .c re a te _te x t(2 0 0 , 200, te x t= 'Победил игрок 1 ')
e l i f player2_score > p la y e rl_ sc o re :
c .c re a te _te x t(2 0 0 , 200, te x t= 'Победил игрок 2 ')
e ls e :
c .c re a te _te x t(2 0 0 , 200, te x t= 'Ничья')
c.p a ck ()
def snap(event):
global shape
global p la ye rl_sco re
global player2_score
v a lid = False
c.delete(shape)
i f previous_color == c u rre n t_c o lo r:
v a lid = True
i f v a lid :
i f event.char == ' q' :
p la ye rl_sco re = p la y e rl_sco re + 1
e ls e :
player2_score = player2_score + 1
shape = c .c re a te _ te x t(2 0 0 , 200, text='CH3n! Вы получаете 1 очко!')
e ls e :
i f event.ch ar == ' q ' :
p la y e rl_sco re = p la y e rl_sco re - 1
e ls e :
player2_score = player2__score - 1
shape = c .c re a te _ te x t(2 0 0 , 200, text='MHM0! Вы теряете 1 очко !')
с . pack()
ro o t. u p d a te _id le ta sk s()
t im e .s le e p (l)
root = T k ()
r o o t . t i t l e ( 'С нэп')
c = Canvas(root, width=400, height=400)
shapes = []
c ir c le = c .c re a te _ o v a l(35, 20, 365, 350, o u tlin e = 'b la c k ', f i 11='b la c k ', state=HIDDEN)
shapes. ap p end (circle)
c ir c le = c .c re a te _o v a l(3 5 , 20, 365, 350, o u tlin e = 're d ' , f i l l = ' r e d ' , state=HIDDEN)
shapes. append(ci r c le )
c ir c le = c .c re a te _ o v a l(35, 20, 365, 350, o u tlin e = 'g re e n ' , f il l= 'g r e e n ', state=HIDDEN)
shapes. ap p end (circle)
c ir c le = c .c re a te _ o v a l(35, 20, 365, 350, o u tlin e = 'b lu e ', f i l l = 'b l u e ', state=HIDDEN)
shapes. ap p end (circle)
rectangle = c .c re a te _re c ta n g le (3 5 , 100, 365, 270, o u tlin e = 'b la c k ', f i l l = ' b l a c k ' , state=HIDDEN)
shapes. append(rectangle)
rectangle = c .c re a te _re c ta n g le (3 5 , 100, 365, 270, o u tlin e = 're d ', f i l l = ' r e d ' , state=HIDDEN)
shapes. append( rectangle)
rectangle = c .c re a te _re c ta n g le (3 5 , 100, 365, 270, o u tlin e = 'g re e n ', f ill= 'g r e e n ', state=HIDDEN)
shapes.append(rectangle)
rectangle = c .c re a te _re c ta n g le (3 5 , 100, 365, 270, o u tlin e = 'b lu e ', f i l l = 'b l u e ', state=HIDDEN)
shapes. append(rectangle)
square = c .c re a te _re c ta n g le (3 5 , 20, 365, 350, o u tlin e = 'b la c k ', f i l l = ' b l a c k ' , state=HIDDEN)
shapes.append(square)
square = c .c re a te _re c ta n g le (3 5 , 20, 365, 350, o u tlin e = 're d ' , f i l l = ' r e d ' , state=HIDDEN)
shapes. append(square)
square = c .c re a te _re c ta n g le (3 5 , 20, 365, 350, o u tlin e = 'g re e n ' , f ill= 'g r e e n ', state=HIDDEN)
shapes.append(square)
square = c .c re a te _re c ta n g le (3 5 , 20, 365, 350, o u tlin e = ’ b lu e ' , f i l l = 'b l u e ', state=HIDDEN)
shapes. append(square)
c.p a ck ()
random .shuffle(shapes)
shape = None
previous_color = ''
current_color = ' *
p layerl_sco re = 0
player2_score = 0
root .mainloop()
def show_symbol(x, y ) :
global f i r s t
global previousX, previousY
buttons[x, y ] [ 't e x t '] = button_sym bols[x, y]
buttons[x, y ] . u p d a te _id le task s()
if f ir s t :
previousX = x
previousY = у
f i r s t = False
e l i f previousX != x or previousY != y :
i f buttons[previousX, p re vio u sY ][ ' t e x t '] != b u tto ns[x, y ] [ ' t e x t ' ] :
tim e .s le e p (0 .5)
buttons[previousX, p re vio u sY ][ ' t e x t '] = *'
butto ns[x, y ] [ 't e x t '] = ' *
e ls e :
buttons[previousX, p re vio u sY ][ 'command'] = DISABLED
buttons[x, y ] [ ' command'] = DISABLED
f i r s t = True
root = Tk()
root. t it l e ( ' Мемори')
ro o t.re sizab le(w id th = False , height=False)
buttons = {}
f i r s t = True
previousX = 0
previousY = 0
button_symbols = { }
symbols = [u '\u2702’ , u '\u27 0 2', u '\u 27 0 5', u '\u 27 0 5', u '\u 27 0 8', u '\u2708' ,
u '\u2709' , u '\u2709' , u'\u270A ', u ’ \u270A\ u '\u 2 70 B ', u '\u 2 7 0 B \
u '\u270C ', u '\u270C ', u '\u 2 7 0 F', u '\u 2 7 0 F ', u '\u 2 71 2', u'\u2 71 2',
u '\u2714' , u '\u2714' , u '\u 2 7 1 6 ', iT \u 2 7 1 6 \ u '\u 2 72 8', u'\u2728']
random .shuffle(sym bols)
fo r x in ra n g e (6 ):
fo r y in ra n g e (4 ):
button = Button(command=lambda x=x, y=y: show_symbol(x, y ) , width=3, height=3)
button.grid(colum n=x, row=y)
b u tto n s[x, y] = button
button_sym bols[x, y] = symbols. pop()
root.m ainloop()
canvas_width = 800
canvas_height = 400
root = T k ()
c = Canvas(root, width=canvas_width, height=canvas_height, background^deep sky b lu e ')
c .c re a te _ re c ta n g le (- 5 , canvas_height - 100, canvas_width + 5, canvas_height + 5, \
f il l= 's e a g re e n ', width=0)
c .c re a te _ o v a l(-8 0 , -80, 120, 120, f ill= 'o r a n g e ' , width=0)
c .p a c k ()
c o lo r_cy c le = c y c le ( [ ' lig h t b lu e ', 'lig h t g re e n ', 'lig h t p in k ', 'lig h t y e llo w ', 'lig h t c y a n '])
egg_width = 45
egg_height = 5 5
egg_score = 10
egg_speed = 500
eg g _in te rval = 4000
d if f ic u lt y _ f a c t o r = 0.95
score = 0
score__text = c .c re a te _ te x t(1 0 , 10, anchor='nw', font=game_font, f i l l = ,d a rk b lu e ', \
te x t= ,C4ei: ' + s t r (s c o r e ))
lives_rem aining = 3
liv e s _ te x t = c.cre ate _te xt(ca n vas_w id th - 10, 10, anchor='ne', font=game_font, fill= 'd a r k b lu e ' , \
text=')KH3Heii: ' + s tr(liv e s _ re m a in in g ))
eggs = []
def move_eggs():
fo r egg in eggs:
(egg_x, egg_y, egg_x2, egg_y2) = c.coords(egg)
c.move(egg, 0, 10)
i f egg_y2 > canvas_height:
egg_dropped(egg)
ro ot.after(egg_speed, move_eggs)
def egg_dropped(egg):
eggs.remove(egg)
c.delete(egg)
lo s e _ a _ L ife ()
i f lives_rem aining == 0:
messagebox.showinfo('Конец и гр ы !', 'Итоговый счет: ' + s t r (s c o r e ))
ro o t.d e stro y()
def in c re a s e _ sc o re (p o in ts):
global score, egg_speed, eg g _in te rval
score += points
egg_speed = int(egg_speed * d if f ic u lt y _ f a c t o r )
eg g _in te rval = in t(e g g _ in te rv a l * d if f ic u lt y _ f a c t o r )
c .ite m c o n fig u re (sc o re _ te x t, text='C4eT: ' + s t r (s c o r e ))
r o o t .a f t e r (1000, create_egg)
r o o t .a f t e r (1000, move_eggs)
r o o t .a f t e r (1000, check_catch)
root .mainloop()
Глоссарий
ASCII Блок-схема Вывод Интерфейс
American Standard Code Диаграмма, которая опи Данные, которые программа Механизм взаимодействия
for Information Interchange сывает программу в виде показывает пользователю. пользователя с програм
(Американский стандарт последовательности шагов мой или устройством.
ный код для обмена и решений. Вызов См. также GUI.
информацией) — способ Обращение к функции
представления символов Булево значение из кода программы. Комментарий
в двоичном коде. Ответ True («правда») или Текстовое примечание
False («ложь») на вопрос, Глобальная переменная в коде, которое помогает
GUI который задает программа. Переменная, значение понять, как устроена
Graphic User Interface которой доступно всем программа. Не влияет
(графический интерфейс Ввод частям программы. на ее работу.
пользователя) — кнопки, Данные, которые пользова См. также Локальная
окна и другие элементы тель вводит в компьютер переменная. Константа
управления программой, через специальные Значение, которое невоз
с которыми пользователь устройства: клавиатуру, Графика можно изменить.
может взаимодействовать. мышку, микрофон. Элементы на экране, кото
рые не являются текстом, Координаты
Python Ветвление например картинки, Пара чисел, задающая по
Популярный язык про Место в коде, в котором иконки и символы. ложение точки на экране
граммирования, который у программы есть выбор из по горизонтали и верти
создал Гвидо ван Россум. двух вариантов действий. Данные кали. Обычно записыва
Отлично подходит для Информация, представ ются как (х, у).
начинающих. Вещественное число ленная в виде текста,
Дробное число с десятич символов или чисел. Кортеж
turtle ной точкой. Набор разделенных запя
Модуль Python, позволяю Запуск тыми элементов в круглых
щий создавать на экране Виджет Передача кода программы скобках. Кортеж похож
графику и анимацию с по Независимый элемент на выполнение. на список, однако после
мощью робота-черепашки. графического интерфейса, создания его элементы
который имеет стандарт Индекс нельзя изменить.
Аргумент ный вид и выполняет стан Номер элемента в списке.
Значение, передаваемое дартные действия. В книге В Python первый элемент Локальная переменная
в функцию при вызове. используются виджеты имеет индекс 0, второй — 1 Переменная, значение
модуля Tinker. и т.д . которой доступно лишь
Баг одной части кода, например
Ошибка в коде, из-за кото Вложенный цикл Инструкция коду функции. См. также
рой программа работает Цикл, помещенный внутрь Наименьшая автономная Глобальная переменная.
не так, как задумано, или другого цикла. часть языка программиро
не работает вовсе. вания: команда или набор Модуль
Возвращаемое команд. Набор готового к исполь
Библиотека значение зованию кода, который
Набор функций, который Значение, которое функ можно импортировать
можно повторно использо ция передает обратно в свои программы.
вать в разных программах. в вызвавший ее код.
Оператор Программное Условие Юникод
Символ, позволяющий обеспечение(ПО) Конструкция, которая Универсальная кодировка
выполнить определенное Совокупность программ, служит для принятия символов, поддерживаю
действие в коде, например работающих на компью решения в программе щая тысячи разных букв
сложение (+) или вычита тере. и возвращает True и знаков.
ние (-). или False. См. также
Рекурсия Булево значение. Язык
Операционная система Цикл, возникающий, когда программирования
Программа, управляющая функция вызывает саму Файл Язык, на котором можно
компьютером, такая как себя. Именованный набор писать инструкции
Windows, macOS, Linux и т. д. данных. для компьютера.
Синтаксис
Отладка Правила написания кода. Флаговая
Поиск и исправление оши Несоблюдение синтакси переменная
бок в программе. са приводит к ошибкам. Переменная, принимающая
одно из двух состояний,
Отступ Словарь таких как True и False.
Способ сместить блок кода Набор парных значений,
вправо относительно дру таких как страны и их Функция
гих блоков. В Python отступ столицы. Выполняющий конкрет
равен 4 пробелам. Все ную задачу код, который
строки в отдельно взятом Случайные работает как программа
блоке нужно вводить с значения в программе.
одинаковым отступом. Значения, которые нельзя
предсказать заранее. Целое число
Переключение Часто используются Число, которое не
Смена двух возможных при создании игр. является дробью и
состояний. записывается без
Событие десятичной точки.
Переменная Действие, на которое
Именованное место для программа может от Цикл
хранения данных, которые реагировать, например Код, который выполня
можно изменять. нажатие клавиши или ется повторно, так что
клик мышкой. его не нужно каждый
Пиксель раз вводить заново.
Мельчайшая точка цифро Список
вого изображения. Набор элементов, храня Шифрование
щихся в определенном Кодирование данных
Программа порядке. с целью сделать их
Набор инструкций, кото доступными лишь
рым следует компьютер, Строка конкретным людям.
решая ту или иную задачу. Последовательность
символов, таких как
цифры, буквы, знаки
препинания, пробелы.
Предметный указатель
Жирным шрифтом None, значение 173 time, модуль 169 «Календарь ожидания»
выделены номера onkey, функция 162,165, time, функция 59 111
страниц с важными 167 Tkinter, модуль 111-113,121 «Мемори» 181
сведениями. open, функция 59 «Знаток»120 «Радуга-пружинка» 84
outside_window, функция «Календарь ожидания» «Сборщик роботов» 73
append, функция 68 163,165-166 110 «Снэп»169
ASCII см. символы pass, команда-заглушка координаты 145 «Тайная переписка» 132
Button, виджет 184 161,163 «Мемори» 181-182, тест «Животные» 37
Canvas, виджет 170-171 print, функция 44 184-187 «Экранный питомец» 143
capitalize, функция 129 pygame, модуль 199 «Снэп» 168-170,173, «Яйцелов»192
choice, функция 54, 59, Python, язык програм 176-177 булевы значения 28-29
62, 98,140 мирования 12,16 «Тайная переписка» 130
create_egg, функция 196 в действии 15 «Экранный питомец»
create_oval, функция первая программа 142 В
171,177 22-23 «Яйцелов» 191,193,195, ввод из файла 111
create_rectangle, функция причины популярности 199 ветвление 30-31
172 14 upper, функция 45 вещественное число
cycle, функция 84, 86, установка 16-17 webbrowser, модуль 58 см. числа
194 randint, функция 96 while см. цикл взломщик паролей 52
datetime, модуль 58,111, random, модуль 53, 54, Windows, операционная виджеты 111
114 58 система 16 вложенный цикл
for см. цикл random, функция 96 см. цикл
GUI 111 randrange, функция 55 возвращаемое значение 47
hideturtle, функция 78, range, функция 32 А вывод в файл 125
96,160 replace, функция 45 аргументы 44-46
IDLE 16 reverse, функция 45 аркадная игра 191
окно консоли 18 RGB-цвета см. цвета см. также «Яйцелов» Г
окно программы 19 root.mainloop, функция 143 «Генератор паролей» 52-57
сообщение об ошибке root, виджет 113,123,134, блок-схема 53
48 144,170,182,193 Б доработки 57
цвета в коде 19 score см. переменная баги 13 пишем код программы
import, команда 59 Scratch, язык програм исправление 2 3 , 48-51 53-56
input, функция 44, 56 мирования 12 памятка по ловле 51 работа программы 52-53
int, функция 119,137 setheading, функция 81, поиск 48 графический интерфейс
itemconfigure, функция 164 «Безумная радуга» 98-107 пользователя см. GUI
175 shuffle, функция 169,173, блок-схема 100 «Гусеница» 158-167
join, функция 136 183 доработки 105-107 блок-схема 159
len, функция 26,136 simpledialog, виджет 121, пишем код программы доработки 165-167
listen, функция 162 126 101-104 пишем код программы
lower, функция 40 sleep, функция 169 работа программы 159-165
macOS, операционная sort, функция 119 98-101 работа программы
система 17 speed, функция 97 блок-схема 22 158-159
mainloop, функция 169, stamp, функция 106 «Безумная радуга» 100
181,199 start_gam e, функция 161, «Генератор паролей» 53
max, функция 45
messagebox, виджет 121,
162,164,166
statistics, модуль 58
«Гусеница» 159
«Девять жизней» 61
д
«Девять жизней» 60-69
187 str, функция 40, 55 «Звездное небо» 92 блок-схема 61
min, функция 45 string, модуль 53 «Знаток»121 доработки 66-69
пишем код программы К отступа 49 С
62-65 кавычки синтаксиса 49 «Сборщик роботов» 72-81
работа программы парные 49 типизации 50 блок-схема 73
60-61 строки 26,173 доработки 79-81
доработки «Календарь ожидания» пишем код программы
«Безумная радуга» 110-119 П 74-78
105-107 блок-схема 111 пауза 170,173 работа программы 72-73
«Генератор паролей» 57 доработки 118-119 перевод строки (\п), сверка фактов 129
«Гусеница» 165-167 пишем код программы символ 42,114 символы
«Девять жизней» 66-69 112-118 удаление 125 ASCII 61
«Звездное небо» 97 работа программы переключение 146,150-151 добавление в игру 183
«Знаток»128-129 110-111 переменная 24-27 Юникод 61
«Календарь ожидания» комментарий 75,95 score 38 скобки
118-119 константа 55 глобальная 174 аргументы 39,44-46
«Мемори» 187-189 координаты 76,145 имя 24 квадратные скобки 27
«Радуга-пружинка» 87-89 криптография 130 локальная 174 координаты 76
«Сборщик роботов» создание 24 фигурные скобки 123,124
79-81 флаговая 150 словарь 121
«Снэп» 177-179 М цикла 32 добавление данных 125
«Тайная переписка» «Мемори» 180-189 перо черепашки 73,74,85 использование 124
138-141 блок-схема 181 пиксели 90 подготовка 123
тест «Животные» 42-43 доработки 187-189 программирование 12-13 сложность игры
«Экранный питомец» пишем код программы программист, навыки 13 «Гусеница» 158,167
153-155 182-186 «Девять жизней» 66-67
«Яйцелое»199 работа программы тест «Животные» 42-43
180-181 Р «Яйцелов» 194,198
модули 5 8-5 9 «Радуга-пружинка» случайные числа см. числа
3 встроенные 58 82-89 «Снэп» 168-179
заглушка см. pass использование 59 блок-схема 84 блок-схема 169
«Звездное небо» 90-97 установка 199 доработки 87-89 доработки 177-179
блок-схема 92 музыка, проигрывание пишем код программы пишем код программы
доработки 97 199 84-87 170-176
пишем код программы мышка, движение курсора работа программы работа программы
92-96 и клики 82-84 168-169
работа программы 90-92 «Звездное небо» 97 регистр букв 37,40,129 сообщение об ошибке
звуки 199 «Экранный питомец» рекурсия 85,86 см. IDLE
«Знаток» 120-129 142-144,148-149 решетка (#), символ 75 список 27,136
блок-схема 121 рисование позиции 115
доработки 128-129 дуги 177-178 сравнения 28-29
пишем код программы О квадрата 78,172 множественные 29
122-128 окно консоли см. IDLE линии 100-105,178 стандартная библиотека
работа программы окно программы см. IDLE многоугольника 178 14,58
120-121 остаток от деления (%), овала 171,177 строка 26, 55
оператор 135 окружности 82-85,171 длина 26,136
отступы 35 подготовка 81 повторение 65
И ошибка см. также баги прямоугольника 74-75, пустая 173
игры 158-199 именования 50 172 разделение 116
интерпретатор 15 логическая 51 языка 149 счет, вывод на экран 160,164
т
тайминг 190
функция 44-47
встроенная 44
цикл 32-35
for 32
э
«Экранный питомец»
«Тайная переписка» 130-141 вызов 37,44,45 while 33-34 142-155
блок-схема 132 вызывающая себя бесконечный 34 блок-схема 143
доработки 138-141 см. рекурсия вложенный 35,185 доработки 153-155
пишем код программы имя 47 выход 34 пишем код программы
133-138 лямбда-функция 181, 144-153
работа программы 184 работа программы
130-132 создание 46-47 Ч 142-143
текст, апгрейд 119 черепашка
текстовый файл 111-114 границы перемещений
тест X 101,103 Ю
варианты ответа 42 холст 113 координаты 76 Юникод см. символы
ответы типа «да — нет» 43 «Безумная радуга» невидимая 78,96
тест «Животные» 36-43
блок-схема 37
доработки 42-43
98-99,102-105
замена фонового цвета
118
рисование 73
скорость 75
стандартный режим 74
я
языки программирования
пишем код программы «Звездное небо» черепашья графика 72-107 12
38-41 94-95 см. также «Безумная «Яйцелов» 190-199
работа программы 36-37 «Календарь ожидания» радуга»; «Звездное небо»; блок-схема 192
113,118-119 «Радуга-пружинка»; доработки 199
размеры 144 «Сборщик роботов» пишем код программы
У увеличение 155 числа 193-199
углы, вычисление 93 «Экранный питомец» вещественные 25 работа программы
условие 30 144 использование 25 190-192
условие цикла 33 случайные 54
Ф
ц
цвета 79,90
целые 25,55