Как сделать текстовую игру на python

Добавил пользователь Валентин П.
Обновлено: 19.09.2024

Всем привет! Меня зовут Никита, и я обожаю игры. Причем мне доставляет удовольствие играть в игры самых разных жанров, от тактических игр вроде XCom, до ураганных шутеров вроде Doom. Об одном из моих любимых жанров, частички которого сейчас содержит в себе большинство современных игр, мы сегодня и поговорим.

Дамы и господа! Встречайте, его величество, ТЕКСТОООВЫЫЫЙ КВЕЕЕСТ! Под катом - история жанра и работы ребят с курса "Питон для начинающих".

А большинства современных геймеров возникнет закономерный вопрос: "Что это за зверь такой?"

> Текстовый квест - это довольно старый жанр компьютерных игр, суть которого состоит в том, чтобы взаимодействовать с игроком посредством текстового ввода. > > В английском данный жанр получил название Interactive fiction (интерактивная литература), так что представителей этого жанра частенько называют IF-ами.

В текстовых квестах выделяют два в вида взаимодействия с игроком:

  • интерфейс с вводом текста с клавиатуры;
  • интрефейс в виде меню, где игрок выбирает действие из нескольких предложденных

Первый вид квестов подразумевал ввод простых команд для перемещения (например, enter (войти), take( * ) (поднять что-то) и т.д.), которые позволяют персонажу перемещаться по миру игры и взаимодействовать с ним.

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

Первым общеизвестным представителем является Colossal Cave Adventure. Впервые эта игра запущена в 1975 году Уиллом Кроутером и Доном Вудсом. Это дядьки определенного знают свое дело, что они являются выпускниками известных технических вузов США.


Первая версия игры была написана языке FORTRAN, для платформы. как бы сказать. для серверов PDP-10. М-да. Даже такая не слишком объемная, по современным меркам игра требовала целого сервера для запуска! Тем не менее позже она была расширена и выпущена на кучи остальных платформ, от древнего DOS, до современных Windows.

CCA как раз относилась к первому типу квестов, вводя команды в консоль, вы продвигались по сюжету игры. Сначала мы стоим у дороги, а вот мы уже у леса, и вот мы уже исследуем мистическую пещеру, к которой и отсылает нас название игры. В нее можно по играть и сейчас. Во-первых, яндекс воплотила ее в Алисе, во-вторых, на мобильных устройствах, в частности на android, в-третьих, есть версия для Python и даже в браузера.

Да, даже сейчас вариативность старых квестов просто поражает даже на фоне современных игр. Хотя почему даже? Сейчас каждый лишний выбор означает дополнительный объем работы для разработчиков связанный и с анимациями, и новыми персонажами, локациями и многим другим. С другой стороны, это и делает жанр настолько уникальным!

Популярность квестов не прошла бесследно. Популярность CCA привело в будещем к появлению полноценных коммерческих проектов, таких как Zork, Trinity, Planetefall и десяткам прочих.

Позже, конечно, рынок текстовых квестов ослаб на волне роста компьютерных мощностей. Стали появляться квесты в том, числе и с графической оболочкой, например, поинт-энд-клик адвенчуры, и прочие расширения исходной концепции текстовых квестов. Кто-то может заявить, что теперь-то жанр точно пал смертью храбрых, однако нет и еще раз нет! Текствые квесты отомрут только, если отбросит коньки вся игровая индустрия. Загадочные уши текстовых квестов сейчас можно встретить практически в любой игре, от РПГ до стратегий, вы и сами, наверняка, вспомните пару игр типа Mass Effect, Fallout, Planescape Torment, DreamFall, которые позволяют нам, игрокам, делать выбор и решать судьбу игрового мира. Про работы Quantic dream или TellTales я вообще молчу.


Мало того, сейчас разработчики не брезгуют разработкой и современных текстовых квестов. Некоторые современные представители запускаются прямо в браузере n еще а браузере, другие осваивают мобильные просторы, а особо продвинутые разработчики поместили квест в телегерам-бота. У нас даже есть статья, как сделать такой квест!

Пройдясь по такой куче представителей жанра, уверен у многих возник в голове порыв, который звучит, как: "Я тоже хочу. ". И сейчас целая куча способов воплотить свой квест в реальность.

Например, мы на курсе предлагаем создавать ученикам текстовый квест на python. Для нас он является важным образовательным иструментом, поскольку с одной стороны текстовые квесты достаточно просты, но в тоже время их объем позволяет наработать практические навыки программирования.

На прошлой неделе ребята с курса "Питон для начинающих" завершили свои работы, так что я решил ими поделиться. Начнем по порядку.

1. Самосбор (работа Александра Ерченкова).


Мы попадаем в мир суровой антиутопии. Все окружение отдает чем-то советским, так что при игре кажется, что читаешь роман Стругатских или Замятина.

Самосбор - загадочное явление в мире игры, которое несет смерть каждому, кто не найдет герметичного укрытия. Мы играем. а впрочем это серьезный спойлер, если я скажу, за кого мы играем, так что поиграйте сами и узнаете. Ваш ждут и погони и прятки, а иногда гибель, так что будьте внимательны к своим выборам.

2. Ночное пробуждение (работа Никиты Тищенко).


От суровой антиутомии мы переходим к кровавому триллеру! Мы просыпаемся в странном доме, где творится не весть что. Наша задача очевидна - покинуть дом на своих двоих. Мы будем исследовать коридоры и комнаты на предмет вспомогательных принадлежностей, которые помогут нам сбежать. Кто же вас похитил? И как вам теперь дествовать? Ответом на эти вопросы и придется заниматься игрокам.

Полная версия игры для запуска на Python доступна в github, а онлайн версия без звука в repl. Удачно выбратся живым! Или нет. МУХАХАХАХА

3. Невинное утро (работы Софии Болотовой).


От прочих работы Софии отличается теплой и уютной атмосферой. Здесь нет головокружительных погонь или перестрелок, да и триллиру, который часто присущ современным текстовым квестам, здесь места нет. Взамен мы погружаемся в жизнь юного героя утренней истории. Нас встречает мальчик шести лет с полной цветовой слепотой, мы следуем за его утренним пробуждением и наивными похождениями.

Если вы устали от слишком остросюжетных историй, то квест Сони вам подходит идеально. Ознакомиться с полной версией квеста на Python можно на github, а с онлайн версией без звука на repl.

Вот такие проекты получились у наших ребят. Надеюсь, и вы оцените их по достоинству.

Как установить


Однозначного ответа на вопрос о том, какую версию python скачивать, не существует. До 2019 эксперты ещё не решили, какая версия лучше подходит для написания игр. Но чтобы не возникало лишних проблем и вопросов, лучше скачать 3.7.

Файл установщика займет примерно 26 мегабайт на диске. Двойным кликом на него откроется стандартное диалоговое окно, в котором нужно проставить галочки и запустить инсталляцию.

В самом конце, когда платформа будет установлена, она предложит убрать ограничение длины служебной переменной. Эта функция влияет на запуск Python из любого места системы компьютера. Необходимо просто кликнуть на текст в рамке.

Чтобы проверить правильность установки, нужно открыть командную строку и вписать туда слово python. После нажатия на Enter должен появится номер версии и список из нескольких команд для освоения в новой системе.

Для более удобного взаимодействия дополнительно необходимо установить Code VS.

Теория

Для начала работы с платформой и создания игры необходимо знать некоторые теоретические данные, которые не только будут полезны в дальнейшем, но и помогут понимать все процессы, происходящие в компиляторе с написанным кодом.

Pygame

Для создания собственной игры нужно работать со средой Pygame. Это так называемая игровая библиотека. Если проще, то набор инструментов, которые способствуют созданию игр.

Это три основных аспекта:

  1. Звуки (как музыка внутри игры, так и звук открытия дверей, падения шара и т. п.).
  2. Управление (привязанное к чему угодно, как классические средства ввода, так и различные геймпады).
  3. Графика и анимированные вставки.

Игровой цикл – основа нашей игры. Это кусочек кода, который запускается огромное количество раз, именно поэтому написанное визуализируется. Каждый такой цикл, который присутствует в окончательном виде, называют кадр.

В таком кадре происходит огромное количество процессов, но для понятности их можно разделить всего на три вида:

  1. Обновление. Это изменение всех предметов или явлений, происходящих за один кадр. Например, если объект подпрыгнул, его силой гравитации должно потянуть обратно к земле. Или если две движущиеся машины сталкиваются, то они должны отскочить друг от друга и получить повреждения.
  2. Ввод. Реакция программы на то, что происходит вне поля кода. То есть клики мышкой, какие-либо нажатия клавиатуры, управление стиками геймпада.
  3. Прорисовка. Этап, на котором код превращается в фон, персонажей, выпадающее меню, окружающую среду и прочие вещи, которые пользователь должен увидеть при взаимодействии.

Скорость работы цикла

FPS или Frames Per Second – количество кадров в секунду. Термин, знакомый любому геймеру. Многие знают только то, что для комфортной игры это значение должно быть больше 60. Программисты же понимают термин так: значение, указывающее количество повторений цикла за одну секунду.

Это необходимо для того, чтобы написанная программа не была слишком быстрой или медленной. Также важно, чтобы разные ПК или ноутбуки обрабатывали такое значение с одинаковой скоростью. Если машина должна ехать 7 секунд до столкновения, то это время не должно изменяться на разных компьютерах.

Практика

Ознакомившись с теоретической частью, можно начинать создавать свою первую игру. Самый первый шаг – создание обычной программы pygame, которая откроет окно и запустит цикл игры. Собственно, это и есть начало любого кода на питоне.

Для начала необходимо выбрать библиотеки и импортировать их, а также задать три основных значения дальнейшей игры.


Первая и вторая строка отвечает за библиотеки, а все остальные — за разрешение окна и количество обновления циклов за секунду.

Теперь откроем само окно игры. Первая строчка запускает игровую библиотеку. Третья выполняет развертывание окна по заданным изначально параметрам, у нас это 1024×720. Пятая создается для того, чтобы мы могли убедиться в правильности частоты кадров.


Третьим шагом идет создание цикла игры. И далее пошагово прописываются три основных события, которые будут происходить в сцене. За сам цикл отвечает команда while, которая контролируется переменной running. Значит, если мы хотим завершить игру, нужно изменить значение переменной с TRUE на FALSE. Теперь заполняем все три строки тем кодом, который нам необходим.

Отрисовка

У нас нет ничего, кроме окна с фоном, с ним и будем работать. Можно его залить цветом, но как? Сколько цветов может обрабатывать компьютер?

Чтобы вычислить это значение, необходимо возвести число 256 в третью степень. Получим значение 16 777 216. Многовато для запоминания.

Экран состоит из пикселей, и каждый может обработать три базовых цвета: зеленый, синий, и красный. Цвет определенного пикселя зависит от того, как горят базовые. Ниже представлена таблица RGB цветов.

Красный Зеленый Синий Цвет
0 0 0 Черный
255 0 0 Красный
0 255 0 Зеленый
0 0 255 Синий
0 255 Голубой
255 255 0 Желтый
255 0 255 Пурпурный
255 255 255 Белый

Каждый из цветов имеет значение от 0 до 256, где 0 — это выключенная функция, а 255 — включенная на максимум. Таким образом, регулируя три основных цвета, можно добиться нужного. Поэтому таблицу цветов назвали RGB, по аналогии с заглавными буквами трех основных цветов.

Теперь мы знаем, как отображаются цвета, и можем залить весь экран, например, желтым. Это сложный цвет, состоящий из двух.

YELLOW = (255, 255, 0)

После того как мы задали командой желтый, можем выполнить заливку экрана.

Двойная буферизация

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

К нашей команде screen.fill(YELLOW) добавляем строку pygame.display.flip, и все начинает работать.

Эта функция должна находиться в самом конце отрисовки, иначе содержимое, которое задано после флипа, просто не отобразится на экране пользователя.

События

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

Закрытие – функция, которая должна быть сообщена программе для того, чтобы была возможность считать её и завершить процесс. Если проще, чтобы значение TRUE было заменено на FALSE.

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

Использовать окно кода просто чтобы создать статичную картинку – недостаточно. Pygame хранит все события, которые происходили с момента отрисовки последнего кадра. Язык не будет пропускать команды, сколько бы их ни было. Программа в окне создает список действий, а цикл FOR пройдет по всем.

Одно из важнейших событий pygame.QUIT, оно запускается после нажатия крестика и меняет значение переменной Running с TRUE на FALSE, тем самым заканчивая игровой цикл.

Шаблон

В конечном итоге у нас должен появиться вот такой вот шаблон для написания проекта на pygame.


Последней, 30-й, строчкой обязательно пишем окончание программы, чтобы она нормально закрывалась.

Создание окружения

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

Кроме того, мы можем нарисовать несколько простейших объектов:

  • Line (создание линии);
  • Circle(создает окружность);
  • Rect (создает квадрат).

Есть много других методов и команд, но эти три являются самыми распространенными в использовании новичками.

В конце цикла всегда надо обновлять сцену, чтобы на ней отрисовывались кадры, за это отвечает команда pygame.display.update

Запуск игры в окне без этой программы приведет к слишком быстрому движению, и воспринимать ее будет невозможно.

Создание простейшей игры с числами

Давайте рассмотрим проект по созданию числовой игры на определение. Исходя из текста выше, попытайтесь проанализировать строки и понять, за что каждая отвечает.


1 и 3 строка отвечают за то, чтобы переменной NTG было задано число от 0 до 200, а также чтобы число пользователя изначально было -1.

5 строка — это цикл, который будет выполняться, пока переменная NTG не совпадет с переменной, введенной пользователем в окне программы.

Строки с 6 до 10 делают основную работу и дают игроку подсказки, в какую сторону отличается написанное число. Если оно совпадет с NTG, выведется строчка, поздравляющая с победой (11).

Последняя, 13, отвечает за конец игры и завершение цикла. Второй способ, чтобы не проставлять значения TRUE и FALSE.

Но исходя из знаний, полученных выше, мы можем доработать программу, сделав окно немного интереснее. Так как в этой игре нет персонажей и объектов, заменим фон строками

YELLOW = (255, 255, 0)

Зададим желтый фон экрана. Теперь компиляция программы в окне будет более интересной. Вот и создана первая простая игра без использования pygame.

Змейка

Создавать игру будем с помощью виджета Canvas. Это нужно для того, чтобы задать объекты изображениями. Также это поможет зарегистрировать столкновение и закончить игру.

Всего возьмем 5 переменных:

  1. DELAY – скорость игры.
  2. ALL_DOTS – количество сегментов змейки, которое может быть.
  3. RAND_POS – чтобы яблоко появлялось в случайной точке.
  4. HEIGHT и WIDTH – отвечают за размер игрового поля.
  5. DOT_SIZE – размер одного сегмента и яблока.

Зададим два массива:

В них сохраняются все соединения нашего существа.


Эти 11 строк отвечают за то, чтобы в нашей игре было три картинки, сегмент, голова змеи и яблоко. Их можно как отрисовать самостоятельно, так и скачать из интернета. Три небольших изображения, которые будут у нас показываться в окне игры.

Этими двумя строками мы создали объекты на игровом поле и задали, чтобы яблоко появлялось в случайной точке окна.


Этими командами мы создадим изображения на холсте. За это отвечает команда image. Если мы хотим, чтобы изображение появлялось около границ окна, нам нужно задать параметр anchor на NW (North и West). А с помощью параметра tag можем отслеживать и идентифицировать все изображения и объекты в окне. Одним тегом можно обозначить группу объектов в нашей игре.

С помощью команды checkApple мы смотрим, съела ли наша змея яблоко, и добавляем ей сегмент в случае положительного ответа. Команда find_withtag находит один из предметов в окне, используя определенный заданный тег. Нам требуется всего два объекта — яблоко и змеиная голова.

Если яблоко будет съедено, то есть столкнется с головой, мы создадим новый сегмент на месте столкновения. И запустим метод locateApple, он удалит яблоко из холста и создаст новое в рандомной точке.

Мы управляем головой змейки, а метод doMove поможет нам изменять ее положение. Остальные сегменты будут двигаться за головой одной непрерывной цепочкой.

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

Вывод

В итоге мы научились создавать простенькие игры без графики, сделали шаблон для создания программы на pygames и начали делать серьезную программу типа змейки. Все эти навыки помогут в дальнейшем создании игр и прояснят фундаментальные аспекты кодинга на Python. При любых неполадках или отказе компилятора в запуске кода необходимо проверить все строки кода на ошибки и попробовать заново написать программу в другом окне. Нужно быть максимально внимательным, и тогда все получится.

Создание игры Arkanoid на PyGame Zero

В данной статье мы расскажем, как при помощи Python и PyGame Zero можно быстро и легко написать клон игры Арканоид (Breakout).

Содержание статьи

Что ж, приступим!

Весь код, который будет использоваться в данном руководстве, доступен по ссылке.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Изображения были взяты с Kenney. На данном сайте есть множество клевых бесплатных ассетов для создания игры. Обязательно зацените его!

Установка Pygame Zero

Первым делом нужно создать пустое окно:

Здесь мы импортируем Pygame Zero. Переменная TITLE — это заголовок отображаемого окна, а переменные WIDTH и HEIGHT определяют ширину и высоту данного окна соответственно.

Метод pgzrun.go() запускает программу.

Вы должны увидеть пустое окно:

Игра Арканоид на Python

Давайте попробуем отобразить несколько игровых блоков.

Добавим следующий код под высотой и шириной:

Actor отвечает за то, как Pygame Zero будет показывать картинки. Изображения всегда хранятся в папке images , которая находится в том же месте, где расположен скрипт игры.

Мы также указываем начальные позиции x и y для тех изображений, которые будут загружены:

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

Итак, у нас есть изображения, загруженные в память, однако они пока не отображаются. Давайте это исправим. В Pgzero есть встроенная функция draw() , которая вызывается автоматически при запуске игры. Есть также функция update , которая вызывается 60 раз в секунду и обновляет экран по мере вашего движения.

По сути, у нашей игры будет 60 FPS.

Функции update() и draw() в Pgzero

Функции update и draw похожи — разница лишь в том, что update вызывается 60 раз в секунду, в то время как draw вызывается только в тех случаях, когда что-то нужно изменить, нарисовать…

Здесь нет никаких строгих правил, но я бы использовал функцию update для вещей, которые часто меняются. Например, для стенки с кирпичиками и мячика. В то время как для фоновых изображений можно использовать draw .

Создание двигающейся панели и мячика

Для начала воспользуемся функцией draw() , а update() пока оставим пустой:

Игра Арканоид на Python

Давайте сделаем еще кое-что. Вам не кажется, что сейчас фон очень скучный? Давайте сделаем его немного повеселее.

Обновим функцию draw() :

В качестве фона мы используем файл background.jpg , который находится в папке images . Функция blit() рисует наше изображение на экране. Кортеж (0,0) является стартовой позицией, где x=0 и y=0 . Систему координат в Pygame Zero мы обсудим немного позже.

Игра Арканоид на Python

Создание стенки с кирпичиками для игры Арканоид

Сейчас мы займемся созданием стенки с кирпичиками, которых будет сбивать мяч.

У нас в папке есть несколько подходящих изображений, именно их мы используем. Для начала попробуем вставить только один кирпичик:

Игра Арканоид на Python

Очевидно, что строить стенку по одному кирпичику за раз будет очень долго и муторно. Давайте используем цикл for, чтобы упростить задачу.

Здесь мы создаем начальные переменные для координат x и y — bar_x инициализируется на 120 , а bar_y — на 100 .

Мы выполняем цикл 8 раз. Почему 8? Потому что именно столько кирпичиков мы можем удобно разместить на экране.

Для каждого цикла мы создаем объект Actor , инициализируем его координаты x и y и рисуем все на экране. Затем делаем следующее:

Игра Арканоид на Python

Неплохо. Теперь нужно разложить все остальные кирпичи. Я планирую построить 3 ряда, причем цвет каждого будет отличаться.

Первым делом я хочу превратить приведенный выше код в удобную функцию:

Здесь я поместил использованный раннее код в функцию place_blue_bars() .

Я мог бы создать больше функций наподобие create_red_bars() и так далее, но, думаю, будет лучше использовать более умный подход.

Итак, у нас будет общая функция place_bars() :

В верхней части мы также создадим еще одну глобальную переменную bars_list = [] . Мы будем использовать ее для проверки того, какие кирпичики отображать, а какие удалять после попадания в них мячика.

Передадим начальные координаты x и y первого кирпичика, а также изображение, которое мы будем использовать. Конечная функция выглядит следующим образом:

Единственное изменение заключается в том, что мы инициализируем x , y и изображение из полученных входных данных.

coloured_box_list = [ "element_blue_rectangle_glossy.jpg" , "element_green_rectangle_glossy.jpg" , "element_red_rectangle_glossy.jpg" ]

У нас есть список с 3 изображениями. Мы инициализируем значения x и y . Затем делаем цикл for по списку:

Нам нужно сделать y += 50 в каждом цикле, иначе кирпичики будут располагаться друг над другом.

Нам нужно сделать еще кое-что. Создадим кирпичики, но отображать их не будем. Обновим функцию draw() :

Игра Арканоид на Python

Теперь у нас есть красивый макет. Наконец-то можно заняться логикой!

Добавление физики для двигающейся панели

Давайте начнем с добавления физики для нижней панели. Нам нужно, чтобы игрок мог двигать данный элемент туда-сюда, стараясь отбить мячик. В Pygame Zero это сделать очень просто — вы можете просто проверить события клавиатуры напрямую. Давайте обновим функцию update() :

if keyboard.left проверяет, нажата ли левая стрелка на клавиатуре, и если да, то изменяет x-позицию двигающейся панели на -5 (то есть перемещает ее влево на 5 пикселей). И то же самое происходит для правой стрелки на клавиатуре.

Почему я выбрал 5 пикселей? Чтобы найти баланс между слишком быстрым/медленным перемещением. Попробуйте изменить значения на 1 и 10 и посмотрите, что получится.

Нажмите на левую и правую стрелки — теперь вы можете перемещать нижнюю панель.

Добавление физики для движения мячика в игре

Помните, что встроенный метод update() вызывается 60 раз в секунду. Поэтому любая игровая логика, например, перемещение мяча, проверка столкновений (коллизии) и тому подобное, будет происходить здесь.

Мы создадим новую функцию update_ball() , которую будем вызывать из функции update() .

Таким образом мы меняем позиции x и y для мяча.

Система координат в Pygame Zero

Система координат в PyGame Zero

Координаты верхней левой части экрана — 0, 0 то есть x=0, y=0 .

Если вы двигаетесь вправо, то значение x возрастает.

Если вниз, то возрастает значение y .

При движении влево, уменьшается x . При движении вправо, увеличивает x .

Для передвижения вниз, увеличиваем y . Вверх — уменьшаем y .

Учитывая все это:

ball.x -= 1 двигает мяч влево (так как -1 = влево, +1 = вправо)

ball.y -= 1 двигает мяч вверх (так как -1 = вверх, +1 = вниз)

Итак, в начале игры мяч будет двигаться вверх и влево. Это просто случайное решение — вы можете с таким же успехом выбрать движение вниз и вправо. Но пока что я буду придерживаться этого решения, чтобы объяснить вам возникшую проблему:

Мяч за пределами экрана! Вот незадача!

Нам нужно добавить проверки, чтобы при ударе о стены мяч отскакивал назад. Это физическая часть.

Давайте добавим проверку.

Сначала добавим глобальную переменную для скорости x и y . Добавьте эти глобальные переменные в верхнюю часть файла:

Игрок перемещается по комнатам замка.
В каждой комнате находится три двери. Одна дверь ведет в комнату
с драконом, другая - в комнату с живой водой, третья - пустая комната.
Если игрок попадает в комнату с дракном - жизнь отнимается.
Если игрок попадает в комнату с живой водой - жизнь добавляется.
Если игрок попадает в пустую комнату - ничего не происходит.
Игра продолжается до тех пор, пока у игрока есть жизни.
Переход из одной команты в другую добавляет 100 баллов.
Игра начинается с 3 жизнями и 0 баллами.
Задача игры - набрать наибольшее количество баллов

PlotofoxHelper

from random import shuffle

doors = ['dragon', 'water', 'empty']
lives = 3
score = 0

while True:
\u00a0\u00a0\u00a0\u00a0choice = int(input('\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u043c\u0435\u0440 \u0434\u0432\u0435\u0440\u0438 (1, 2 \u0438\u043b\u0438 3): '))
\u00a0\u00a0\u00a0\u00a0shuffle(doors)
\u00a0\u00a0\u00a0\u00a0score += 100
\u00a0\u00a0\u00a0\u00a0if doors[choice - 1] == 'dragon':
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print('\u0412\u044b \u0441\u0440\u0430\u0436\u0430\u043b\u0438\u0441\u044c \u0441 \u0434\u0440\u0430\u043a\u043e\u043d\u043e\u043c \u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438 \u0436\u0438\u0437\u043d\u044c.')
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lives -= 1
\u00a0\u00a0\u00a0\u00a0elif doors[choice - 1] == 'water':
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print('\u0412\u044b \u0432\u044b\u043f\u0438\u043b\u0438 \u0436\u0438\u0432\u043e\u0439 \u0432\u043e\u0434\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0436\u0438\u0437\u043d\u044c.')
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lives += 1
\u00a0\u00a0\u00a0\u00a0else:
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print('\u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e.')
\u00a0\u00a0\u00a0\u00a0if lives == 0:
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print('\u0418\u0433\u0440\u0430 \u043e\u043a\u043e\u043d\u0447\u0435\u043d\u0430. \u0412\u0430\u0448 \u0441\u0447\u0435\u0442:', score)
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break">]" data-testid="answer_box_list">

BrightOne

from random import shuffle

doors = ['dragon', 'water', 'empty']
lives = 3
score = 0

while True:
choice = int(input('Введите номер двери (1, 2 или 3): '))
shuffle(doors)
score += 100
if doors[choice - 1] == 'dragon':
print('Вы сражались с драконом и потеряли жизнь.')
lives -= 1
elif doors[choice - 1] == 'water':
print('Вы выпили живой воды и получили жизнь.')
lives += 1
else:
print('Ничего не произошло.')
if lives == 0:
print('Игра окончена. Ваш счет:', score)
break

Читайте также: