Files
minesweeper/src/minefield.hpp
2025-03-10 18:55:45 +00:00

58 lines
1.5 KiB
C++

#pragma once
#include <sigc++/signal.h>
#include <utility>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <memory>
#include <thread>
#include <chrono>
struct Cell {
bool isFlagged;
bool isCleared;
bool isBomb;
int bombsNearby;
Cell(): isFlagged(false), isCleared(false), isBomb(false), bombsNearby(-1) {};
};
class MineField {
std::vector<std::shared_ptr<Cell>> m_cells;
int m_rows;
int m_cols;
int m_totalMines;
int m_remainingFlags;
int m_openCells;
bool m_exploded;
bool m_gameWon;
size_t m_time;
std::thread timerThread;
void computeBombsNearby(int x, int y);
void openNeighboorhood(int x, int y);
void setOpenCell(int x, int y);
void timerTick();
public:
MineField(int cols, int rows, int mines);
void initBombs(int x, int y);
bool isBomb(int x, int y);
bool isFlagged(int x, int y);
bool isOpened(int x, int y);
bool openCell(int x, int y);
int bombsNearby(int x, int y);
bool isGameOver() {return m_exploded; };
int getCols() {return m_cols; };
int getRows() {return m_rows; };
bool toggleFlag(int x, int y);
int getRemainingFlags() {return m_remainingFlags; };
int getTotalMines() {return m_totalMines; };
void startNewGame(int cols, int rows, int mines);
sigc::signal<void(int, int)> openCellSignal;
sigc::signal<void(int)> remainingFlagsSignal;
sigc::signal<void(void)> gameWonSignal;
sigc::signal<void(void)> gameOverSignal;
sigc::signal<void(size_t)> timerSignal;
};