Создаем консольную игру камень-ножницы-бумага
Нам нужно создать консольную игру в которой игрок будет выбирать свой ход из 3 вариантов (камень, ножницы, бумага) путем ввода в консоль одной из 3 цифр 1, 2 или 3. Вымышленный соперник, будет выбирать свой вариант случайно из таких же трех вариантов.
Игра идет до тех пор, пока у игрока есть жизни, если атака успешна, или соперник умер, должны быть начислены очки в
зависимости от выбранного уровня сложности. Если игрок умер, очки должны быть записаны в файл с результатами.
main.py- основной скрипт, отвечает за меню и за запуск игры- Папка
game- со всеми основными файлами игры Все остальные файлы должны быть в этой папке models.py- файл с описанием моделей которые есть в игре (игрок и соперник)settings.py- файл со всеми константами которые могут нам понадобитьсяexceptions.py- файл с необходимыми нам исключениямиgame.py- файл с основной логикой игрыscore.py- файл с логикой сохранения очков игры
Должен содержать два класса
PlayerEnemy
Аттрибуты:
name- Имя игрока, задается пользователем через консольlives- Количество жизней, берется из константы изsettings.pyscore- Очки игрока, изначально 0
Методы:
__init__- для инициализации игрока, принимает только имя, назначает имя, кол-во жизней и очков.select_attack- метод для ввода атаки игроком. Вводим до тех пор, пока пользователь не введет валидное значение (1, 2, 3), использует константы из файлаsettings.pydecrease_lives- метод, который будет вызываться если игрок проиграл "бой", уменьшает жизни на 1. Если жизни закончились, вызывает исключениеGameOverиз файлаexceptions.pyadd_score- метод для начисления очков игроку.
Аттрибуты:
lives- Кол-во жизней, изначально зависит от уровня соперника и уровня сложности, уменьшается на 1 когда соперник проигрывает "бой"level- уровень соперника, будет увеличиваться с каждым новым соперником. Изначально 1.
Методы:
__init__- для инициализации соперника, принимает только уровень и сложность, что бы вычислить кол-во жизней, назначает кол-во жизней и уровень.select_attack- метод для случайного выбора атаки (1, 2, 3), использует константы из файлаsettings.pydecrease_lives- уменьшает жизни при проигрыше "боя", вызывает исключениеEnemyDownиз файлаexceptions.pyесли у соперника закончились жизни
Содержит класс игры Game
Аттрибуты:
player- объект игрокаenemy- объект соперника, при убийстве будет создан новый, с более высоким уровнемmode- уровень сложности, normal или hard, содержит либо 1, либо 2, которые определены константами
Методы:
__init__- принимает объект игрока и уровень сложности, создает первого соперникаcreate_enemy- метод для создания нового соперникаplay- метод запуска игры. Запускает бесконечный цикл в одной итерации которого происходит "бой". Для этого вызывает два метода,fightиhandle_fight_result. Отслеживает не произошло ли одно из исключений при вызове второго методаGameOverилиEnemyDown, при первом завершает игру и вызывает метод для записи очков, при втором создает нового, более сильного соперника.fight- метод запрашивает у пользователя и соперника атаки, из констант получает результат боя (-1, 0, 1)handle_fight_result- принимает результат боя, и в зависимости от результата отнимает жизни либо у игрока, либо у соперника.save_score- вызывает сохранение очков при помощи вызова класса из файлаscore.py
Классы
GameOver- когда у игрока заканчиваются жизниEnemyDown- когда у соперника заканчиваются жизни
Содержит все константы
Примерное содержание:
MODE_NORMAL = 'Normal'
MODE_HARD = 'Hard'
MODES = {'1': MODE_NORMAL,
'2': MODE_HARD}
PLAYER_LIVES = 2
POINTS_FOR_FIGHT = 1
POINTS_FOR_KILLING = 5
MAX_RECORDS_NUMBER = 5
HARD_MODE_MULTIPLIER = 2
SCORE_FILE = 'scores.txt'
PAPER = 'Paper'
STONE = 'Stone'
SCISSORS = 'Scissors'
WIN = 1
DRAW = 0
LOSE = -1
ALLOWED_ATTACKS = {
'1': PAPER,
'2': STONE,
'3': SCISSORS
}
ATTACK_PAIRS_OUTCOME = {
(PAPER, PAPER): DRAW,
(PAPER, STONE): WIN,
(PAPER, SCISSORS): LOSE,
(STONE, PAPER): LOSE,
(STONE, STONE): DRAW,
(STONE, SCISSORS): WIN,
(SCISSORS, PAPER): WIN,
(SCISSORS, STONE): LOSE,
(SCISSORS, SCISSORS): DRAW
}Классы:
ScoreHandler- класс для обработки очковGameRecord- класс содержащий записи об игрокахPlayerRecord- класс для хранения записи об одном игроке
Аттрибуты:
game_record- объект класса GameRecord, туда мы будем считывать сохраненные очки и записывать таблицу с новымиfile_name- имя файла откуда и куда мы записываем очки
Методы:
__init__- принимает только имя файла и сохраняет его. Вызывает метод для чтения файла.read- метод, который будет читать файл и каждую его строку сохранять вPlayerRecord, которые будут сохранятся вGameRecord.save- метод, который нужен, что бы записать новые результаты в файл (предварительно отсортировать и обрезать, если нужно)display- метод для отображения очков
Аттрибуты:
records- список объектов типа PlayerRecord
Методы:
__init__- создает объект с пустым списком записейadd_record- метод для добавления записи об одном игроке. Должен проверять нет ли у нас уже такого игрока, и если есть, то перезаписывать его результат. Тот же самый игрок проверяется по имени и уровню сложности (игрок может быть представлен в таблице два раза на разном уровне сложности). (Можно использовать меджик метод__eq__для поиска черезin)prepare_records- метод для сортировки существующих результатов и обрезки до максимального кол-ва указанного в настройках
Аттрибуты:
name- имя игрокаmode- уровень сложностиscore- кол-во очков
Методы:
__init__- для создания объекта принимает все три параметра__gt__- для того что бы можно было отсортировать записи по очкам__str__- для удобного вывода данных
Содержит функции:
main- для запуска всего кода, внутри этой функции должен быть запущен процесс выбора из трех пунктов (Запуск игры, посмотреть очки и выйти из игры (1,2,3))play_game- вызывается если игрок выбрал начать игру, в этой функции будет запущен процесс создания игрока, создание объекта игры и запуск самой игрыcreate_player- спросить игрока имя и сложность, создать объект игрока с указанным именем, и передать объект игрока и сложность в класс игры.show_scores- показать очки, используя классScoreHandlerexit- выйти из игры
| Name | Mode | Score |
|---|---|---|
| Vlad | Normal | 14 |
| Test | Hard | 12 |
| Jack | Normal | 12 |
| Vlad | Hard | 10 |
| Jack | Hard | 9 |