c++五子棋源代码

以下是一个简单的C++五子棋源代码示例:

#include <iostream>
#include <vector>

const int BOARD_SIZE = 15;
const char EMPTY = '-';
const char BLACK = 'X';
const char WHITE = 'O';

std::vector<std::vector<char>> board(BOARD_SIZE, std::vector<char>(BOARD_SIZE, EMPTY));

bool is_valid_move(int row, int col) {
    return row >= 0 && row < BOARD_SIZE && col >= 0 && col < BOARD_SIZE && board[row][col] == EMPTY;
}

bool is_winning_move(int row, int col, char player) {
    int count = 0;

    // 检查水平方向
    for (int i = col - 4; i <= col; i++) {
        if (i >= 0 && i + 4 < BOARD_SIZE) {
            count = 0;
            for (int j = i; j <= i + 4; j++) {
                if (board[row][j] == player) {
                    count++;
                }
            }
            if (count == 5) {
                return true;
            }
        }
    }

    // 检查垂直方向
    for (int i = row - 4; i <= row; i++) {
        if (i >= 0 && i + 4 < BOARD_SIZE) {
            count = 0;
            for (int j = i; j <= i + 4; j++) {
                if (board[j][col] == player) {
                    count++;
                }
            }
            if (count == 5) {
                return true;
            }
        }
    }

    // 检查主对角线方向
    for (int i = -4; i <= 0; i++) {
        if (row + i >= 0 && row + i + 4 < BOARD_SIZE && col + i >= 0 && col + i + 4 < BOARD_SIZE) {
            count = 0;
            for (int j = 0; j <= 4; j++) {
                if (board[row + i + j][col + i + j] == player) {
                    count++;
                }
            }
            if (count == 5) {
                return true;
            }
        }
    }

    // 检查副对角线方向
    for (int i = -4; i <= 0; i++) {
        if (row + i >= 0 && row + i + 4 < BOARD_SIZE && col - i >= 0 && col - i + 4 < BOARD_SIZE) {
            count = 0;
            for (int j = 0; j <= 4; j++) {
                if (board[row + i + j][col - i - j] == player) {
                    count++;
                }
            }
            if (count == 5) {
                return true;
            }
        }
    }

    return false;
}

void print_board() {
    for (int i = 0; i < BOARD_SIZE; i++) {
        for (int j = 0; j < BOARD_SIZE; j++) {
            std::cout << board[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

int main() {
    int row, col;
    char player = BLACK;

    while (true) {
        std::cout << "Player " << player << "'s turn. Enter row and column: ";
        std::cin >> row >> col;

        if (is_valid_move(row, col)) {
            board[row][col] = player;
            print_board();

            if (is_winning_move(row, col, player)) {
                std::cout << "Player " << player << " wins!" << std::endl;
                break;
            }

            player = (player == BLACK) ? WHITE : BLACK;
        } else {
            std::cout << "Invalid move. Try again." << std::endl;
        }
    }

    return 0;
}

这个程序使用一个二维向量来表示棋盘,其中空位置用’-'表示,黑子用’X’表示,白子用’O’表示。程序通过循环接受玩家输入的行和列,然后检查是否是有效的移动,如果是,则在棋盘上放置相应的棋子,并检查是否是获胜的移动。如果是获胜的移动,则输出获胜信息并结束游戏。如果不是获胜的移动,则切换到另一个玩家。

这个程序中的is_valid_move函数用于检查玩家的移动是否有效。它会检查行和列的范围是否在合法的范围内,并且该位置是否为空。

is_winning_move函数用于检查玩家的移动是否是获胜的移动。它会检查水平、垂直、主对角线和副对角线四个方向上是否有连续的五个相同的棋子。

print_board函数用于打印当前的棋盘状态。

main函数中,程序会循环接受玩家的输入,并根据输入的行和列进行移动。如果移动有效,则在棋盘上放置相应的棋子,并检查是否是获胜的移动。如果是获胜的移动,则输出获胜信息并结束游戏。如果移动无效,则提示玩家重新输入。

这个程序只是一个简单的示例,可能还有一些功能和优化可以添加,比如判断平局、添加输入验证等。但是这个示例可以作为一个起点,你可以根据自己的需求进行修改和扩展。