— Интерпретатор Python выполняет программу строку за строкой, переводя её в байт-код при каждом запуске.
— Python ставим через uv, код пишем в VS Code с расширениями Python и Ruff.
— Программа на Python может состоять из одной строки: print(«Hello, Doom!»).
— print печатает несколько значений через пробел; sep меняет разделитель, end — окончание строки.
— Тройные кавычки хранят многострочный текст, буква r делает строку сырой — идеально для ASCII-арта.
— Ошибки бывают синтаксические (видны сразу) и во время выполнения (видны, когда до них дойдёт). Вторые ловим заранее: опечатки — Ruff, типы — mypy.
— Трейсбек читаем снизу вверх.
Контрольная точка: у тебя есть программа, которая печатает титульный экран MINI DOOM и проходит проверку Ruff и mypy. В следующей главе на экране появятся числа — здоровье, патроны и урон, — и мы посчитаем, сколько выстрелов нужно, чтобы уложить импа.
Упражнение 1.1. Что выведет? Не запуская программу из листинга 1.12, напиши на бумаге, что она напечатает. Потом проверь себя.
Листинг 1.12 — Упражнение 1.1
Упражнение 1.2. Найди баг. Программа из листинга 1.13 не запускается. Почему? Попробуй догадаться до того, как запустишь её.
Листинг 1.13 — Упражнение 1.2
Упражнение 1.3. Напиши сам. Выведи надпись PRESS ENTER в рамке из символов +, — и |. Рамка должна быть ровной: углы на своих местах, стороны одной длины.
Упражнение 1.4. Подумай. Программа из листинга 1.6 успела напечатать две строки, прежде чем упасть. Программа из листинга 1.5 не напечатала ничего. Почему так? Какая из этих двух ошибок опаснее в большой игре?
Задача 1.1. Экран загрузки. Напиши программу, которая печатает заголовок с версией игры и несколько строк вида «Loading textures ...... OK», где слово OK во всех строках стоит строго в одном столбце. Закончи боевым кличем.
Задача 1.2. Свой баннер. Нарисуй в сырой строке титульник со своим ником. Потом попробуй закончить рисунок обратным слэшем прямо перед закрывающими кавычками. Что случится и как это обойти?
Задача 1.3. Коллекционер ошибок. Сломай программу из листинга 1.1 пятью разными способами: убери скобку, закавычь не то, напиши Print с большой буквы, добавь лишний пробел в начале и так далее. Для каждой поломки выпиши последнюю строку ошибки и объясни её своими словами. А потом проверь каждую сломанную версию Ruff: какие из ошибок он нашёл бы до запуска?
Игра — это числа. Здоровье, патроны, урон, координаты, время на уровне, процент найденных секретов. Даже красивая картинка в конце концов — горсть чисел, которые означают цвета. В этой главе мы научимся хранить числа и строки в переменных, считать с ними, выводить их красиво и не наступать на грабли, разложенные на этом пути. А в конце посчитаем, сколько выстрелов из пистолета нужно, чтобы уложить импа.
Представь склад, заставленный коробками. В каждой коробке лежит значение: число 100, строка «imp», дробное 3.4. Сами коробки безымянные, зато на них можно повесить бирку с именем. Вот эта бирка и есть переменная в Python: имя, привязанное к значению. Запись health = 100 читается так: «положи на склад коробку со значением 100 и повесь на неё бирку health». Знак = в программировании — не «равно», а «привязать».
Листинг 2.1 — Переменные игрока: создаём, печатаем, меняем
Строки 1–3 создают три переменные. Имена пишем маленькими буквами, слова разделяем подчёркиванием: health, ammo, player_speed. Так в Python принято, и Ruff проследит, чтобы ты не написал PlayerSpeed там, где ждут переменную. Имя не может начинаться с цифры и не может совпадать со словами языка вроде if или for.
Строка 9. ammo = ammo — 1 — с точки зрения математики бред, а для программы нормальная команда: возьми то, на чём висит бирка ammo, отними единицу, а бирку перевесь на результат. Строка 10 делает то же самое короче: health -= 15 значит health = health — 15. Так же работают +=, *=, /= и остальные.
Бирки — не просто красивая метафора, Python действительно так устроен. Смотри листинг 2.2.
Листинг 2.2 — Две бирки на одной коробке и что бывает при изменении
Строка 2. armor = health не копирует число: на ту же самую коробку 100 вешается вторая бирка. Проверка health is armor в строке 3 так и отвечает: True, это один и тот же объект. А type(health) говорит, что в коробке лежит int — целое число.
Строка 5. health -= 15 не меняет число внутри коробки — числа в Python неизменяемые, как надпись на камне. Вместо этого на складе появляется новая коробка 85, и бирку health перевешивают на неё. armor продолжает висеть на старой коробке 100. Как это выглядит, показано на рисунке 2.1.
Рисунок 2.1 — Переменные — бирки на коробках. Изменение числа вешает бирку на новую коробку, а не переписывает старую
О проекте
О подписке
Другие проекты