【C++游戏开发-五子棋】

时间:2025-02-18 17:21:49

使用C++开发五子棋游戏的详细实现方案,涵盖核心逻辑、界面设计和AI对战功能:

1. 项目结构

FiveChess/
├── include/
│ ├── Board.h // 棋盘类
│ ├── Player.h // 玩家类
│ ├── AI.h // AI类
│ └── Game.h // 游戏主逻辑
├── src/
│ ├── Board.cpp // 棋盘实现
│ ├── Player.cpp // 玩家实现
│ ├── AI.cpp // AI实现
│ ├── Game.cpp // 游戏主逻辑实现
│ └── main.cpp // 程序入口
├── CMakeLists.txt // CMake构建文件
└── README.md // 项目说明

2. 核心类设计

2.1 棋盘类(Board.h)

#ifndef BOARD_H
#define BOARD_H

#include <vector>
#include <iostream>

class Board {
public:
    static const int SIZE = 15; // 棋盘大小
    Board();
    void display() const; // 显示棋盘
    bool placeStone(int x, int y, int player); // 落子
    bool checkWin(int x, int y) const; // 检查是否胜利
    bool isFull() const; // 棋盘是否已满
    int getCell(int x, int y) const; // 获取棋盘格状态

private:
    std::vector<std::vector<int>> grid; // 棋盘网格
    bool checkDirection(int x, int y, int dx, int dy) const; // 检查方向
};

#endif

2.2 玩家类(Player.h)

#ifndef PLAYER_H
#define PLAYER_H

class Player {
public:
    Player(int id);
    int getId() const;
    virtual void makeMove(Board& board) = 0; // 落子方法

protected:
    int id; // 玩家ID(1或2)
};

#endif

2.3 AI类(AI.h)

#ifndef AI_H
#define AI_H

#include "Player.h"
#include "Board.h"

class AI : public Player {
public:
    AI(int id);
    void makeMove(Board& board) override;

private:
    int evaluate(const Board& board) const; // 评估函数
    int minimax(Board& board, int depth, bool isMaximizing, int alpha, int beta); // Minimax算法
};

#endif

2.4 游戏类(Game.h)

#ifndef GAME_H
#define GAME_H

#include "Board.h"
#include "Player.h"

class Game {
public:
    Game();
    void start(); // 开始游戏

private:
    Board board;
    Player* player1;
    Player* player2;
    int currentPlayer;
    void switchPlayer(); // 切换玩家
};

#endif

3. 核心逻辑实现

3.1 棋盘类实现(Board.cpp)

#include "Board.h"
#include <iostream>

Board::Board() : grid(SIZE, std::vector<int>(SIZE, 0)) {}

void Board::display() const {
    std::cout << "  ";
    for (int i = 0; i < SIZE; ++i) std::cout << i % 10 << " ";
    std::cout << "\n";

    for (int i = 0; i < SIZE; ++i) {
        std::cout << i % 10 << " ";
        for (int j = 0; j < SIZE; ++j) {
            std::cout << (grid[i][j] == 0 ? "." : (grid[i][j] == 1 ? "X" : "O")) << " ";
        }
        std::cout << "\n";
    }
}

bool Board::placeStone(int x, int y, int player) {
    if (x < 0 || x >= SIZE || y < 0 || y >= SIZE || grid[x][y] != 0) return false;
    grid[x][y] = player;
    return true;
}

bool Board::checkWin(int x, int y) const {
    int directions[4][2] = {{1, 0}, {0, 1}, {1, 1}, {1, -1}};
    for (auto& dir : directions) {
        if (checkDirection(x, y, dir[0], dir[1]) + checkDirection(x, y, -dir[0], -dir[1]) >= 4)
            return true;
    }
    return false;
}

bool Board::checkDirection(int x, int y, int dx, int dy) const {
    int count = 0;
    int player = grid[x][y];
    while (x >= 0 && x < SIZE && y >= 0 && y < SIZE && grid[x][y] == player) {
        count++;
        x += dx;
        y += dy;
    }
    return count - 1;
}

bool Board::isFull() const {
    for (const auto& row : grid)
        for (int cell : row)
            if (cell == 0) return false;
    return true;
}

int Board::getCell(int x, int y) const {
    return grid[x][y];
}

3.2 AI类实现(AI.cpp)

#include "AI.h"
#include <algorithm>

AI::AI(int id) : Player(id) {}

void AI::makeMove(Board& board) {
    int bestScore = -1000;
    int bestX = -1, bestY = -1;

    for (int i = 0; i < Board::SIZE; ++i) {
        for (int j = 0; j < Board::SIZE; ++j) {
            if (board.getCell(i, j) == 0) {
                board.placeStone(i, j, id);
                int score = minimax(board, 3, false, -1000, 1000);
                board.placeStone(i, j, 0); // 撤销落子
                if (score > bestScore) {
                    bestScore = score;
                    bestX = i;
                    bestY = j;
                }
            }
        }
    }

    board.placeStone(bestX, bestY, id);
}

int AI::evaluate(const Board& board) const {
    // 简单评估函数
    return 0;
}

int AI::minimax(Board& board, int depth, bool isMaximizing, int alpha, int beta) {
    if (depth == 0) return evaluate(board);

    if (isMaximizing) {
        int maxEval = -1000;
        for (int i = 0; i < Board::SIZE; ++i) {
            for (int j = 0; j < Board::SIZE; ++j) {
                if (board.getCell(i, j) == 0) {
                    board.placeStone(i, j, id);
                    int eval = minimax(board, depth - 1, false, alpha, beta);
                    board.placeStone(i, j, 0);
                    maxEval = std::max(maxEval, eval);
                    alpha = std::max(alpha, eval);
                    if (beta <= alpha) break;
                }
            }
        }
        return maxEval;
    } else {
        int minEval = 1000;
        for (int i = 0; i < Board::SIZE; ++i) {
            for (int j = 0; j < Board::SIZE; ++j) {
                if (board.getCell(i, j) == 0) {
                    board.placeStone(i, j, 3 - id);
                    int eval = minimax(board, depth - 1, true, alpha, beta);
                    board.placeStone(i, j, 0);
                    minEval = std::min(minEval, eval);
                    beta = std::min(beta, eval);
                    if (beta <= alpha) break;
                }
            }
        }
        return minEval;
    }
}

4. 主程序(main.cpp)

#include "Game.h"

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

5. 编译与运行

CMake配置(CMakeLists.txt)

cmake_minimum_required(VERSION 3.10)
project(FiveChess)

set(CMAKE_CXX_STANDARD 17)

include_directories(include)
file(GLOB SOURCES "src/*.cpp")

add_executable(FiveChess ${SOURCES})

编译与运行

mkdir build
cd build
cmake ..
make
./FiveChess

6. 扩展功能

图形界面:使用SFML或SDL2替换控制台界面。

网络对战:集成Socket实现多人对战。

AI优化:引入Alpha-Beta剪枝、启发式搜索等优化算法。

通过以上实现,您可以快速开发一个功能完整的五子棋游戏!