Opened 4 years ago

Closed 4 years ago

#720 closed ожидается проверка (задача сдана)

HW #2

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

Проверьте после каких строк и где должен быть перевод строки, как описано в задании.

в silent-mode, в случае чьей-либо победы, не выводится результат.

0-0 воспринимается как валидный ход

ncurses: работает, но отслеживать положение курсора миганием точки среди точек -- не самое лучшее решение. Также неплохо выводить, чей сейчас ход.

В CMake лучше не использовать напрямую флаг -I для указания каталога с заголовочниками, лучше воспользоваться командой target_include_directories

Есть ощущение, что методы say_bad_turn и ask_turn не являются частью общего интерфейса BoardView?.
Они скорее всего должны быть частью метода get_turn в конкретной реализации этого интерфейса.
Метод terminate тоже явного отношения к BoardView? не имеет, а скорее относится к GameController?.

поле is_silent, наоборот, относится к view, а не к controller.

Раз уж начали использовать умные указатели -- используйте их до конца. Оберните сырые указатели в main.

Три звездочки у типа... это уже перебор. Зачем вам двумерный массив указателей на int/элементы Enum? Хватит просто двумерного массива.

    delete &y_state_;
    delete &x_state_;
    delete &field_;

Не делайте так. Никогда. Либо явно используете указатели. Либо не управляете временем жизни через ссылку. Выделять память через new, сразу же биндить к ссылке и терять указатель -- путь к жутким ошибкам.

int x_ = x, y_ = y; Вы используете name_ для полей классов/структур. Введением таких временных переменных вы вносите путаницу.
В методе update_state эти переменные в принципе стоит переименовать в соответсвии с тем, что это за координаты.


16 + 2 + 8

comment:2 Changed 4 years ago by Roman Venediktov

Owner: changed from Roman Venediktov to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка
Version: 1.02.0
  1. А почему три звёздочки - плохо, там же трёхмерный массив [size_x][size_y][4]
  1. Убрав terminate, мне теперь нужно вызывать endwin в деструкторе (чтобы консоль возвращалась в нормальный режим), что может привести к тому, что я его два раза вызываю, если игра нормально завершилась. Т.е. идеологически terminate вроде как раз относился к view, и должен был его корректно завершать в случае неожиданного окончания.

comment:3 in reply to:  2 Changed 4 years ago by Дмитрий Свиридкин

Replying to Roman Venediktov:

  1. А почему три звёздочки - плохо, там же трёхмерный массив [size_x][size_y][4]
  1. Убрав terminate, мне теперь нужно вызывать endwin в деструкторе (чтобы консоль возвращалась в нормальный режим), что может привести к тому, что я его два раза вызываю, если игра нормально завершилась. Т.е. идеологически terminate вроде как раз относился к view, и должен был его корректно завершать в случае неожиданного окончания.

А зачем там трехмерный массив? Двухмерного cell_state field[X][Y] должно быть достаточно. И это более читаемое и проще понимаемое решение.

Освобождать ресурсы в деструкторе, а захватывать в конструкторе -- благое дело.

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

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

в silent mode все так же глухо

GameController::GameController(BoardView *view) : board_{new Board}, view_{view} {}

GameController::~GameController() {
    delete board_;
    delete view_;
}

board вы создаете в куче и вы им владеете -- ок
View приходит извне -- возможно, его создали на стеке. А вы делаете delete.
Во избежание ошибок, нужно использовать выразительные средства, предоставляемые системой типов:
Передаете владение -- используйте shared_ptr (или перемещение unique_ptr).
Единолично владеете -- unique_ptr
Просто нужна ссылка, а сохранность данных не волнует -- передаете ссылку.

В ncurses версии после победного хода игра моментально закрывается. Даже поторжествовать не дает. Ну и не понятно: то ли она упала, то ли кто-то победил.
endwin можно вызвать только в деструкторе.

назначение третьего измерения массива все еще не ясно.


17 + 6 + 9

comment:5 Changed 4 years ago by Roman Venediktov

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

silent mode снова попытался ожить

Я поддерживаю трёхмерный массив, где для каждой клетки хранится то, сколько уже в ряд элементов этого типа для каждого из 4 направлений (остальные 4 это просто противоположные). Я так потребляю больше памяти, но зато быстрее обрабатываю каждый ход. Нам же не сказали, что важнее оптимизировать, почему бы и не так ¯\_(ツ)_/¯

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

Resolution: задача сдана
Status: assignedclosed

Ох уж эти преждевременные оптимизации не понятно для чего...

20 + 8.5 + 10

Note: See TracTickets for help on using tickets.