欢迎大家关注/订阅我的微信公众号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