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: | ожидается проверка → ожидаются исправления |
comment:2 follow-up: 3 Changed 4 years ago by
Owner: | changed from Roman Venediktov to Дмитрий Свиридкин |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 1.0 → 2.0 |
- А почему три звёздочки - плохо, там же трёхмерный массив [size_x][size_y][4]
- Убрав terminate, мне теперь нужно вызывать endwin в деструкторе (чтобы консоль возвращалась в нормальный режим), что может привести к тому, что я его два раза вызываю, если игра нормально завершилась. Т.е. идеологически terminate вроде как раз относился к view, и должен был его корректно завершать в случае неожиданного окончания.
comment:3 Changed 4 years ago by
Replying to Roman Venediktov:
- А почему три звёздочки - плохо, там же трёхмерный массив [size_x][size_y][4]
- Убрав 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
Owner: | changed from Roman Venediktov to Дмитрий Свиридкин |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 2.0 → 3.0 |
silent mode снова попытался ожить
Я поддерживаю трёхмерный массив, где для каждой клетки хранится то, сколько уже в ряд элементов этого типа для каждого из 4 направлений (остальные 4 это просто противоположные). Я так потребляю больше памяти, но зато быстрее обрабатываю каждый ход. Нам же не сказали, что важнее оптимизировать, почему бы и не так ¯\_(ツ)_/¯
comment:6 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Ох уж эти преждевременные оптимизации не понятно для чего...
20 + 8.5 + 10
Проверьте после каких строк и где должен быть перевод строки, как описано в задании.
в 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? Хватит просто двумерного массива.
Не делайте так. Никогда. Либо явно используете указатели. Либо не управляете временем жизни через ссылку. Выделять память через new, сразу же биндить к ссылке и терять указатель -- путь к жутким ошибкам.
int x_ = x, y_ = y;
Вы используете name_ для полей классов/структур. Введением таких временных переменных вы вносите путаницу.В методе update_state эти переменные в принципе стоит переименовать в соответсвии с тем, что это за координаты.
16 + 2 + 8