新手练习项目 3:简易五子棋的实现(C++)

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波·莫听穿林打叶声》
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)

一、效果图

在这里插入图片描述

二、代码(带注释)

//创作者:Code_流苏(CSDN)
//未经允许,禁止转载发布,可自己学习使用
#include <iostream>
#include <vector>

using namespace std;

const int BOARD_SIZE = 15; // 定义棋盘大小为 15x15
vector<vector<char>> board(BOARD_SIZE, vector<char>(BOARD_SIZE, '.')); // 初始化棋盘,所有位置都是空的(用'.'表示)

// 打印棋盘的函数
void printBoard() {
    
    
    for (int i = 0; i < BOARD_SIZE; ++i) {
    
    
        for (int j = 0; j < BOARD_SIZE; ++j) {
    
    
            cout << board[i][j] << " ";
        }
        cout << endl;
    }
}

// 落子的函数
bool makeMove(int x, int y, char player) {
    
    
    // 检查落子的位置是否有效
    if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE || board[x][y] != '.') {
    
    
        return false;
    }
    board[x][y] = player; // 在指定位置放置玩家的棋子
    return true;
}

// 检查是否赢得比赛的函数
bool checkWin(int x, int y) {
    
    
    char player = board[x][y];
    int count;

    // 水平方向检查
    count = 1;
    for (int i = x - 1; i >= 0 && board[i][y] == player; --i) count++;
    for (int i = x + 1; i < BOARD_SIZE && board[i][y] == player; ++i) count++;
    if (count >= 5) return true;

    // 垂直方向检查
    count = 1;
    for (int i = y - 1; i >= 0 && board[x][i] == player; --i) count++;
    for (int i = y + 1; i < BOARD_SIZE && board[x][i] == player; ++i) count++;
    if (count >= 5) return true;

    // 对角线检查(左上到右下)
    count = 1;
    for (int i = 1; x - i >= 0 && y - i >= 0 && board[x - i][y - i] == player; ++i) count++;
    for (int i = 1; x + i < BOARD_SIZE && y + i < BOARD_SIZE && board[x + i][y + i] == player; ++i) count++;
    if (count >= 5) return true;

    // 对角线检查(左下到右上)
    count = 1;
    for (int i = 1; x - i >= 0 && y + i < BOARD_SIZE && board[x - i][y + i] == player; ++i) count++;
    for (int i = 1; x + i < BOARD_SIZE && y - i >= 0 && board[x + i][y - i] == player; ++i) count++;
    if (count >= 5) return true;

    return false;
}

// 检查棋盘是否已满的函数
bool isBoardFull() {
    
    
    for (int i = 0; i < BOARD_SIZE; ++i) {
    
    
        for (int j = 0; j < BOARD_SIZE; ++j) {
    
    
            if (board[i][j] == '.') {
    
    
                return false;
            }
        }
    }
    return true;
}

// 主函数
int main() {
    
    
    int x, y;
    char currentPlayer = 'X'; // 初始玩家
    while (true) {
    
    
        printBoard(); // 打印棋盘
        cout << "玩家" << currentPlayer << ", 输入行列的来放入棋子: ";
        cin >> x >> y;
        if (makeMove(x, y, currentPlayer)) {
    
     // 尝试落子
            if (checkWin(x, y)) {
    
     // 检查是否赢得比赛
                cout << "玩家 " << currentPlayer << " wins!" << endl;
                break;
            } else if (isBoardFull()) {
    
     // 检查是否平局
                cout << "平局了!" << endl;
                break;
            }
            currentPlayer = (currentPlayer == 'X') ? 'O' : 'X'; // 更换玩家
        } else {
    
    
            cout << "无效移动,请重新尝试" << endl;
        }
    }
    return 0;
}

三、说明

上述代码实现了一个简单的棋盘游戏,适用于两位玩家,棋盘大小:15x15。关于实现思路和自定义函数说明如下:

  1. 棋盘初始化:棋盘是一个15x15的网格,初始化时用’.'表示空位。

  2. 打印棋盘printBoard()函数打印当前棋盘的状态。

  3. 落子makeMove()函数允许玩家在棋盘上放置他们的符号(‘X’或’O’),前提是所选单元格为空。

  4. 检查胜利checkWin()函数检查玩家的最后一个动作是否赢得了游戏。它水平、垂直和对角线(两个方向)检查是否有连续的5个相同符号。

  5. 检查棋盘是否已满isBoardFull()函数检查棋盘上是否还有空位。

  6. 游戏循环:在main()中,游戏继续循环,每位玩家轮流进行移动。每次移动后,它检查是否胜利或平局。如果一方胜利或棋盘已满(导致平局),游戏结束。

  7. 用户输入:玩家通过标准输入(cin)输入他们的移动,他们需要输入行号和列号。

  8. 处理无效移动:如果进行了无效的移动,游戏会提示用户重新尝试。

这个棋盘游戏,基于文本实现,在控制台中进行,能够提供一个简单但功能完备的双人棋盘游戏实现。

Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)
点赞加关注,收藏不迷路!本篇文章对你有帮助的话,还请多多点赞支持!

猜你喜欢

转载自blog.csdn.net/qq_51646682/article/details/135360674
今日推荐