介绍
这期内容当中小编将会给大家带来有关利用Qt实现一个简单的五子棋小游戏,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
下图为<强>游戏主窗口页面:强>
<强>第一步:强>窗口绘图的实现(QPaintEvent绘图事件和QMouseEvent鼠标事件)
①鼠标事件(这里我的是mouseDoubleClickEvent()双击事件)
空白GamePage: mouseDoubleClickEvent (QMouseEvent *事件)//鼠标双击事件 { m_dx=事件→x (); m_dy=事件→y ();//避免乱点时存入坐标需添加:标志符——》游戏状态坐标的界限(点) 如果(m_dx & lt;POINT_X_MAX,,m_dy & lt;POINT_Y_MAX,,m_bRunState==true) {//如果点在交叉点周围则设置点在交叉点上(判断点位置) QPointF newPoint (gainPointPosition (QPointF (m_dx m_dy))); 如果(! m_VectorRedPoint.contains (newPoint),, ! m_VectorBlackPoint.contains (newPoint))//判断点是否已经存在 { 如果(m_iFlagWho==0)//红棋 { m_VectorRedPoint.append (newPoint); m_iFlagWho=1; }//其他黑棋 { m_VectorBlackPoint.append (newPoint); m_iFlagWho=0; } } } }
在这里窗口网格图是通过直接绘画以及鼠标双击选择坐标来存储棋子和绘画棋子,因此对点进行了一个设置位置函数以便处于两线之间的交接处,代码如下:
QPointF GamePage:: gainPointPosition (QPointF srcPoint)//返回一个处于格子两线交接处的坐标点 { QPointF tmp; for (int i=0;我& lt;12,我+ +) { 如果(srcPoint.x()在=50 *我,,srcPoint.x () & lt;=(50 *我+ 25))//X判断 { tmp.setX(50 *我);//如果处于50 * 50 * ~我+ 25)之间则设置点坐标点为50 *我 } else if (srcPoint.x()在=(50 *我+ 25),,srcPoint.x () & lt;=50 * (i + 1)) { tmp.setX (50 * (i + 1));//如果处于我+ 25 ~ 50 * 50 * (i + 1)之间则设置点坐标点为50 * (i + 1) } 如果(srcPoint.y()在=50 *我,,srcPoint.y () & lt;=(50 *我+ 25))//Y判断 { tmp.setY(50 *我);//同上 } else if (srcPoint.y()在=(50 *我+ 25),,srcPoint.y () & lt;=50 * (i + 1)) { tmp.setY (50 * (i + 1));//同上 } } 返回tmp; }
②绘图事件(主要是网格图,黑棋,红棋的绘画)
棋子坐标的存储主要是通过QVector容器来实现,并对容器进行迭代循环绘图,实现代码如下:
空白GamePage: paintEvent (QPaintEvent *事件)//绘画事件 { QPainter *佩特=new QPainter(这个); 佩特→开始(这个);//网格图 佩特→setPen (Qt:黑色); for (int i=0;我& lt;=12;我+ +) { 佩特→画直线(0 50 *我600年,50 *我); 佩特→画直线(50 *我,0,50 *我,600); }//红色棋绘画 QVector<强>第二步:>强输赢的计算
上图列出了计算的关系规律、下面就用代码分别实现三个不同方向的计算:
①横向
bool GamePage:: checkXPointF (QVector向量)//检查X轴方向的 { int num_L=1; int num_R=1; QVector 利用Qt实现一个简单的五子棋小游戏