C++ Program to create a Chess game

#include <iostream>

#include <string>


using namespace std;


enum Color { WHITE, BLACK };

enum Type { NONE, PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING };


struct Piece {

    Type type;

    Color color;

};


class ChessGame {

public:

    ChessGame();

    void playGame();


private:

    Piece board[8][8];

    Color currentPlayer;

    bool isGameOver;


    void initBoard();

    void printBoard() const;

    bool handleMove(string move);

    bool isValidMove(int srcRow, int srcCol, int destRow, int destCol) const;

    bool isKingInCheck(Color color) const;

    bool isStalemate(Color color) const;

    bool isCheckmate(Color color) const;

    void movePiece(int srcRow, int srcCol, int destRow, int destCol);

};


ChessGame::ChessGame() {

    initBoard();

    currentPlayer = WHITE;

    isGameOver = false;

}


void ChessGame::playGame() {

    cout << "Welcome to chess!" << endl;


    while (!isGameOver) {

        printBoard();


        if (isKingInCheck(currentPlayer)) {

            if (isCheckmate(currentPlayer)) {

                cout << "Checkmate! " << (currentPlayer == WHITE ? "Black" : "White") << " wins!" << endl;

                isGameOver = true;

                break;

            }

            else {

                cout << "Check!" << endl;

            }

        }

        else if (isStalemate(currentPlayer)) {

            cout << "Stalemate!" << endl;

            isGameOver = true;

            break;

        }


        string move;

        do {

            cout << (currentPlayer == WHITE ? "White" : "Black") << "'s turn: ";

            cin >> move;

        } while (!handleMove(move));


        currentPlayer = currentPlayer == WHITE ? BLACK : WHITE;

    }

}


void ChessGame::initBoard() {

    // Set up pawns

    for (int col = 0; col < 8; col++) {

        board[1][col] = { PAWN, BLACK };

        board[6][col] = { PAWN, WHITE };

    }


    // Set up other pieces

    board[0][0] = { ROOK, BLACK };

    board[0][1] = { KNIGHT, BLACK };

    board[0][2] = { BISHOP, BLACK };

    board[0][3] = { QUEEN, BLACK };

    board[0][4] = { KING, BLACK };

    board[0][5] = { BISHOP, BLACK };

    board[0][6] = { KNIGHT, BLACK };

    board[0][7] = { ROOK, BLACK };


    board[7][0] = { ROOK, WHITE };

    board[7][1] = { KNIGHT, WHITE };

    board[7][2] = { BISHOP, WHITE };

    board[7][3] = { QUEEN, WHITE };

    board[7][4] = { KING, WHITE };

    board[7][5] = { BISHOP, WHITE };

    board[7][6] = { KNIGHT, WHITE };

    board[7][7] = { ROOK, WHITE };


    // Set all other spaces to NONE

void ChessGame::printBoard() const {
    cout << endl << " ";
    for (int col = 0; col < 8; col++) {
        cout << col << " ";
    }
    cout << endl;

    for (int row = 0; row < 8; row++) {
        cout << row << " ";
        for (int col = 0; col < 8; col++) {
            char symbol;
            switch (board[row][col].type) {
                case NONE: symbol = ' '; break;
                case PAWN: symbol = 'P'; break;
                case KNIGHT: symbol = 'N'; break;
                case BISHOP: symbol = 'B'; break;
                case ROOK: symbol = 'R'; break;
                case QUEEN: symbol = 'Q'; break;
                case KING: symbol = 'K'; break;
            }
            if (board[row][col].color == BLACK) {
                symbol = tolower(symbol);
            }
            cout << symbol << " ";
        }
        cout << row << endl;
    }

    cout << " ";
    for (int col = 0; col < 8; col++) {
        cout << col << " ";
    }
    cout << endl << endl;
}

bool ChessGame::handleMove(string move) {
    if (move.length() != 4) {
        cout << "Invalid move. Format: 'a1b2'" << endl;
        return false;
    }

    int srcRow = move[1] - '0';
    int srcCol = move[0] - 'a';
    int destRow = move[3] - '0';
    int destCol = move[2] - 'a';

    if (srcRow < 0 || srcRow > 7 || srcCol < 0 || srcCol > 7 ||
        destRow < 0 || destRow > 7 || destCol < 0 || destCol > 7) {
        cout << "Invalid move. Out of bounds." << endl;
        return false;
    }

    if (board[srcRow][srcCol].type == NONE || board[srcRow][srcCol].color != currentPlayer) {
        cout << "Invalid move. No piece at source location." << endl;
        return false;
    }

    if (!isValidMove(srcRow, srcCol, destRow, destCol)) {
        cout << "Invalid move. Illegal move for this piece." << endl;
        return false;
    }

    movePiece(srcRow, srcCol, destRow, destCol);

    return true;
}

bool ChessGame::isValidMove(int srcRow, int srcCol, int destRow, int destCol) const {
    Piece srcPiece = board[srcRow][srcCol];
    Piece destPiece = board[destRow][destCol];

    // Check if destination is occupied by friendly piece
    if (destPiece.type != NONE && destPiece.color == srcPiece.color) {
        return false;
    }

    // Check if move is legal for this piece
    switch (srcPiece.type) {
        case PAWN:
            if (srcPiece.color == WHITE) {
                if (srcCol == destCol && destRow == srcRow - 1 && destPiece.type == NONE) {
                    return true;
                }
                else if (srcCol == destCol && destRow == srcRow - 2 && srcRow == 6 && destPiece.type == NONE && board[srcRow-
bool ChessGame::isInCheck(Color color) const {
    int kingRow = -1, kingCol = -1;
    for (int row = 0; row < 8; row++) {
        for (int col = 0; col < 8; col++) {
            Piece piece = board[row][col];
            if (piece.type == KING && piece.color == color) {
                kingRow = row;
                kingCol = col;
                break;
            }
        }
    }
    if (kingRow == -1 || kingCol == -1) {
        return false; // King not found
    }

    // Check if any enemy piece can attack the king
    for (int row = 0; row < 8; row++) {
        for (int col = 0; col < 8; col++) {
            Piece piece = board[row][col];
            if (piece.type != NONE && piece.color != color && isValidMove(row, col, kingRow, kingCol)) {
                return true;
            }
        }
    }

    return false;
}
int main() {
    ChessGame game;

    while (!game.isOver()) {
        game.printBoard();
        cout << "It is " << (game.getCurrentPlayer() == WHITE ? "White" : "Black") << "'s turn." << endl;

        string move;
        do {
            cout << "Enter your move: ";
            cin >> move;
        } while (!game.handleMove(move));

        if (game.isInCheck(game.getCurrentPlayer())) {
            cout << "Check!" << endl;
        }

        game.nextTurn();
    }

    game.printBoard();
    if (game.isCheckmate()) {
        cout << "Checkmate! " << (game.getCurrentPlayer() == WHITE ? "Black" : "White") << " wins." << endl;
    }
    else if (game.isStalemate()) {
        cout << "Stalemate. Game is a draw." << endl;
    }

    return 0;
}

Comments

Popular posts from this blog

Carbohydrates || Lipids|| Proteins || Vitamins & Minerals || Fats and Oils

Himanshu chaudhary

2.0 gram of a metal burst in oxygen give 3.2 gram of its oxide. 1.42 gram of the same metal heat in steam give 2.27 gram of its oxide which toys shown by this data?

Vistas Chapter-2 The Tiger King || Revision Notes Class 12 Board Exams

Data Mining || Supervised vs. Unsupervised Techniques || Dimensionality Reduction || Partitioning Methods