龙空技术网

无聊用Qt写个五子棋(一)

程序员fearlazy 366

前言:

眼前大家对“五子棋ai算法源码”大体比较着重,同学们都想要知道一些“五子棋ai算法源码”的相关知识。那么小编同时在网络上收集了一些有关“五子棋ai算法源码””的相关知识,希望我们能喜欢,我们快快来学习一下吧!

五子棋是小时候玩的比较多的一种游戏。规则也比较简单,谁先将5个棋子连成一条线谁就赢了。

由于不想花费太多的时间,所以目标只是写一个最简单的五子棋程序,最终效果如下:

五子棋的数据结构只需要一个二维数组就够了。不过我这里并没有用二维数组,而是定义了三个类。

第一个类是棋子类:

一个Piece表示一个棋子,这里只有坐标属性,可以根据需要增加颜色、大小等属性。 重载了== 用来判断两个棋子是否在同一个坐标上。

第二个类是玩家类:

玩家的属性有名字、是否为白棋和棋子列表。 函数addPiece表示玩家下一个棋子,返回true表示下了该棋后至少有5个棋子成线了。代码如下:

分别获取新棋子水平、垂直和斜线方向上连续的棋子,如果大于3(也就是4个)再加上新棋子就有五个了。getHorizontalPieces、getVerticalPieces、getSlopPieces和getReverseSlopePieces获取棋子的思路是类似的,就是以新棋子为中心,按照一定的偏移量去遍历,直到遍历的位置没有棋子时停止。

第三个类是游戏类:

这个类是不是一个纯粹的游戏类,它把绘制(界面)、逻辑和交互混在一起了。因为懒。

成员变量m_player1和m_player2表示两个玩家,m_chessboard_row和m_chessboard_col分别表示棋盘的行和列。m_isPre1用于区分该谁下棋了。m_drawArea用来控制绘制的区域。

游戏的绘制在paintEvent中进行,绘制的关键就在于将游戏中的坐标值转换为界面上的坐标值,关键代码如下:

x坐标值为绘制区域的x值加上游戏x坐标乘以水平方向上每小格的宽度。y坐标值同理。

游戏的交互在鼠标按下事件中进行,它刚好和绘制相反,需要将界面上的坐标值转换为游戏中的坐标,关键代码如下:

转换思路和paintEvent中是相反的,只不过鼠标一般不会刚好点到棋盘中棋子的中心位置,所以多了一个判断棋子离哪个格子更近一些。小数点后数字大于0.5则游戏坐标加1即可。

源码地址:头条不让加链接地址

标签: #五子棋ai算法源码