Untitled

mail@pastecode.io avatar
unknown
c_cpp
a year ago
3.0 kB
3
Indexable
Never
#include <iostream>
#include <limits>

const char PLAYER_ONE = 'X';
const char PLAYER_TWO = 'O';
const char EMPTY = '-';

void drawBoard(const int fieldSize, char** board) {
    for (int i = 0; i < fieldSize; ++i) {
        for (int j = 0; j < fieldSize; ++j) {
            std::cout << board[i][j] << ' ';
        }
        std::cout << std::endl;
    }
}

bool checkWin(const int fieldSize, char** board, char player) {
    for (int i = 0; i < fieldSize; ++i) {
        bool rowWin = true;
        bool colWin = true;
        for (int j = 0; j < fieldSize; ++j) {
            rowWin &= (board[i][j] == player);
            colWin &= (board[j][i] == player);
        }
        if (rowWin || colWin) {
            return true;
        }
    }

    bool diagonalWin = true;
    bool reverseDiagonalWin = true;
    for (int i = 0; i < fieldSize; ++i) {
        diagonalWin &= (board[i][i] == player);
        reverseDiagonalWin &= (board[i][fieldSize - i - 1] == player);
    }

    return diagonalWin || reverseDiagonalWin;
}

int main() {
    int fieldSize;
    std::cout << "Enter the field size: ";
    if (!(std::cin >> fieldSize)) {
        std::cout << "Error. Field size can only be set as a number" << std::endl;
        return 1;
    }

    char** board = new char*[fieldSize];
    for (int i = 0; i < fieldSize; ++i) {
        board[i] = new char[fieldSize];
        for (int j = 0; j < fieldSize; ++j) {
            board[i][j] = EMPTY;
        }
    }

    bool playerOneTurn = true;
    int moves = fieldSize * fieldSize;
    while (moves > 0) {
        drawBoard(fieldSize, board);
        int row, col;
        std::cout << "Player " << (playerOneTurn ? "1" : "2") << ", enter your move (row, col): ";
        std::cin >> row >> col;

        row -= 1; // subtract 1 from row
        col -= 1; // subtract 1 from column
        
            while (std::cin.fail() || row < 0 || row >= fieldSize || col < 0 || col >= fieldSize || board[row][col] != EMPTY) {
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            std::cout << "Invalid input. Please enter a valid move (row, col): ";
            std::cin >> row >> col;
            row -= 1; // subtract 1 from row
            col -= 1; // subtract 1 from column
        }

        // Fix the bug here:
        board[row][col] = playerOneTurn ? PLAYER_ONE : PLAYER_TWO;
        if (checkWin(fieldSize, board, playerOneTurn ? PLAYER_ONE : PLAYER_TWO)) {
            drawBoard(fieldSize, board);
            std::cout << "Player " << (playerOneTurn ? "1" : "2") << " wins!" << std::endl;
            break;
        }

        playerOneTurn = !playerOneTurn;
        --moves;
    }

    if (moves == 0) {
        drawBoard(fieldSize, board);
        std::cout << "It's a draw!" << std::endl;
    }

    for (int i = 0; i < fieldSize; ++i) {
        delete[] board[i];
    }
    delete[] board;

    return 0;
}