Skip to content
Snippets Groups Projects
Field.cpp 2.32 KiB
Newer Older
  • Learn to ignore specific revisions
  • Pelotrio's avatar
    Pelotrio committed
    //
    // Created by Admin on 20.12.2022.
    //
    
    #include <iostream>
    #include <ctime>
    #include <cstring>
    #include "Field.h"
    
    void Field::printHiddenBoard() {
        for (auto &i: hiddenBoard) {
            for (int j: i) {
                // Print the mines as X
                if (j == -1) {
                    cout << "X ";
                } else {
                    cout << j << " ";
                }
            }
            cout << endl;
        }
    }
    
    Field::Field() {
        memset(hiddenBoard, 0, sizeof(hiddenBoard));
        memset(board, '*', sizeof(board));
    }
    
    void Field::generateMines() {
        srand(time(nullptr));
        while (mines.size() < MINES) {
            mines.insert(rand() % 100);
        }
    }
    
    void Field::printBoard() {
        cout << "  A B C D E F G H I J" << endl;
        for (int i = 0; i < 10; i++) {
            if (i < 9) cout << i + 1 << " ";
            else cout << i + 1;
    
            for (int j = 0; j < 10; j++) {
                cout << board[i][j] << " ";
            }
            cout << endl;
        }
    }
    
    void Field::fillHiddenBoard() {
        // Fill the board with mines and the number of mines around it
        for (int i = 0; i < 10; ++i) {
            for (int j = 0; j < 10; ++j) {
                if (mines.find(i * 10 + j) != mines.end()) {
                    hiddenBoard[i][j] = -1;
                    for (int k = -1; k <= 1; ++k) {
                        for (int l = -1; l <= 1; ++l) {
                            if (i + k >= 0 && i + k < 10 && j + l >= 0 && j + l < 10 && hiddenBoard[i + k][j + l] != -1) {
                                hiddenBoard[i + k][j + l]++;
                            }
                        }
                    }
                }
            }
        }
    }
    
    void Field::openField(int row, int col) {
        // Open all fields that are possible to open using recursion
        if (hiddenBoard[row][col] == 0) {
            board[row][col] = '_';
            for (int i = -1; i <= 1; i++) {
                for (int j = -1; j <= 1; j++) {
                    if (row + i >= 0 && row + i < 10 && col + j >= 0 && col + j < 10 && board[row + i][col + j] != '_') {
                        openField(row + i, col + j);
                    }
                }
            }
        } else {
            board[row][col] = hiddenBoard[row][col] + '0';
        }
    }
    
    bool Field::isMine(int row, int col) {
        return hiddenBoard[row][col] == -1;
    }
    
    bool Field::isOpen(int row, int col) {
        return board[row][col] == '_';
    }
    
    void Field::flagField(int row, int col) {
        board[row][col] = 'p';
    }