#include <iostream>
#include <vector>
using namespace std;

// 棋盘大小
const int BOARD_SIZE = 8;

// 棋子类型
enum Piece {
    EMPTY = 0,
    BLACK = 1,
    WHITE = 2
};

// 初始化棋盘
void initializeBoard(vector<vector<Piece>>& board) {
    for (int i = 0; i < BOARD_SIZE; i++) {
        vector<Piece> row(BOARD_SIZE, EMPTY);
        board.push_back(row);
    }
}

// 打印棋盘
void printBoard(const vector<vector<Piece>>& board) {
    cout << "  ";
    for (int i = 0; i < BOARD_SIZE; i++) {
        cout << i << " ";
    }
    cout << endl;
    
    for (int i = 0; i < BOARD_SIZE; i++) {
        cout << i << " ";
        for (int j = 0; j < BOARD_SIZE; j++) {
            switch (board[i][j]) {
                case EMPTY: cout << ". "; break;
                case BLACK: cout << "● "; break;
                case WHITE: cout << "○ "; break;
            }
        }
        cout << endl;
    }
}

// 检查是否有效落子位置
bool isValidMove(const vector<vector<Piece>>& board, int row, int col) {
    return row >= 0 && row < BOARD_SIZE && 
           col >= 0 && col < BOARD_SIZE && 
           board[row][col] == EMPTY;
}

// 检查是否获胜
bool checkWin(const vector<vector<Piece>>& board, int row, int col, Piece piece) {
    // 检查水平方向
    int count = 0;
    for (int i = max(0, col - 4); i <= min(BOARD_SIZE - 1, col + 4); i++) {
        if (board[row][i] == piece) {
            count++;
            if (count == 5) return true;
        } else {
            count = 0;
        }
    }
    
    // 检查垂直方向
    count = 0;
    for (int i = max(0, row - 4); i <= min(BOARD_SIZE - 1, row + 4); i++) {
        if (board[i][col] == piece) {
            count++;
            if (count == 5) return true;
        } else {
            count = 0;
        }
    }
    
    // 检查左上到右下对角线
    count = 0;
    for (int i = -4; i <= 4; i++) {
        int r = row + i;
        int c = col + i;
        if (r >= 0 && r < BOARD_SIZE && c >= 0 && c < BOARD_SIZE) {
            if (board[r][c] == piece) {
                count++;
                if (count == 5) return true;
            } else {
                count = 0;
            }
        }
    }
    
    // 检查右上到左下对角线
    count = 0;
    for (int i = -4; i <= 4; i++) {
        int r = row + i;
        int c = col - i;
        if (r >= 0 && r < BOARD_SIZE && c >= 0 && c < BOARD_SIZE) {
            if (board[r][c] == piece) {
                count++;
                if (count == 5) return true;
            } else {
                count = 0;
            }
        }
    }
    
    return false;
}

// 主游戏函数
void playGame() {
    vector<vector<Piece>> board;
    initializeBoard(board);
    
    Piece currentPlayer = BLACK;
    int moves = 0;
    int maxMoves = BOARD_SIZE * BOARD_SIZE;
    
    cout << "欢迎来到8×8五子棋游戏!" << endl;
    cout << "黑棋(●)先手,白棋(○)后手" << endl;
    cout << "输入坐标格式: 行 列 (例如: 3 4)" << endl;
    
    while (moves < maxMoves) {
        printBoard(board);
        
        cout << (currentPlayer == BLACK ? "黑棋(●)" : "白棋(○)") << "的回合: ";
        
        int row, col;
        cin >> row >> col;
        
        // 检查输入是否有效
        if (!isValidMove(board, row, col)) {
            cout << "无效的落子位置,请重新输入!" << endl;
            continue;
        }
        
        // 落子
        board[row][col] = currentPlayer;
        moves++;
        
        // 检查是否获胜
        if (checkWin(board, row, col, currentPlayer)) {
            printBoard(board);
            cout << (currentPlayer == BLACK ? "黑棋(●)" : "白棋(○)") << "获胜!" << endl;
            return;
        }
        
        // 切换玩家
        currentPlayer = (currentPlayer == BLACK) ? WHITE : BLACK;
    }
    
    printBoard(board);
    cout << "平局!棋盘已满!" << endl;
}

int main() {
    playGame();
    return 0;
}

3 条评论

  • 1

信息

ID
116
时间
1000ms
内存
256MiB
难度
8
标签
递交数
56
已通过
9
上传者