Skip to content
This repository was archived by the owner on Jul 2, 2024. It is now read-only.

Commit ea92fed

Browse files
author
Vlad Ponomarov
committed
Add OOP module task
1 parent 7425a00 commit ea92fed

File tree

1 file changed

+194
-0
lines changed

1 file changed

+194
-0
lines changed

OOP_task.md

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
# Модульное задание по OOP
2+
3+
Создаем консольную игру камень-ножницы-бумага
4+
5+
## Общее описание
6+
7+
Нам нужно создать консольную игру в которой игрок будет выбирать свой ход из 3 вариантов (камень, ножницы, бумага) путем
8+
ввода в консоль одной из 3 цифр 1, 2 или 3.
9+
Вымышленный соперник, будет выбирать свой вариант случайно из таких же трех вариантов.
10+
11+
Игра идет до тех пор, пока у игрока есть `жизни`, если атака успешна, или соперник умер, должны быть начислены очки в
12+
зависимости от выбранного уровня сложности. Если игрок умер, очки должны быть записаны в файл с результатами.
13+
14+
## Необходимые файлы и папки
15+
16+
- `main.py` - основной скрипт, отвечает за меню и за запуск игры
17+
- Папка `game` - со всеми основными файлами игры
18+
Все остальные файлы должны быть в этой папке
19+
- `models.py` - файл с описанием моделей которые есть в игре (игрок и соперник)
20+
- `settings.py` - файл со всеми константами которые могут нам понадобиться
21+
- `exceptions.py` - файл с необходимыми нам исключениями
22+
- `game.py` - файл с основной логикой игры
23+
- `score.py` - файл с логикой сохранения очков игры
24+
25+
## Разберем каждый файл
26+
27+
### models.py
28+
29+
Должен содержать два класса
30+
31+
- Player
32+
- Enemy
33+
34+
#### Player
35+
36+
Аттрибуты:
37+
38+
- name - Имя игрока, задается пользователем через консоль
39+
- lives - Количество жизней, берется из константы из `settings.py`
40+
- score - Очки игрока, изначально 0
41+
42+
Методы:
43+
44+
- __init__ - для инициализации игрока, принимает только имя, назначает имя, кол-во жизней и очков.
45+
- select_attack - метод для ввода атаки игроком. Вводим до тех пор, пока пользователь не введет валидное значение (1, 2, 3), использует константы из файла `settings.py`
46+
- decrease_lives - метод, который будет вызываться если игрок проиграл "бой", уменьшает жизни на 1. Если жизни закончились, вызывает исключение `GameOver` из файла `exceptions.py`
47+
- add_score - метод для начисления очков игроку.
48+
49+
#### Enemy
50+
51+
Аттрибуты:
52+
53+
- lives - Кол-во жизней, изначально зависит от уровня соперника и уровня сложности, уменьшается на 1 когда соперник проигрывает "бой"
54+
- level - уровень соперника, будет увеличиваться с каждым новым соперником. Изначально 1.
55+
56+
Методы:
57+
58+
- __init__ - для инициализации соперника, принимает только уровень и сложность, что бы вычислить кол-во жизней, назначает кол-во жизней и уровень.
59+
- select_attack - метод для случайного выбора атаки (1, 2, 3), использует константы из файла `settings.py`
60+
- decrease_lives - уменьшает жизни при проигрыше "боя", вызывает исключение `EnemyDown` из файла `exceptions.py` если у соперника закончились жизни
61+
62+
### game.py
63+
64+
Содержит класс игры `Game`
65+
66+
### Game
67+
68+
Аттрибуты:
69+
70+
- player - объект игрока
71+
- enemy - объект соперника, при убийстве будет создан новый, с более высоким уровнем
72+
- mode - уровень сложности, normal или hard, содержит либо 1, либо 2, которые определены константами
73+
74+
Методы:
75+
76+
- __init__ - принимает объект игрока и уровень сложности, создает первого соперника
77+
- create_enemy - метод для создания нового соперника
78+
- play - метод запуска игры. Запускает бесконечный цикл в одной итерации которого происходит "бой". Для этого вызывает два метода, `fight` и `handle_fight_result`. Отслеживает не произошло ли одно из исключений при вызове второго метода `GameOver` или `EnemyDown`, при первом завершает игру и вызывает метод для записи очков, при втором создает нового, более сильного соперника.
79+
- fight - метод запрашивает у пользователя и соперника атаки, из констант получает результат боя (-1, 0, 1)
80+
- handle_fight_result - принимает результат боя, и в зависимости от результата отнимает жизни либо у игрока, либо у соперника.
81+
- save_score - вызывает сохранение очков при помощи вызова класса из файла `score.py`
82+
83+
### exceptions.py
84+
85+
Классы
86+
87+
GameOver - когда у игрока заканчиваются жизни
88+
EnemyDown - когда у соперника заканчиваются жизни
89+
90+
### settings.py
91+
92+
Содержит все константы
93+
94+
Примерное содержание:
95+
96+
```python
97+
MODE_NORMAL = 'Normal'
98+
MODE_HARD = 'Hard'
99+
MODES = {'1': MODE_NORMAL,
100+
'2': MODE_HARD}
101+
102+
PLAYER_LIVES = 2
103+
POINTS_FOR_FIGHT = 1
104+
POINTS_FOR_KILLING = 5
105+
MAX_RECORDS_NUMBER = 5
106+
HARD_MODE_MULTIPLIER = 2
107+
108+
SCORE_FILE = 'scores.txt'
109+
110+
PAPER = 'Paper'
111+
STONE = 'Stone'
112+
SCISSORS = 'Scissors'
113+
114+
WIN = 1
115+
DRAW = 0
116+
LOSE = -1
117+
118+
ALLOWED_ATTACKS = {
119+
'1': PAPER,
120+
'2': STONE,
121+
'3': SCISSORS
122+
}
123+
124+
ATTACK_PAIRS_OUTCOME = {
125+
(PAPER, PAPER): DRAW,
126+
(PAPER, STONE): WIN,
127+
(PAPER, SCISSORS): LOSE,
128+
(STONE, PAPER): LOSE,
129+
(STONE, STONE): DRAW,
130+
(STONE, SCISSORS): WIN,
131+
(SCISSORS, PAPER): WIN,
132+
(SCISSORS, STONE): LOSE,
133+
(SCISSORS, SCISSORS): DRAW
134+
}
135+
```
136+
137+
### score.py
138+
139+
Классы:
140+
141+
- ScoreHandler - класс для обработки очков
142+
- GameRecord - класс содержащий записи об игроках
143+
- PlayerRecord - класс для хранения записи об одном игроке
144+
145+
#### ScoreHandler
146+
147+
Аттрибуты:
148+
149+
- game_record - объект класса GameRecord, туда мы будем считывать сохраненные очки и записывать таблицу с новыми
150+
- file_name - имя файла откуда и куда мы записываем очки
151+
152+
Методы:
153+
154+
- __init__ - принимает только имя файла и сохраняет его. Вызывает метод для чтения файла.
155+
- read - метод, который будет читать файл и каждую его строку сохранять в PlayerRecord, которые будут сохранятся в GameRecord.
156+
- save - метод, который нужен, что бы записать новые результаты в файл (предварительно отсортировать и обрезать, если нужно)
157+
- display - метод для отображения очков
158+
159+
#### GameRecord
160+
161+
Аттрибуты:
162+
163+
- records - список объектов типа PlayerRecord
164+
165+
Методы:
166+
167+
- __init__ - создает объект с пустым списком записей
168+
- add_record - метод для добавления записи об одном игроке. Должен проверять нет ли у нас уже такого игрока, и если есть, то перезаписывать его результат. Тот же самый игрок проверяется по имени и уровню сложности (игрок может быть представлен в таблице два раза на разном уровне сложности). (Можно использовать меджик метод __eq__ для поиска через `in`)
169+
- prepare_records - метод для сортировки существующих результатов и обрезки до максимального кол-ва указанного в настройках
170+
171+
172+
#### PlayerRecord
173+
174+
Аттрибуты:
175+
176+
- name - имя игрока
177+
- mode - уровень сложности
178+
- score - кол-во очков
179+
180+
Методы:
181+
182+
- __init__ - для создания объекта принимает все три параметра
183+
- __gt__ - для того что бы можно было отсортировать записи по очкам
184+
- __str__ - для удобного вывода данных
185+
186+
### main.py
187+
188+
Содержит функции:
189+
190+
- main - для запуска всего кода, внутри этой функции должен быть запущен процесс выбора из трех пунктов (Запуск игры, посмотреть очки и выйти из игры (1,2,3))
191+
- play_game - вызывается если игрок выбрал начать игру, в этой функции будет запущен процесс создания игрока, создание объекта игры и запуск самой игры
192+
- create_player - спросить игрока имя и сложность, создать объект игрока с указанным именем, и передать объект игрока и сложность в класс игры.
193+
- show_scores - показать очки, используя класс `ScoreHandler`
194+
- exit - выйти из игры

0 commit comments

Comments
 (0)