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: ожидается проверкаожидаются исправления

src/main.cpp:23:16: warning: ‘game’ may be used uninitialized in this function [-Wmaybe-uninitialized]

23 | game->run_game();

Как-то нехорошо.

Однобуквенные константы для типов игры -- не жадничайте на буквы. Ведь совершенно не понятно, что такое F, а что такое S.

Ничья и победа при полном заполнении поля неправильно обрабатываются. Можно победить, заполнив последнюю клетку.

Неправильный формат вида 0a0 приводит к зацикливанию

ncsurses -- работает, но:

hw_02/hw_02 curses
Segmentation fault (core dumped)

Проверьте параметр из условия :)

Поле field_ -- публичное, его могут помеять в обход методов make_turn.
Если нужно предоставить к нему доступ на чтение, лучше сделать функцию-геттер, возвращающую значение или константные ссылки.

Огромную функцию проверки, кто победил, лучше разделить на несколько.
Ее еще можно переписать, чтобы не проверять в каждом case одно и то же: сделайте функцию check_line, параметризуемую начальной точной и направлением смещения.

Можно сделать так, чтоб функция check_end_game возвращала результат не через скрытый приватный параметр, а явно -- через возвращаемое значение. Явное лучше неявного.

Все-таки подумайте над тем, как вынести логику game_loop из View в контроллер.

15 + 4 + 8

comment:2 Changed 4 years ago by Tarabonda German

Owner: changed from Tarabonda German to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка
Version: 1.02.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 Tarabonda German

Owner: changed from Tarabonda German to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка
Version: 2.03.0

comment:5 Changed 4 years ago by Дмитрий Свиридкин

Resolution: задача сдана
Status: assignedclosed
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.


Предыдущая версия была лучше.

Note: See TracTickets for help on using tickets.