Я пишу текстовую игру для Python: альфа-версия
В новом выпуске блога о программировании я довожу текстовую игру LAM-40 до альфа-версии и готовлюсь к началу публичного бета-тестирования.
Предыдущий выпуск
моя имитация Цикла разработки достигла АПОГЕЯ неделю назад. Я сорвал дедлайн и не успел подготовить версию LAM-40, которая должна была сопровождать новый выпуск, из-за чего блог на неделю взял перерыв. За это время я успел довести игру до альфа-версии: теперь её теоретически можно пройти от начала до конца. У меня, правда, так и не получилось добраться до 40-го этажа: время истекало где-то на 21-м. Пока игра слишком сложная и нуждается в полной ребалансировке, но, к счастью, от альфа-версии особого блеска и не требуется. А главное, мне удаётся следовать плану, заданному в дизайн-документе из предыдущего выпуска.
ПРИМЕЧАНИЕ: весь код приводится для Python версии 3.0 и старше, а потому может не работать на более старых версиях.
Больше всего изменений, как всегда, в файле game.py. Если честно, к альфа-версии он снова превратился в настоящее месиво: сейчас в этом обилии перекликающихся друг с другом функций легко запутаться. К бета-версии я надеюсь всё исправить, раскидав функции по другим файлам и сделав тем самым код более читаемым.
Строки 17–40: очередные перестановки в основной логике игры. На этот раз в неё, помимо экрана приветствия с описанием игры и дисклеймером, добавилось понятие «этажа». «Этаж» — это препятствие из 1–3 бюрократов, своеобразный «уровень», а вся игра — это уже знакомый нам цикл for-in из 39 этажей-итераций, которые нужно пройти, чтобы добраться до 40-го этажа и увидеть концовку. В переменной bureaucrats_number хранится число бюрократов, которых требуется победить на текущем этаже. Из этих сражений образуется ещё один цикл for-in. Циклу, как и функции random.choice(), можно преподнести только итеративный элемент — например, список. Из-за этого я скармливаю им функцию range() на 1–3 элемента, то есть списки (0), (0, 1) и (0, 1 ,2)), а не целые числа 1, 2 и 3.
Обратите внимание на модуль time, добавленный в файл, и его функцию sleep(), которую я использую. Она тормозит исполнение интерпретатором всех операций в коде. В нашем случае это позволяет выводить весь текст постепенно, а не обновлять экран целиком — теперь читать то, что происходит в игре, гораздо удобнее. Аргумент, который скармливается функции time.sleep(), — это количество секунд, на которое программа встаёт на паузу. Он может быть как целым числом (integer), так и десятичной дробью (float). Также я добавил в основную логику игры случайные встречи с другими посетителями Учреждения, о которых я упоминал в дизайн-документе. Мы сосредоточимся на них в следующий раз: пока они ссылаются на плейсхолдер в файле text.py. Если игрок проходит все 39 циклов и время не истекает, то выполняется функция game_completed() — о ней ниже.
Строки 56–66: я убрал создание нового образца класса Bureaucrat из основной логики и переместил его в функции, связанные с действиями игрока. Вероятный баг игры на текущем этапе, который у меня не всегда получается воспроизвести, — это то, что таймер иногда переходит отметку в 20:00 и не прекращает игру. Возможно, это связано с тем, что функция evaluate_time(), отвечающая за наступление game_over(), вызывается не везде, где нужно. Я вроде бы уже исправил эту ошибку, но на всякий случай продолжу её выглядывать.
Строки 143–158: функции react_negatively() и react_positively() переехали в основной файл игры — надеюсь, что временно, но пока без этого было никуда. Вообще, когда файл с кодом переходит отметку 200 строк, читать его становится довольно сложно — особенно в сравнении с другими файлами, которые довольно коротки.
Строки 192–201: функция, вызываемая в том случае, если игрок прошёл LAM-40. Экран очищается самодельной функцией clear_screen(), а далее идёт развилка: если игрок прошёл LAM-40 менее чем за 6 внутриигровых часов, то он увидит секретную концовку, если понадобилось больше времени, то обычную. Наконец, программа прекращает работу и напоследок выводит сообщение с поздравлением.
В файле bureaucrat.py всё намного скромнее. Помимо уже упомянутой функции time.sleep(), я добавил в этот класс визуализацию бюрократов с помощью символов-звёзд, обозначающих ранг, и эмотиконов, обозначающих настроение. Тут ничего сложного: для аккуратного форматирования текста ставим в нужные места пробелы и символы переноса строки, а также сцепляем переменные типа string с помощью оператора +.
В файле character.py одно серьёзное изменение: я сделал разбивку действий в переменной actions с помощью функции split(). В предыдущей версии я присваивал переменной список, в котором было очень много запятых и одинарных кавычек. Функция split() разбивает один string на список, элементы которого — группы символов между пробелами. Выходит по сути то же самое, но редактировать такой список действий намного удобнее — а мне это пригодится во время работы над бета-версией.
Вот несколько скриншотов из альфа-версии. Да, впереди полно работы, но это уже что-то.
К следующему выпуску я хочу успеть кучу всего. Всё-таки я впервые отдам игру на тестирование другим людям, а потому многое нужно привести в порядок: как внешне, так и внутренне. Интерфейс пора улучшить долгожданным меню выбора, а в саму игру хорошо бы добавить ощущение продвижения по ней с помощью изменения доступных действий и постоянного отображения текущего этажа. Коду нужна заключительная реструктуризация, его частям — более понятные комментарии. Наконец, я хочу добавить возможность сохранять лучший результат игрока — либо номер этажа, до которого он успел добраться, либо время, за которое он прошёл игру. Чтобы успеть всё это за неделю, понадобится классический development rush — но ничего, справлюсь!
Если вам что-то непонятно, пишите комментарии под материалом и в социальных сетях — буду рад и любым другим отзывам. Если вы более опытный в программировании человек, чем я, то с удовольствием выслушаю содержательную критику. Спасибо и до следующего раза!
Смотрите также:
Документация модуля Time
Полные курсы Python на Codeacademy и Treehouse*
* — платные курсы, но есть пробный период
Развитие программистского мышления на Udacity
Учебники по Python на LearnPython.org и Python Course
изображения via Inès Le Bihan, MaGUMa *
Комментарии
Подписаться