Реализуйте класс Minesweeper
для игры "Сапёр".
- принимающий размеры поля и количество мин - расставляет мины на поле случайным образом
- принимающий размеры поля и список клеток - расставляет мины на указанных клетках
NewGame
- инициализирует новую игру; имеет два варианта, аналогичных конструкторамOpenCell
- аналог клика левой кнопкой мыши- если игра выиграна или проиграна, ничего не делает
- если клетка с флажком, ничего не делает
- если клетка без флажка, открывает клетку; алгоритм отрытия клеток описан ниже
MarkCell
- аналог клика правой кнопкой мыши- если игра выиграна или проиграна, ничего не делает
- пустую клетку отмечает флажком
- с клетки с флажком снимает флажок
GetGameStatus
- возвращает статус игрыGetGameTime
- возвращает время игры в секундах. Время начинает отсчитываться при первом клике в игре и замораживается при выигрыше или проигрыше. До первого клика в игре возвращает 0.RenderField
- возвращает список строк, соответствующий отрисованному полю. Соответствие элементов символам:- закрытая клетка -
-
- клетка с миной -
*
- клетка с флагом -
?
- открытая клетка без мин - число от
1
до8
(соответствует количеству мин в соседних клетках), вместо 0 рисуется.
- закрытая клетка -
- Если клетка содержит мину
- открываются все клетки
- игра заканчивается проигрышем
- Если клетка не содержит мину, но мина есть в соседней клетке, то открывается только эта клетка
- Если клетка и её соседи не содержат мин
- текущая клетка открывается
- алгоритм открытия клетки применяется ко всем соседям текущей клетки без флажка
Игра считается выигранной, когда открыты все клетки кроме тех, на которых стоят мины.
Внутреннее представление игры не должно быть завязано на отображение.
Преобразуйте внутреннее представление в строки только в методе RenderField
.
Наивный алгоритм случайной расстановки мин может быть неэффективен при количестве мин, близком к общему количеству клеток.
Поле может быть очень большим. Не используйте рекурсивный вызов функций/методов для открытия клеток.
Для работы со временем можно использовать std::time.
Можете реализовать простой консольный интерфейс, чтобы протестировать свой код в реальной игре.