Skip to content

Latest commit

 

History

History
51 lines (39 loc) · 3.99 KB

README.md

File metadata and controls

51 lines (39 loc) · 3.99 KB

Сапёр

Реализуйте класс Minesweeper для игры "Сапёр".

Структура класса

Конструкторы

  • принимающий размеры поля и количество мин - расставляет мины на поле случайным образом
  • принимающий размеры поля и список клеток - расставляет мины на указанных клетках

Методы

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

Алгоритм открытия клетки

  • Если клетка содержит мину
    • открываются все клетки
    • игра заканчивается проигрышем
  • Если клетка не содержит мину, но мина есть в соседней клетке, то открывается только эта клетка
  • Если клетка и её соседи не содержат мин
    • текущая клетка открывается
    • алгоритм открытия клетки применяется ко всем соседям текущей клетки без флажка

Игра считается выигранной, когда открыты все клетки кроме тех, на которых стоят мины.

Реализация

Внутреннее представление игры не должно быть завязано на отображение. Преобразуйте внутреннее представление в строки только в методе RenderField.

Наивный алгоритм случайной расстановки мин может быть неэффективен при количестве мин, близком к общему количеству клеток.

Поле может быть очень большим. Не используйте рекурсивный вызов функций/методов для открытия клеток.

Для работы со временем можно использовать std::time.

Можете реализовать простой консольный интерфейс, чтобы протестировать свой код в реальной игре.