Чарівники, Злодії та Рицарі

Гра «Чарівники, Злодії та Рицарі» (WTK) — це клон «Камень, ножиці, бумага», але у фентезійному сеттингу. Вона має простий інтерфейс командного рядка, де користувач повинен ввести свій вибір. Ворогом керує скрипт. Мета гравця - набрати якомога більше очок.

Організація коду

Використовуйте окремі модулі для підтримки вашої кодової бази. Наприклад:

/
|-- engine.py
|-- exceptions.py
|-- models.py
|-- settings.py

Загальний опис ігрового процесу

Процес гри поділено на раунди. Кожен раунд складається з етапів атаки та захисту. Раунди повторюються, поки гравець не буде переможений.

Правила боротьби

Це просто…

  • Чарівник перемагає Рицаря

  • Злодій перемагає Чарівника

  • Рицар перемагає Злодія

Стадія атаки

Гравець обирає для атаки чарівника, злодія або лицаря, ворог обирає захист з тих самих варіантів випадковим чином. Якщо атака успішна:

  • здоров’я ворога зменшено

  • гравець отримує очки

Якщо ворог переможений:

  • новий екземпляр ворога ініціалізовано з використанням вищого рівня

  • гравець отримує додаткові очки

  • наступний етап захисту пропущено, і гравець атакує знову

Стадія захисту

Гравець вибір для захисту чарівника, злодія або рицаря, ворог обирає для атаки з тих же варіантів випадковим чином. Якщо атака успішна:

  • здоров’я гравця знижено

Якщо гравець переможений:

  • повідомляти повідомлення про набрані бали на термінал

  • запишіть ім’я гравця та наберіть очки до файлу «scores.txt»

Винятки

Ворога переможено

Це винятковий сценарій, коли ворог зазнає поразки. Щоб відстежувати ці випадки, слід використовувати налаштований виняток EnemyDown. Виняток повинен надавати деталі про екземпляр ворога, особливо його рівень.

class wtk.exceptions.EnemyDown(model: _AbstractModel)

Виникає, коли ворог переможений

Гра завершена

Це винятковий сценарій, коли гравець зазнає поразки. Щоб відстежувати ці випадки, слід використовувати спеціальний виняток GameOver. Виняток повинен надавати деталі про екземпляр гравця, особливо його результати бали.

class wtk.exceptions.GameOver(model: _AbstractModel)

Виникає, коли гравця переможено

Моделі

Ворог

class wtk.models.Enemy(level: int = 1)

Модель супротивника

Змінні:
  • level – значення рівня противника

  • health – очки здоров’я ворога

Представляє граючого ворога-бота.

__init__(level: int = 1) None

Ініціалізувати екземпляр

Параметри:

level (int) – індикатор рівня противника

Значення здоров’я дорівнює значенню рівня.

decrease_health() None

Зменшує очоки здоров’я

Raise:

EnemyDown

Цей метод зменшує значення індикатора працездатності. Коли значення менше 1 (одного), виникає виняток EnemyDown.

select_attack() FightChoice

Повертає випадковий варіант для бою

Повертає:

варіант для бою

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

select_defence() FightChoice

Повертає випадковий варіант для бою

Повертає:

варіант для бою

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

Ви можете використовувати інші методи, які вам подобаються, якщо потрібно.

Гравець

class wtk.models.Player(name: str)

Модель гравця

Змінні:
  • name – ім’я гравця

  • health – очки здоров’я гравця

  • score – очки, зароблені гравцем

Ця модель керується гравцем.

__init__(name: str) None

Ініціалізувати екземпляр

Параметри:

name (str) – ім’я гравця

Цей метод виконує ініціалізацію примірника програвача. Він встановлює назву екземпляра, значення початкових балів і здоров’я.

attack(enemy: Enemy) None

Атакує ворога

Виконати атаку на екземпляр противника. Цей метод приймає екземпляр противника як аргумент. Після цього він приймає вибір атаки з моделі гравця та вибір захисту з моделі противника. Після результату битви потрібно виконати обчислення, необхідні операції (зменшити здоров’я ворога, призначити очки тощо). На основі результату бою має видрукувати» «повідомлення:

  • «YOUR ATTACK IS SUCCESSFUL!»

  • «YOUR ATTACK IS FAILED!»

  • «IT’S A DRAW!»

decrease_health() None

Зменшує очоки здоров’я

Raise:

GameOver

Цей метод зменшує значення індикатора працездатності. Коли значення менше 1 (одного), виникає виняток GameOver.

defence(enemy: Enemy) None

Захист від атаки супротивника

Виконайте захист від атаки ворога. Цей метод приймає екземпляр ворога як аргумент. Після цього він приймає вибір захисту від моделі гравця та вибір атаки від моделі ворога. Після результату бою необхідно виконати операцію обчислення (зменшити здоров’я гравця). За результатами бою повинно вийти повідомлення:

  • «YOUR DEFENCE IS SUCCESSFUL!»

  • «YOUR DEFENCE IS FAILED!»

  • «IT’S A DRAW!»

static fight(attack: FightChoice, defence: FightChoice) FightResult

Інтерфейс для вирахування результатів двобою

Метод розраховує результат бою за правилами гри:

  • чарівник перемагає рицаря

  • злодій перемагає чарівника

  • рицар перемагає злодія

select_attack() FightChoice

Повертає варіант для поєдинку з вводу користувача

Повертає:

варіант для бою

Гравця просять прийняти рішення щодо майбутнього бою. Вибране значення перевіряється, і якщо воно недійсне, запитання повторюється.

select_defence() FightChoice

Повертає варіант для поєдинку з вводу користувача

Повертає:

варіант для бою

Гравця просять прийняти рішення щодо майбутнього бою. Вибране значення перевіряється, і якщо воно недійсне, запитання повторюється.

Налаштування

Модуль налаштувань містить значення констант для гри.

Наприклад,

wtk.settings.INITIAL_PLAYER_HEALTH: int

Початкове значення здоров’я гравця

wtk.settings.INITIAL_ENEMY_LEVEL: int

Початкове значення рівня ворога

wtk.settings.SCORE_SUCCESS_ATTACK: int

Вартість очок, які призначаються, коли атака гравця успішна

wtk.settings.SCORE_ENEMY_DOWN: int

Вартість очок, які призначаються, коли ворог переможений

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

wtk.settings.MSG_SUCCESS_ATTACK: str = 'YOUR ATTACK IS SUCCESSFUL!'

Повідомлення про успішну атаку

wtk.settings.MSG_SUCCESS_DEFENCE: str = 'YOUR DEFENCE IS SUCCESSFUL!'

Повідомлення про успішний захист

wtk.settings.MSG_FAILURE_ATTACK: str = 'YOUR ATTACK IS FAILED!'

Повідомлення про невдалу атаку

wtk.settings.MSG_FAILURE_DEFENCE: str = 'YOUR DEFENCE HAS BEEN BREACHED!'

Повідомлення про невдалий захист

wtk.settings.MSG_DRAW: str = "IT'S A DRAW!"

Повідомлення про нічию

Ігровий рушій

Модуль двигуна має забезпечувати дві функції:

  • get_player_name

  • play

Отримання імені гравця

Просить користувача ввести своє ім’я та повернути його назад. Пробіли на початку та в кінці мають бути вирізані. Ім’я має містити принаймні один символ.

wtk.engine.get_player_name() str

Повертає ім’я гравця з вводу користувача

Повертає:

ім’я визначене гравцем

Також виконується процес перевірки. Ім’я гравця не може бути порожнім рядком.

Гра

Ця функція ініціалізує екземпляр гравця та ворога. Вона обробляє ігрові раунди в нескінченному циклі поетапно. Якщо ворога переможено - нового слід ініціалізувати з рівнем, збільшеним на 1 (один). Про цей випадок слід повідомити на термінал. Якщо гравець зазнає поразки - повідомлення «Game Over» має бути повідомлено на термінал. KeyboardInterrupt також слід обробити - це поведінка подібно до події «Game Over», але повідомлення «Game Over» має бути пропущено.

wtk.engine.play() None

Запускає гру

Функція ініціалізує екземпляри гравця та ворога. Після цього він запускає ігровий процес у нескінченному циклі. Як тільки гравець переможений - це зупиняє виконання.

Додаткові Вдосконалення

  1. Додайте процесор оцінок, щоб показати 10 найкращих результатів із таблиці записів.

  2. Створити меню гри, наприклад:

    AVAILABLE MENU CHOICES: PLAY, SCORES, EXIT
    TYPE YOUR CHOICE HERE:
    
  3. Зберігайте таблицю балів у базі даних замість використання текстового файлу.