Opened 4 years ago
Closed 4 years ago
#718 closed ожидается проверка (задача сдана)
HW #2
Reported by: | luchinin.aleksey | Owned by: | Дмитрий Свиридкин |
---|---|---|---|
Component: | HW #2 (X0) | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (6)
comment:1 Changed 4 years ago by
Owner: | changed from Дмитрий Свиридкин to luchinin.aleksey |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 Changed 4 years ago by
Owner: | changed from luchinin.aleksey to Дмитрий Свиридкин |
---|---|
Version: | 1.0 → 2.0 |
Исправил недочёты + сделал доп задание
comment:3 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
comment:4 Changed 4 years ago by
Owner: | changed from Дмитрий Свиридкин to luchinin.aleksey |
---|---|
Type: | ожидается проверка → ожидаются исправления |
0-0 воспринимается валидным ходом
в ncurses-версии стоит выводить, чей сейчас ход.
bool check_horizontal(int x, int y) const; bool check_vertical(int x, int y) const; bool check_left_diagonal(int x, int y) const; bool check_right_diagonal(int x, int y) const;
Все эти функции заменяются одной: bool check_direction(int x, int y, int dx, int dy)
И скорее всего они должны быть приватными. А в тестах стоит уже проверять результат того или иного хода.
// BoardView.h std::map<Player, char> symbols{{Player::X, 'X'}, {Player::O, 'O'}, {Player::Empty, '.'}};
- это поле стоит делать константным. А еще лучше в дополнение к этому статическим.
- Оно все-таки специфично для конкретного View, а не для абстрактного. В NCursesView, например, можно рисовать символы размером 5 на 5. И логика не должна поменяться.
Контроллер должен быть один.
Параметр silent -- относится к view.
Для работы с NCursesView не должна требоваться альтернативная реализация.
Все это достигается разработкой подходящего интерфейса для view.
В конкретном случае достаточно всего двух методов:
Display(board) Input(player, &coordinate) -> is_terminated?
18 + 6 + 7
comment:5 Changed 4 years ago by
Owner: | changed from luchinin.aleksey to Дмитрий Свиридкин |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 2.0 → 3.0 |
Исправил недочёты
comment:6 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Логику неперерисовки поля пока вводятся невалидные координаты все-таки стоит перенести во View.
Обычно булевы переменные не называют flag_XXX.
flag_make_turn
-> turn_accepted
20 + 9.5 + 10
Пустую строку перед выводом поля забыли
std::pair<int, int> BoardView::handle_coordinates()
Использовать std::pair в публичных интерфейсах не стоит. Очень часто не понятно, что имеется в виду. Лучше сделать собственную структуру на два поля и дать ей (и полям) подходящее ясное название.
Чтобы пользование вашим кодом не превращалось в "эффективный STL" с его восхитительными конструкциями
return map.insert({x, y}).first->second
У вас два числа, разделенных переводом строки, считаются валидным форматом.
Используйте getline и istringstream
bool flag = false;
Лучше именовать такие переменные соглавно их назначанию. Например
need_display_field
.Огромную функцию, проверяющую текущее состояние можно разбить на несколько.
Еще ее можно переписать, объединив логику проверки каждого направления в функцию, принимающую начальную точку и направление сдвига.
Возможно, стоит сделать только одно поле current_player, чтобы отслеживать состояние только одной переменной вместо двух (а у вас трех)
15 + 5 + 0