Чарівники, Злодії та Рицарі
Гра «Чарівники, Злодії та Рицарі» (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
Запускає гру
Функція ініціалізує екземпляри гравця та ворога. Після цього він запускає ігровий процес у нескінченному циклі. Як тільки гравець переможений - це зупиняє виконання.
Додаткові Вдосконалення
Додайте процесор оцінок, щоб показати 10 найкращих результатів із таблиці записів.
Створити меню гри, наприклад:
AVAILABLE MENU CHOICES: PLAY, SCORES, EXIT TYPE YOUR CHOICE HERE:
Зберігайте таблицю балів у базі даних замість використання текстового файлу.