五子棋游戏的C++实现

2023.06-2023.07:课程“面向对象综合实践课”实训报告


目录

一、实验目的

(1)简介:

(2)目的:

二、设计思路

(1)棋盘设计:

(2)游戏流程:

(3)算法设计:

三、关键算法和实现细节

(1)棋盘的表示:

(2)判断胜利:

(3)玩家输入:

(4)棋盘显示:

(5)游戏结束和重新开始:

四、程序实现

(1)类设计:

(2)主函数:

五、实验代码

六、实验总结


一、实验目的

(1)简介:

        五子棋是一种两人对弈的棋类游戏,旨在在一个棋盘上先形成一行、一列或一条对角线上连续的五颗棋子。本实验中,我们将使用C++编程语言实现一个基于控制台的五子棋游戏,其中包括棋盘的显示、玩家的输入和游戏规则的判断。

        本实验报告将详细介绍五子棋游戏的设计思路、关键算法和程序实现。

(2)目的:

        本实验旨在使用C++编程语言实现经典的五子棋游戏。通过该实验,我们可以深入理解面向对象编程的概念和C++语言的基本特性,并将其应用于游戏的设计和实现中。

二、设计思路

(1)棋盘设计:

        使用二维数组表示棋盘,每个元素代表一个交叉点的状态。

        利用ASCII字符绘制棋盘的外观,并在合适的位置显示棋子。

(2)游戏流程:

        初始化棋盘和游戏状态。

        交替进行玩家输入,根据输入的坐标在棋盘上放置棋子。

        每次落子后,判断是否形成连续的五颗棋子,若有则游戏结束,否则继续进行下一轮。

        在每轮结束后判断是否出现平局。

        根据游戏结果显示胜利方或平局信息,并询问是否再次进行游戏。

(3)算法设计:

        判断胜利:通过遍历棋盘中的每个点,检查其水平、垂直和对角线方向上是否有连续的五颗相同颜色的棋子。

        输入合法性检查:检查玩家输入的坐标是否在棋盘范围内,且该位置是否为空。

三、关键算法和实现细节

(1)棋盘的表示:

        使用二维数组board来表示棋盘,其中每个元素可以取三个值:0表示空位,1表示玩家1的棋子,2表示玩家2的棋子。

(2)判断胜利:

        编写isWin函数,遍历棋盘中的每个点,检查其水平、垂直和对角线方向上是否有连续的五颗相同颜色的棋子。

(3)玩家输入:

        利用cin获取玩家输入的坐标,检查输入的合法性。

(4)棋盘显示:

        利用ASCII字符绘制棋盘的外观,并在合适的位置显示棋子。

(5)游戏结束和重新开始:

        判断胜利方或平局后,显示游戏结果,并询问玩家是否重新开始游戏。

四、程序实现

(1)类设计:

        Chessboard类:封装棋盘相关的属性和方法,如棋盘状态、棋盘显示、判断胜利等。

        Game类:封装游戏相关的属性和方法,如游戏流程、玩家输入、游戏结果判断等。

(2)主函数:

        创建Game对象,启动游戏。

五、实验代码

#include <iostream>
using namespace std;
const int BOARD_SIZE = 15;
const char EMPTY = ' ';
const char PLAYER1 = 'X';
const char PLAYER2 = 'O';
class Chessboard {
private:
    char board[BOARD_SIZE][BOARD_SIZE];

public:
    Chessboard() {
        // 初始化棋盘
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                board[i][j] = EMPTY;
            }
        }
    }
    void displayBoard() {
        // 显示棋盘
        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 row, int col, char player) {
        // 下棋
        if (row < 0 || row >= BOARD_SIZE || col < 0 || col >= BOARD_SIZE || board[row][col] != EMPTY) {
            return false;
        }
       
        board[row][col] = player;
        return true;
    }
    bool isWin(char player) {
        // 判断胜利
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                if (board[i][j] == player) {
                    // 水平方向
                    if (j + 4 < BOARD_SIZE &&
                        board[i][j + 1] == player &&
                        board[i][j + 2] == player &&
                        board[i][j + 3] == player &&
                        board[i][j + 4] == player) {
                        return true;
                    }
                    // 垂直方向
                    if (i + 4 < BOARD_SIZE &&
                        board[i + 1][j] == player &&
                        board[i + 2][j] == player &&
                        board[i + 3][j] == player &&
                        board[i + 4][j] == player) {
                        return true;
                    }                
                    // 对角线方向
                    if (i + 4 < BOARD_SIZE && j + 4 < BOARD_SIZE &&
                        board[i + 1][j + 1] == player &&
                        board[i + 2][j + 2] == player &&
                        board[i + 3][j + 3] == player &&
                        board[i + 4][j + 4] == player) {
                        return true;
                    }
                    // 反对角线方向
                    if (i + 4 < BOARD_SIZE && j - 4 >= 0 &&
                        board[i + 1][j - 1] == player &&
                        board[i + 2][j - 2] == player &&
                        board[i + 3][j - 3] == player &&
                        board[i + 4][j - 4] == player) {
                        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] == EMPTY) {
                    return false;
                }
            }
        }
        return true;
    }
};
class Game {
private:
    Chessboard board;
    char currentPlayer;

public:
    Game() {
        currentPlayer = PLAYER1;
    }
    void startGame() {
        cout << "Welcome to the Five in a Row Game!" << endl;
        cout << "Player 1: " << PLAYER1 << endl;
        cout << "Player 2: " << PLAYER2 << endl;
        cout << "Let's begin!" << endl;
        while (true) {
            board.displayBoard();
            int row, col;
            cout << "Player " << currentPlayer << ", enter your move (row col): ";
            cin >> row >> col;
            if (board.makeMove(row, col, currentPlayer)) {
                if (board.isWin(currentPlayer)) {
                    cout << "Player " << currentPlayer << " wins!" << endl;
                    break;
                } else if (board.isBoardFull()) {
                    cout << "It's a tie!" << endl;
                    break;
                } else {
                    currentPlayer = (currentPlayer == PLAYER1) ? PLAYER2 : PLAYER1;
                }
            } else {
                cout << "Invalid move. Try again." << endl;
            }
        }

        cout << "Thanks for playing!" << endl;
    }
};

int main() {
    Game game;
    game.startGame();
    return 0;
}

六、实验总结

        通过编译和运行程序,我们可以在控制台上看到五子棋游戏的界面,并能够进行玩家输入、判断胜负和重新开始游戏。

        通过本次实验,我成功实现了五子棋游戏的C++版本,掌握了面向对象编程的基本概念和C++语言的基本特性。在实现过程中,我们深入理解了棋盘的表示和算法设计,并通过合适的类的设计和方法的封装,使得程序结构清晰、可读性高。通过实验,我们进一步熟悉了C++编程语言的应用,并提升了问题分析和解决的能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值