C++ Qt实现经典五子棋小游戏(双人游戏,人机大战)

原创,转载请注明出处。
这里用Qt实现了五子棋,可进行双人游戏,人机对战,悔棋等操作,是C++,Qt的必备练手项目,界面设置如下图:
在这里插入图片描述
添加三个类,分别为游戏总控制类gamewidget 、界面类boardwidget和AI控制类gomokuai。代码分别如下:

boardwidget.h:

#ifndef BOARDWIDGET_H
#define BOARDWIDGET_H

#include <QWidget>
#include <QStack>
#include <QPoint>
#include <QSet>

typedef int (*Board)[15];

class BoardWidget : public QWidget
{
   
    Q_OBJECT
public:
    explicit BoardWidget(QWidget *parent = nullptr);

    //设置棋盘控件接受的下棋方,在ai模式中只接受白色方,双人模式中都接受
    void setReceivePlayers(const QSet<int> &value);
    //获取棋盘信息
    Board getBoard();

protected:
    void paintEvent(QPaintEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);

private:
    //初始化棋盘控件
    void initBoard();
    //切换下一位下棋者
    void switchNextPlayer();
    //检查是否有获胜方,或者平局
    void checkWinner();
    //判断从(x, y)处开始,是否有五个同色棋子在一条线上
    bool isFivePieceFrom(int x, int y);
    //判断从(x, y)处开始,向下是否有五个同色棋子
    bool isVFivePieceFrom(int x, int y);
    //判断从(x, y)处开始,向下是否有五个同色棋子
    bool isHFivePieceFrom(int x, int y);
    //判断从(x, y)处开始,右上方向是否有五个同色棋子
    bool isFSFivePieceFrom(int x, int y);
    //判断(x, y)处开始, 右下方向是否有五个同色棋子
    bool isBSFivePieceFrom(int x, int y);

signals:
    void gameOver(int winner);
    void turnNextPlayer(int player);

public slots:
    //清除棋盘信息,开始新游戏
    void newGame();
    //落子
    void downPiece(int x, int y);
    void undo(int steps);	//悔棋

public:
    static const QSize WIDGET_SIZE;         //棋盘控件大小
    static const QSize CELL_SIZE;           //棋盘单元格大小
    static const QPoint START_POS;          //棋盘单元格开始位置
    static const QPoint ROW_NUM_START;      //行标号开始位置
    static const QPoint CLU_NUM_START;      //列标号开始位置
    static const int BOARD_WIDTH = 15;      //棋盘列数
    static const int BOARD_HEIGHT = 15;     //棋盘行数
    static const int NO_PIECE = 0;          //棋子标志,表示无子
    static const int WHITE_PIECE = 1;       //棋子标志, 表示白子
    static const int BLACK_PIECE = 2;       //棋子标志,表示黑子
    static const bool WHITE_PLAYER = true;  //棋手标志, 表示白方
    static const bool BLACK_PLAYER = false; //棋手标志, 表示黑方

    void setTrackPos(const QPoint &value);  //设置当前鼠标所在棋盘中的位置

private:
    bool endGame;                               //游戏是否结束标志
    int board[BOARD_WIDTH][BOARD_HEIGHT];       //棋盘信息
    int nextPlayer;                             //表示下一位棋手
    QPoint trackPos;                            //记录鼠标在棋盘中的位置
    QVector<QPoint> winPoses;                   //获胜的五子位置
    QSet<int> receivePlayers;                   //棋盘接受点击下棋的棋手
    QStack<QPoint> dropedPieces;                //每一步落子位置
};

#endif // BOARDWIDGET_H

boardwidget.cpp:

#include "boardwidget.h"
#include <QPainter>
#include <QMouseEvent>
#include <QFile>
#include <QDataStream>

/*类静态数据成员定义*/
const QSize BoardWidget::WIDGET_SIZE(430, 430);
const QSize BoardWidget::CELL_SIZE(25, 25);
const QPoint BoardWidget::START_POS(40, 40);
const QPoint BoardWidget::ROW_NUM_START(15, 45);
const QPoint BoardWidget::CLU_NUM_START(39, 25);
const int BoardWidget::BOARD_WIDTH;
const int BoardWidget::BOARD_HEIGHT;
const int BoardWidget::NO_PIECE;
const int BoardWidget::WHITE_PIECE;
const int BoardWidget::BLACK_PIECE;
const bool BoardWidget::WHITE_PLAYER;
const bool BoardWidget::BLACK_PLAYER;

BoardWidget::BoardWidget(QWidget *parent) :
    QWidget(parent),
    trackPos(28, 28)
{
   
    setFixedSize(WIDGET_SIZE);
    setMouseTracking(true);

    initBoard();
}

void BoardWidget::paintEvent(QPaintEvent *event)
{
   
    QPainter painter(this);
    painter.fillRect(0, 0, width(), height(), Qt::lightGray);	//背景颜色

    for (int i = 0; i < BOARD_WIDTH; i++)
    {
   
        painter.drawText(CLU_NUM_START + QPoint(i * CELL_SIZE.width(), 0),
                         QString::number(i + 1));
    }
    for (int i = 0; i < BOARD_HEIGHT; i++)
    {
   
        painter.drawText(ROW_NUM_START + QPoint(0, i * CELL_SIZE.height()),
                         QString::number(i + 1));
    }

    for (int i = 0; i < BOARD_WIDTH - 1; i++)	//绘制棋盘格子
    {
   
        for (int j = 0; j < BOARD_HEIGHT - 1; j++)
        {
   
            painter.drawRect(QRect(START_POS + QPoint(i * CELL_SIZE.width(), j * CELL_SIZE.height()),
                                   CELL_SIZE));
        }
    }

    painter.setPen(Qt::red);
    QPoint poses[12] = {
   
        trackPos + QPoint(0, 8),
        trackPos,
        trackPos + QPoint(8, 0),
        trackPos + QPoint(17, 0),
        trackPos + QPoint(25, 0),
        trackPos + QPoint(25, 8),
        trackPos + QPoint(25, 17),
        trackPos + QPoint(25, 25),
        trackPos + QPoint(17, 25),
        trackPos + QPoint(8, 25),
        trackPos + QPoint(0, 25),
        trackPos + QPoint(0, 17)
    };
    painter.drawPolyline(poses, 
  • 10
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
根据提供的引用内容,可以看出这是一个关于五子棋人机对战的C++代码。其中包含了Chess.h和Man.h两个头文件,分别定义了Chess和Man类。在main函数中,通过创建Chess、Man和AI对象,并将它们传递给ChessGame对象来实现游戏的初始化和进行。在ChessGame的构造函数中,通过调用AI对象的init方法来初始化AI,并传递Chess对象作为参数。 以下是一个简单的示例代码,展示了五子棋人机对战的基本实现: ```cpp #include <iostream> #include "Chess.h" #include "Man.h" #include "AI.h" #include "ChessGame.h" int main() { Chess chess; Man man; AI ai; ChessGame game(&man, &ai, &chess); game.play(); return 0; } ``` 在这个示例中,我们通过创建Chess、Man和AI对象,并将它们传递给ChessGame对象来初始化游戏。然后,调用ChessGame对象的play方法来开始游戏。在ChessGame的构造函数中,通过调用AI对象的init方法来初始化AI,并传递Chess对象作为参数。这样,人机对战的五子棋游戏就可以开始了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++五子棋人机对战](https://blog.csdn.net/pzjdoytt/article/details/125198101)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值