refactoring

This commit is contained in:
Bernardo Magri
2025-03-07 07:23:59 +00:00
parent 2c13567747
commit 052690fede
6 changed files with 454 additions and 92 deletions

View File

@@ -4,6 +4,7 @@ MineField::MineField(int cols, int rows, int mines): m_rows(rows),
m_cols(cols),
m_totalMines(mines),
m_remainingFlags(mines),
m_openCells(0),
m_exploded(false) {
for(int i=0; i< m_cols*m_rows; i++) {
std::shared_ptr<Cell> cell = std::make_shared<Cell>();
@@ -21,7 +22,7 @@ void MineField::initBombs(int x, int y) {
while(remainingMines > 0) {
int position = rand() % (m_cols * m_rows);
if(isBomb(position % m_cols, position / m_rows) || position == startPos) {
if(isBomb(position % m_cols, position / m_cols) || position == startPos) {
continue;
}
m_cells.at(position)->isBomb = true;
@@ -29,14 +30,16 @@ void MineField::initBombs(int x, int y) {
}
}
bool MineField::clearCell(int x, int y) {
setClearCell(x, y);
bool MineField::openCell(int x, int y) {
if(isBomb(x, y)) {
m_exploded = true;
return false;
gameOverSignal.emit();
return false;
}
setOpenCell(x, y);
if (bombsNearby(x, y) == 0) {
openNeighboorhood(x, y);
}
@@ -63,8 +66,8 @@ void MineField::openNeighboorhood(int x, int y) {
for(int i=-1; i<2; i++) {
for(int j=-1; j<2; j++) {
if(x+i >= 0 && x+i < m_cols && y+j >= 0 && y+j < m_rows) {
if((isCleared(x+i, y+j) == false) && (isBomb(x+i, y+j) == false)){
setClearCell((x+i), (y+j));
if((isOpened(x+i, y+j) == false) && (isBomb(x+i, y+j) == false)){
setOpenCell((x+i), (y+j));
if(bombsNearby(x+i, y+j) == 0) {
openNeighboorhood(x+i, y+j);
}
@@ -74,7 +77,7 @@ void MineField::openNeighboorhood(int x, int y) {
}
}
bool MineField::isCleared(int x, int y) {
bool MineField::isOpened(int x, int y) {
return m_cells.at(x + y * m_rows)->isCleared;
}
@@ -93,22 +96,25 @@ int MineField::bombsNearby(int x, int y) {
return m_cells.at(x + y * m_rows)->bombsNearby;
}
void MineField::setClearCell(int x, int y) {
void MineField::setOpenCell(int x, int y) {
m_cells.at(x + y * m_rows)->isCleared = true;
clearCellSignal.emit(x, y);
openCellSignal.emit(x, y);
if((++m_openCells == (m_cols * m_rows - m_totalMines)) && (m_exploded == false)) {
gameWonSignal.emit();
}
}
bool MineField::toggleFlag(int x, int y) {
if(m_cells.at(x + y * m_rows)->isFlagged == true) {
m_cells.at(x + y * m_rows)->isFlagged = false;
++m_remainingFlags;
remainingFlagsChangedSignal.emit(m_remainingFlags);
remainingFlagsSignal.emit(m_remainingFlags);
return true;
}
else if(m_remainingFlags > 0) {
m_cells.at(x + y * m_rows)->isFlagged = true;
--m_remainingFlags;
remainingFlagsChangedSignal.emit(m_remainingFlags);
remainingFlagsSignal.emit(m_remainingFlags);
return true;
}
return false;