用C++开发的双人对战五子棋

欢迎大家关注/订阅我的微信公众号Code Art Online,我会在我的公众号分享个人见闻,发现生活趣味;这里不仅有0和1,还有是诗和远方↓↓↓

前言:有了用C++开发象棋及其AI的经验后,我就萌生了再用C++开发五子棋及其AI的想法。有了想法还等什么?付诸实施呗!

首先明确一盘五子棋需要什么属性:一盘五子棋有黑棋有白棋,与象棋不同的是,五子棋的棋子数目不是确定的,而是随着下棋随着增加的,所以,需要一个存放整盘棋棋子数目的整型变量num_of_Stone。五子棋下棋的有两方,黑方和白方,所以需要一个存放当前该谁走的布尔型变量_bBlackTurn,黑棋先行,顾名思义,初始化时应该将它的值置为true。还需要一个存放棋盘上存在的所有棋子的数组_s,由于不确定棋子的数目,所以将这个数组的类型设置为QVector<Stone>。此外,为了更方便地处理棋盘信息,再引入存放棋盘信息的二维数组map[15][15],将横竖撇捺四个方向上线段化之后形成的一维数组的集合L。

给大家看一下棋盘类:

#ifndef BOARD_H
#define BOARD_H

#include <QFrame>
#include "Stone.h"
#include "Step.h"
#include <QVector>
#include <QMouseEvent>
class Board : public QWidget
{
    Q_OBJECT
public:
    //棋盘类的构造函数
    explicit Board(QWidget *parent = 0);
    //棋盘类的析构函数
    ~Board();
    //棋子半径
    int _r;
    //棋子数目
    int num_of_stone;
    //存放所有棋子的数组
    QVector<Stone> _s;
    //是不是应该黑棋走
    bool _bBlackTurn;
    //棋盘地图
    int map[15][15];
    //线段化的棋盘信息
    struct
    {
        int line[15];
    }L[21+15+15+21];
    //画界面的函数
    void paintEvent(QPaintEvent *);
    //鼠标释放的响应函数
    void mouseReleaseEvent(QMouseEvent *);
    //点击屏幕上某个点的响应函数
    void click(QPoint pt);
    virtual void click(int id,int row,int col);
    //绘制棋子的函数
    void drawStone(QPainter& painter,int id);
    //判断行走是否合法的函数
    bool canMove(int row,int col);
    //走棋函数
    void moveStone(int moveid, int row, int col);
    //悔棋函数
    void reliveStone(int row,int col);
    //输入行列坐标获取棋子id的函数
    int getStoneId(int row,int col);
    //判断谁胜谁负的函数
    int whowin();

    //将棋盘信息线段化
    void turnLine();

    //保存棋子的行棋信息的函数
    void saveStep(int moveid, int row, int col, QVector<Step*>& steps);
    //获取用户点击位置的行列坐标的函数
    bool getRowCol(QPoint pt,int &row,int &col);
    //输入行列坐标返回像素坐标的函数
    QPoint center(int row,int col);
    //输入棋子的id 返回像素坐标
    QPoint center(int id);
};

#endif // BOARD_H

 

首先使用棋盘类的构造函数初始化棋盘信息:

Board::Board(QWidget *parent) : QWidget(parent)
{
    int i,j;
    //将棋子个数初始化为0
    num_of_stone=0;
    //黑棋先行
    _bBlackTurn=true;
    //初始化地图 二维数组的元素的值为-1代表该位置上没有棋子 值为0代表该位置上有黑棋 值为1代表该位置上有白棋
    for(i=0;i<15;i++)
        for(j=0;j<15;j++)
        {
            map[i][j]=-1;
        }
}

 

然后在paintEvent函数里绘制整个棋盘:

void Board::paintEvent(QPaintEvent *)
{
    //初始化画笔painter
    QPainter painter(this);
    //初始化棋子直径
    int d=30;
    //初始化棋子半径
    _r=d/2;
    //整盘棋局的胜负信息 flag=1时黑方胜利 flag=2时白方胜利
    int flag=whowin();
    if(flag==1)
    {
        //将画笔painter的颜色设置为黑色
        painter.setPen(Qt::black);
        painter.drawText(rect(), Qt::AlignCenter, QStringLiteral("黑方胜利!"));
    }
    else if(flag==2)
    {
        //将画笔painter的颜色设置为红色
        painter.setPen(Qt::red);
        painter.drawText(rect(), Qt::AlignCenter, QStringLiteral("白方胜利!"));
    }
    else
    {
        //画10条横线
        for(int i=1;i<=15;i++)
            painter.drawLine(QPoint(d,i*d),QPoint(15*d,i*d
  • 23
    点赞
  • 132
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值