Views Comments Previous Next Search

Я пишу текстовую игру на Python: дизайн-документ

 В новом выпуске блога о программировании я привожу первую версию дизайн-документа LAM-40 и добавляю в игру возможность проигрыша функцией game_over().

Я пишу текстовую игру на Python: дизайн-документ. Изображение № 1.

Предыдущий выпуск

Я пишу текстовую игру на Python: элемент случайности

 

Я пишу текстовую игру на Python: дизайн-документ. Изображение № 2.

В прошлый раз мы добавили в LAM-40 элемент случайности. Теперь для каждого действия в игре высчитывается вероятность его выполнения, которая зависит сразу от нескольких показателей. Уже два выпуска я обещаю сформулировать в дизайн-документе, что будет представлять собой финальная версия игры, и сегодня наконец подошло время для этого. Также я добавил в новую промежуточную версию игры возможность проигрыша: игра отсчитывает, сколько времени уходит на каждое действие игрока, и если все действия, предпринятые игроком, занимают больше 12 внутриигровых часов, то случается game_over(), который иногда происходит и в том случае, если вам не удались некоторые особо рисковые действия.

ПРИМЕЧАНИЕ: весь код приводится для Python версии 3.0 и старше, а потому может не работать на более старых версиях.

   

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

Не забывайте, что это только первая версия дизайн-документа. Обычно он изменяется по ходу разработки, хотя и несильно, — а если его приходится сильно дорабатывать, значит, создатели игры предусмотрели далеко не всё.

   

Теперь вы, надеюсь, более-менее понимаете, к чему мы стремимся. В этот раз изменения произошли только в файле game.py, где находится основная логика игры. Я добавил в игру отслеживание текущего внутриигрового времени и внёс некоторые другие правки.

  Строка 3: добавляем модуль datetime, который нужен для работы с датой и временем. Он особенно удобен в том случае, когда приходится возиться с часовыми поясами, потому что автоматизирует кучу вещей — но нам это сегодня, к счастью, не нужно.

  Строка 22: присваиваем переменной timer элемент datetime с заданными характеристиками. Обратите внимание, что запись делается по форме как datetime.datetime() — сначала мы указываем название модуля datetime, после точки — название элемента datetime, а в скобках — желаемые аргументы элемента. В нашем случае это год, месяц, день, час и минута. При желании можно было продолжить секундой и миллисекундой. Полученный элемент — это точка отсчёта, с которой начинается игра. Именно к нему будут прибавляться временные отрезки, которые будут занимать выполнение каждого действия.

  Строки 29–34: теперь ко всем числам до 10 добавляется 0, чтобы все действия выводились в один ряд. Для этого программа проверяет с помощью операторов ветвления, на какой итерации цикла мы сейчас находимся, и начиная с 10-й итерации уже не подставляет нули перед числом. 

  Строки 35–37: добавляем строку с отображением текущего времени, используя функцию strftime(), которая переводит элемент datetime в тип данных string. Для этого используются ключевые символы, настраивающие способ отображения даты и времени. Полный перечень ключевых слов можно найти в самом низу документации модуля.

  Строки 40–48, 83–89: в основной логике игры появилась функция evaluate_time(), которая проверяет, истекли внутриигровые 12 часов или нет. Для этого мы вычитаем из текущего времени на таймере время начала игры. Чтобы не хранить его в отдельной переменной, я вновь указываю его полностью. Так как из-за этого строка становится слишком длинной, я использую символ \, который показывает интерпретатору, что текущую и следующую строки стоит объединить в одну. Если время вышло, то игра окончена — следовательно, вызывается функция game_over(), о которой ниже. Если не вышло, то выполняется следующий элемент основной логики игры.

  Строки 52–81, 132–134: функция timer_add() прибавляет к переменной self.timer время, которое заняло действие. Это время выбирается случайным образом из заданного промежутка — чем более рисковое действие, тем меньше оно занимает времени (указывается в секундах). Учтите, что все цифры пока сильно предварительные — на поздней стадии игре ещё потребуется серьёзная балансировка. Для того чтобы прибавить к self.timer выпавшие случайным образом секунды, используется элемент timedelta, входящий в модуль datetime. Timedelta возникает при вычитании одного элемента datetime из другого. По сути, это разница между двумя моментами во времени. Помимо обязательного self (не забывайте, мы находимся в классе Game), функция timer_add принимает аргумент seconds_passed — количество секунд, которое заняло действие. Именно это количество секунд и прибавляется к self.timer. Также обратите внимание, что timedelta требует указания аргумента через конструкцию seconds= — просто так указать в скобках число недостаточно, выскочит ошибка. Иначе говоря, вы должны обозначить конкретную единицу времени для timedelta.

  Строки 143–156: функция game_over() приводит к экрану окончания игры, с которого можно либо выйти из игры, либо перезагрузить её. Игра проверяет, какое действие игрок вводил последним. Если одно из четырёх наиболее рисковых, то игра моментально заканчивается в случае вашей неудачи (позднее всё будет, конечно, не так обречённо), и бюрократ сдаёт вас полиции. Если же истекло время, то игра сообщает об этом. При желании можно ввести 'r', и игра начнётся заново. Для этого мы используем функцию execl() модуля операционной системы os, перезагружающей текущий скрипт. Подробнее об этом можно прочитать здесь.

   

Внешний вид программы изменился несильно: разве что действия теперь отображаются в один ряд благодаря добавленным нулям, да и таймер внизу появился.

Я пишу текстовую игру на Python: дизайн-документ. Изображение № 3.

В следующий раз интерфейс ждёт вторая кардинальная переделка. Во-первых, я хочу добавить в игру кое-какие графические элементы (например, лица бюрократов, отображаемые с помощью сложных эмотиконов) и постепенный вывод текста. Во-вторых, выбор действий с помощью ввода букв — не самая удобная вещь. Гораздо лучше делать это с помощью клавиш со стрелками. В-третьих, пришла пора добавить в игру случайные встречи с другими несчастными посетителями Учреждения, тем более это технически несложно. А если я успею, то добавлю ещё и подсчёт лучшего результата, который будет храниться отдельно даже после того, как вы закончили играть. Не уверен, что успею всё это сделать, но постараюсь!

Если вам что-то непонятно, пишите комментарии под материалом и в социальных сетях — буду рад и любым другим отзывам. Если вы более опытный в программировании человек, чем я, то с удовольствием выслушаю содержательную критику. Спасибо и до следующего раза!

Смотрите также:

  Документация модуля datetime

  Документация модуля os

  Полные курсы Python на Codeacademy и Treehouse*

* — платные курсы, но есть пробный период

  Развитие программистского мышления на Udacity

  Учебники по Python на LearnPython.org и Python Course

изображение via MaGUMa *

Рассказать друзьям
2 комментарияпожаловаться

Комментарии

Подписаться
Комментарии загружаются
чтобы можно было оставлять комментарии.