Читать книгу MINI DOOM Современный Python через игру Том 1 Учимся держать оружие (Алексей Примак) онлайн бесплатно на Bookz (2-ая страница книги)
MINI DOOM Современный Python через игру Том 1 Учимся держать оружие
MINI DOOM Современный Python через игру Том 1 Учимся держать оружие
Оценить:

4

Полная версия:

MINI DOOM Современный Python через игру Том 1 Учимся держать оружие

Сводка — в таблице 1.2.




Таблица 1.2 — Первые ошибки, которые ты встретишь, и кто их ловит


Главные правила чтения ошибок такие:

— Читай трейсбек снизу вверх: последняя строка — что случилось, выше — где.

— Смотри на номер строки и на строку выше.

— Читай суть целиком, а не только слово Error. Python обычно говорит прямо, чего ему не хватает, и часто подсказывает: Did you mean…?

— Если ничего не понятно — скопируй последнюю строку и поищи её в интернете. С этой ошибкой до тебя уже встретились тысячи людей.

Настраиваем строгость

Ruff и mypy по умолчанию добрые: проверяют немного и закрывают глаза на многое. Мы сделаем из них злых прапорщиков. Настройки проекта в Python живут в файле pyproject.toml в корне папки. Создай его рядом с main.py и заполни, как в листинге 1.10.




Листинг 1.10 — Настройки проекта: строгий Ruff и строгий mypy


Раздел [project] описывает сам проект: имя, версию и минимальную версию Python. Раздел [tool.ruff.lint] включает наборы правил Ruff: каждый код — отдельная группа проверок, от стиля (E, W) и явных ошибок (F) до подозрительных конструкций (B), устаревших приёмов (UP) и лишних сложностей (SIM, PL). Названия групп можно не запоминать: Ruff в каждом замечании пишет код правила, а по коду легко найти объяснение. Строка ignore выключает три правила, которые ругаются на русские буквы в комментариях, и одно, которое в учебных примерах только мешает. Раздел [tool.ruff.lint.pylint] чуть смягчает одно правило: Ruff по умолчанию считает подозрительной функцию больше чем с пятью параметрами, а в игре рисование прямоугольника — это четыре координаты, цвет и сам холст. А strict = true в разделе [tool.mypy] включает у mypy самый строгий режим.

Каждый пример в этой книге проходит обе проверки без единого замечания, прежде чем попасть в листинг. Как это выглядит в терминале, показано в листинге 1.11: так стоит проверять свою программу перед каждым запуском.




Листинг 1.11 — Проверка перед запуском: Ruff, mypy и только потом программа



Итоги главы

— Интерпретатор 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: какие из ошибок он нашёл бы до запуска?

Глава 2. Переменные и типы

Игра — это числа. Здоровье, патроны, урон, координаты, время на уровне, процент найденных секретов. Даже красивая картинка в конце концов — горсть чисел, которые означают цвета. В этой главе мы научимся хранить числа и строки в переменных, считать с ними, выводить их красиво и не наступать на грабли, разложенные на этом пути. А в конце посчитаем, сколько выстрелов из пистолета нужно, чтобы уложить импа.

Переменная — бирка на коробке

Представь склад, заставленный коробками. В каждой коробке лежит значение: число 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 — Переменные — бирки на коробках. Изменение числа вешает бирку на новую коробку, а не переписывает старую



Какие бывают типы

У каждой коробки на складе есть тип — что именно в ней лежит. От типа зависит, что с значением можно делать: числа складывают, строки склеивают, а сложить число со строкой, как мы видели в главе 1, нельзя. Узнать тип помогает функция type, а превратить значение одного типа в другой — функции с именами типов. Всё это в листинге 2.3.




Листинг 2.3 — Основные типы и превращения между ними


Строки 6 и 7 показывают пять типов, которые встречаются постоянно. Строка 8 — превращения: int(«42») делает из строки число, к которому можно прибавить единицу; float(«2.5») — дробное; str(7) — строку, которую можно склеить с другой строкой. В строке 9 — правило, которое пригодится в главе 3: ноль и пустая строка считаются ложью, всё остальное — правдой. Сводка — в таблице 2.1.




Таблица 2.1 — Основные типы Python


Длинные числа можно разделять подчёркиваниями: 1_000_000 — то же, что 1000000, но читается без подсчёта нулей.

Числа, которые не ломаются

В большинстве языков у целого числа есть предел. Например, в C++ обычный int заканчивается на 2 147 483 647, и если к нему прибавить единицу, число перескакивает в огромный минус — это называется переполнение. Из-за таких историй в старых играх счётчики очков внезапно становились отрицательными. В Python у int предела нет, смотри листинг 2.4.




Листинг 2.4 — Целые числа Python растут без предела


Число 2**100 — это 2 в сотой степени, две звёздочки означают возведение в степень. А 2 в десятитысячной степени содержит 3011 цифр, и Python посчитал его честно. Платим мы за это скоростью и памятью: чем больше число, тем дольше с ним работать. Для игры это не проблема, у нас числа скромные.



Деление: три разных оператора

Со сложением, вычитанием и умножением всё как в школе: +, — и *. А вот делений в Python три, и путать их — верный способ получить баг. Листинг 2.5.




Листинг 2.5 — Обычное деление, целая часть и остаток


— / — обычное деление. Результат всегда float, даже если делится нацело: 6 / 2 даёт 3.0, а не 3.

— // — целая часть от деления: 7 // 2 даёт 3. Сколько полных обойм помещается в рюкзак.

— % — остаток от деления: 7 % 2 даёт 1. Сколько патронов останется россыпью.

— divmod(a, b) — частное и остаток одним махом: 200 секунд — это 3 минуты и 20 секунд.



Дроби и округление

Посчитаем процент убитых монстров для экрана конца уровня, как в настоящем Doom. Код — в листинге 2.6.




Листинг 2.6 — Проценты, отрезание дроби и округление


Строка 4. kills / total — обычное деление, получаем дробь, умножаем на 100 — проценты. В C++ тут ждала бы ловушка: деление целых там отбрасывает дробь, и вышло бы 0. В Python оператор / всегда честный.

Конец ознакомительного фрагмента.

Текст предоставлен ООО «Литрес».

Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.

Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.

Вы ознакомились с фрагментом книги.

Для бесплатного чтения открыта только часть текста.

Приобретайте полный текст книги у нашего партнера:


Полная версия книги

Всего 10 форматов

bannerbanner