Opened 4 years ago
Closed 4 years ago
#702 closed ожидается проверка (задача сдана)
HW #2
Reported by: | Tarabonda German | Owned by: | Дмитрий Свиридкин |
---|---|---|---|
Component: | HW #2 (X0) | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (5)
comment:1 Changed 4 years ago by
Owner: | changed from Дмитрий Свиридкин to Tarabonda German |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 Changed 4 years ago by
Owner: | changed from Tarabonda German to Дмитрий Свиридкин |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 1.0 → 2.0 |
comment:3 Changed 4 years ago by
Owner: | changed from Дмитрий Свиридкин to Tarabonda German |
---|---|
Type: | ожидается проверка → ожидаются исправления |
g++ -O2 -Wall -Wextra -Werror -std=c++11 src/Board.cpp -c -Iinclude -o obj/Board.o g++ -O2 -Wall -Wextra -Werror -std=c++11 src/StdioBoardView.cpp -c -Iinclude -o obj/StdioBoardView.o src/StdioBoardView.cpp: In member function ‘virtual void StdioBoardView::read_move(int&, int&, Field)’: src/StdioBoardView.cpp:46:2: error: this ‘if’ clause does not guard... [-Werror=misleading-indentation] 46 | if (fld.fld[0][0] == FieldState::EMPTY || fld.fld[0][0] == FieldState::FIELD_X || fld.fld[0][0] == FieldState::FIELD_O) | ^~ src/StdioBoardView.cpp:47:11: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’ 47 | x = -2; y = -2;
==24125== Conditional jump or move depends on uninitialised value(s) ==24125== at 0x10AA79: StdioBoardView::read_move(int&, int&, Field) (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_02/check/hw_02/hw_02) ==24125== by 0x10B2FC: Controller::game_loopa_poopa() (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_02/check/hw_02/hw_02) ==24125== by 0x10A458: main (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_02/check/hw_02/hw_02)
void check_line(bool diag, int horiz1, int horiz2, int vert1, int vert2, int rev);
Как-то слишком сложно. И что означают те или иные параметры?
Почему бы не сделать так:
State check_line(start_x, start_y, offset_x, offset_y)
?
Зачем x,y -- поля GameController??
Почему бы им не быть просто локальными переменными внутри цикла игры?
Константы для размеров стоит сделать именованными.
bad_turn ? view_.print_bad_move() : view_.print_field(field, 0);
Что означает 0?
Почему вообще тут две ветки? Начальную отрисовку поля можно сделать вне цикла.
В цикле игры у вас происходит постоянное копирование во временную переменную структуры с полем игры, которая должна контроллироваться только классом Board.
18 + 5 + 10
comment:4 Changed 4 years ago by
Owner: | changed from Tarabonda German to Дмитрий Свиридкин |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 2.0 → 3.0 |
comment:5 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
O....X.... .......... .OO*OX.... .....X.... .......... .....X.... .....X.... .....X.... .....X.... ......O.OO X wins!
Нолики собираются сделать ход в помеченную звездочкой клетку, но игра сошла с ума и досрочно засчитала победу крестикам.
Сейчас состояние поля корректно обрабатывается примерно в ~60% случаев.
const int FIELD_SIZE = 10; const int LOWER_BORDER = 0; const int UPPER_BORDER = 9;
UPPER_BORDER должна быть согласована с FIELD_SIZE, а у вас появляется дополнительная степень свободы.
const int UPPER_BORDER = FIELD_SIZE - 1;
И последние две константы вряд ли должны быть в хэдере.
Controller::Controller(Board &board, BoardView &view) : board_(board), view_(view) {}; Controller::~Controller() { delete &board_; delete &view_; };
Не делайте delete через ссылку -- никогда.
Передача по ссылке никогда не означает передачу владения. И сигнатура конструктора никак не выражает намерения захватить владение.
Первый же пользователь такой библиотеки передаст в конструктор ссылку на значение на стеке и получит UB.
Предыдущая версия была лучше.
src/main.cpp:23:16: warning: ‘game’ may be used uninitialized in this function [-Wmaybe-uninitialized]
Как-то нехорошо.
Однобуквенные константы для типов игры -- не жадничайте на буквы. Ведь совершенно не понятно, что такое F, а что такое S.
Ничья и победа при полном заполнении поля неправильно обрабатываются. Можно победить, заполнив последнюю клетку.
Неправильный формат вида 0a0 приводит к зацикливанию
ncsurses -- работает, но:
Проверьте параметр из условия :)
Поле field_ -- публичное, его могут помеять в обход методов make_turn.
Если нужно предоставить к нему доступ на чтение, лучше сделать функцию-геттер, возвращающую значение или константные ссылки.
Огромную функцию проверки, кто победил, лучше разделить на несколько.
Ее еще можно переписать, чтобы не проверять в каждом case одно и то же: сделайте функцию check_line, параметризуемую начальной точной и направлением смещения.
Можно сделать так, чтоб функция check_end_game возвращала результат не через скрытый приватный параметр, а явно -- через возвращаемое значение. Явное лучше неявного.
Все-таки подумайте над тем, как вынести логику game_loop из View в контроллер.
15 + 4 + 8