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

Commit a882d09

Browse files
authored
Merge updates from the upstream repo into devel branch (#188)
2 parents 5d63737 + c09a808 commit a882d09

File tree

4 files changed

+323
-22
lines changed

4 files changed

+323
-22
lines changed

OOP_task.md

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
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,
46+
3), использует константы из файла `settings.py`
47+
- `decrease_lives` - метод, который будет вызываться если игрок проиграл "бой", уменьшает жизни на 1. Если жизни
48+
закончились, вызывает исключение `GameOver` из файла `exceptions.py`
49+
- `add_score` - метод для начисления очков игроку.
50+
51+
#### Enemy
52+
53+
Аттрибуты:
54+
55+
- `lives` - Кол-во жизней, изначально зависит от уровня соперника и уровня сложности, уменьшается на 1 когда соперник
56+
проигрывает "бой"
57+
- `level` - уровень соперника, будет увеличиваться с каждым новым соперником. Изначально 1.
58+
59+
Методы:
60+
61+
- `__init__` - для инициализации соперника, принимает только уровень и сложность, что бы вычислить кол-во жизней,
62+
назначает кол-во жизней и уровень.
63+
- `select_attack` - метод для случайного выбора атаки (1, 2, 3), использует константы из файла `settings.py`
64+
- `decrease_lives` - уменьшает жизни при проигрыше "боя", вызывает исключение `EnemyDown` из файла `exceptions.py` если у
65+
соперника закончились жизни
66+
67+
### game.py
68+
69+
Содержит класс игры `Game`
70+
71+
### Game
72+
73+
Аттрибуты:
74+
75+
- `player` - объект игрока
76+
- `enemy` - объект соперника, при убийстве будет создан новый, с более высоким уровнем
77+
- `mode` - уровень сложности, normal или hard, содержит либо 1, либо 2, которые определены константами
78+
79+
Методы:
80+
81+
- `__init__` - принимает объект игрока и уровень сложности, создает первого соперника
82+
- `create_enemy` - метод для создания нового соперника
83+
- `play` - метод запуска игры. Запускает бесконечный цикл в одной итерации которого происходит "бой". Для этого вызывает
84+
два метода, `fight` и `handle_fight_result`. Отслеживает не произошло ли одно из исключений при вызове второго
85+
метода `GameOver` или `EnemyDown`, при первом завершает игру и вызывает метод для записи очков, при втором создает
86+
нового, более сильного соперника.
87+
- `fight` - метод запрашивает у пользователя и соперника атаки, из констант получает результат боя (-1, 0, 1)
88+
- `handle_fight_result` - принимает результат боя, и в зависимости от результата отнимает жизни либо у игрока, либо у
89+
соперника.
90+
- `save_score` - вызывает сохранение очков при помощи вызова класса из файла `score.py`
91+
92+
### exceptions.py
93+
94+
Классы
95+
96+
- `GameOver` - когда у игрока заканчиваются жизни
97+
- `EnemyDown` - когда у соперника заканчиваются жизни
98+
99+
### settings.py
100+
101+
Содержит все константы
102+
103+
Примерное содержание:
104+
105+
```python
106+
MODE_NORMAL = 'Normal'
107+
MODE_HARD = 'Hard'
108+
MODES = {'1': MODE_NORMAL,
109+
'2': MODE_HARD}
110+
111+
PLAYER_LIVES = 2
112+
POINTS_FOR_FIGHT = 1
113+
POINTS_FOR_KILLING = 5
114+
MAX_RECORDS_NUMBER = 5
115+
HARD_MODE_MULTIPLIER = 2
116+
117+
SCORE_FILE = 'scores.txt'
118+
119+
PAPER = 'Paper'
120+
STONE = 'Stone'
121+
SCISSORS = 'Scissors'
122+
123+
WIN = 1
124+
DRAW = 0
125+
LOSE = -1
126+
127+
ALLOWED_ATTACKS = {
128+
'1': PAPER,
129+
'2': STONE,
130+
'3': SCISSORS
131+
}
132+
133+
ATTACK_PAIRS_OUTCOME = {
134+
(PAPER, PAPER): DRAW,
135+
(PAPER, STONE): WIN,
136+
(PAPER, SCISSORS): LOSE,
137+
(STONE, PAPER): LOSE,
138+
(STONE, STONE): DRAW,
139+
(STONE, SCISSORS): WIN,
140+
(SCISSORS, PAPER): WIN,
141+
(SCISSORS, STONE): LOSE,
142+
(SCISSORS, SCISSORS): DRAW
143+
}
144+
```
145+
146+
### score.py
147+
148+
Классы:
149+
150+
- `ScoreHandler` - класс для обработки очков
151+
- `GameRecord` - класс содержащий записи об игроках
152+
- `PlayerRecord` - класс для хранения записи об одном игроке
153+
154+
#### ScoreHandler
155+
156+
Аттрибуты:
157+
158+
- `game_record` - объект класса GameRecord, туда мы будем считывать сохраненные очки и записывать таблицу с новыми
159+
- `file_name` - имя файла откуда и куда мы записываем очки
160+
161+
Методы:
162+
163+
- `__init__` - принимает только имя файла и сохраняет его. Вызывает метод для чтения файла.
164+
- `read` - метод, который будет читать файл и каждую его строку сохранять в `PlayerRecord`, которые будут сохранятся в
165+
`GameRecord`.
166+
- `save` - метод, который нужен, что бы записать новые результаты в файл (предварительно отсортировать и обрезать, если
167+
нужно)
168+
- `display` - метод для отображения очков
169+
170+
#### GameRecord
171+
172+
Аттрибуты:
173+
174+
- `records` - список объектов типа PlayerRecord
175+
176+
Методы:
177+
178+
- `__init__` - создает объект с пустым списком записей
179+
- `add_record` - метод для добавления записи об одном игроке. Должен проверять нет ли у нас уже такого игрока, и если
180+
есть, то перезаписывать его результат. Тот же самый игрок проверяется по имени и уровню сложности (игрок может быть
181+
представлен в таблице два раза на разном уровне сложности). (Можно использовать меджик метод `__eq__` для поиска
182+
через `in`)
183+
- `prepare_records` - метод для сортировки существующих результатов и обрезки до максимального кол-ва указанного в
184+
настройках
185+
186+
#### PlayerRecord
187+
188+
Аттрибуты:
189+
190+
- `name` - имя игрока
191+
- `mode` - уровень сложности
192+
- `score` - кол-во очков
193+
194+
Методы:
195+
196+
- `__init__` - для создания объекта принимает все три параметра
197+
- `__gt__` - для того что бы можно было отсортировать записи по очкам
198+
- `__str__` - для удобного вывода данных
199+
200+
### main.py
201+
202+
Содержит функции:
203+
204+
- `main` - для запуска всего кода, внутри этой функции должен быть запущен процесс выбора из трех пунктов (Запуск игры,
205+
посмотреть очки и выйти из игры (1,2,3))
206+
- `play_game` - вызывается если игрок выбрал начать игру, в этой функции будет запущен процесс создания игрока, создание
207+
объекта игры и запуск самой игры
208+
- `create_player` - спросить игрока имя и сложность, создать объект игрока с указанным именем, и передать объект игрока и
209+
сложность в класс игры.
210+
- `show_scores` - показать очки, используя класс `ScoreHandler`
211+
- `exit` - выйти из игры
212+
213+
## Пример как выглядит содержимое файла с очками
214+
215+
| Name | Mode | Score |
216+
|------|--------|-------|
217+
| Vlad | Normal | 14 |
218+
| Test | Hard | 12 |
219+
| Jack | Normal | 12 |
220+
| Vlad | Hard | 10 |
221+
| Jack | Hard | 9 |

PR_explanation.md renamed to PR_explanation_Django.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Как сдавать домашки
1+
# Как сдавать домашки по Django
22

33
При помощи пулл-реквеста на GitHub.
44

PR_explanation_OOP.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# Как сдавать домашки
2+
3+
При помощи пулл-реквеста на GitHub.
4+
5+
## Что должно быть в репозитории??
6+
7+
- Код проекта
8+
9+
## Чего не должно быть в репозитории??
10+
11+
Если коротко, то ничего лишнего.
12+
13+
- Папок `__pycache__` и любого его содержимого.
14+
- Файлов настроек `IDE` например папки `.idea` или аналогов для других `IDE`
15+
- Для маков, файлов `.DS_Store`
16+
17+
Все эти файлы и папки должны быть занесены в `.gitignore`
18+
19+
## Как создать проект и репозиторий корректно (Делается один раз когда нам необходимо создать новый проект)
20+
21+
Действия по пунктам:
22+
23+
1. Создать репозиторий (`git init`)
24+
2. Подключить репозиторий к проекту (`git remote ...`)
25+
3. Создать и заполнить `.gitignore`
26+
4. Убедиться, что мы работаем в ветке `master` или `main`
27+
5. Закоммитить всё что у вас есть в свежем проекте. (Только файл `.gitignore`)
28+
29+
Для коммита делаем две команды
30+
31+
`git add .`
32+
33+
`git commit -m "Some text"`
34+
6. Запушить пустой проект (только .gitignore) в мастер или мейн. (`git push`)
35+
7. Добавить меня в колабораторы проекта. Ник на гитхабе (`PonomaryovVladyslav`)
36+
37+
## Как делать домашку
38+
39+
1. Создать **из мастера** ветку, в названии которой будет информация о том, что это домашка и её номер. Например `hw_3`
40+
2. Выполнить домашнюю работу :) Рекомендуется коммитить изменения после любого осмысленного блока. По одной задаче или
41+
даже куску задачи.
42+
3. Выполнить **пуш** этой ветки на удалённый репозиторий. (`git push`)
43+
4. Создать **пулл-реквест** из ветки с вашей **домашней работы** на **мастер** (онлайн на сайте github)
44+
5. Добавить меня в раздел `Reviewers`
45+
6. Дождаться моего апрува или комментариев, что нужно изменить
46+
47+
6.1. Если получили коментарии о необходимости изменений, изменения добавляем (`git add` + `git commit`) на ветку
48+
**домашней работы** после чего выполняем **пуш** (`git push`), пулл реквест сам обновится,
49+
и я получу уведомление об этом автоматически.
50+
7. После того как получили апрув, мержим изменения в мастер. (онлайн на сайте)
51+
52+
## Что делать если я уже внёс файлы \__pycache__ или .idea на гит?
53+
54+
В этом случае вам надо удалить файлы из гита, но сохранить их на локальной версии.
55+
56+
Для этого необходимо выполнить команду:
57+
58+
```
59+
git rm <file Relative path> --cached
60+
```
61+
62+
Для каждого файла или папки.
63+
64+
После чего выполнить коммит (`git commit`) и пуш (`git push`) снова.

0 commit comments

Comments
 (0)