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

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

    

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

image.png


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


第一个类是棋子类:

image.png

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


第二个类是玩家类:

image.png

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

image.png

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


第三个类是游戏类:

image.png

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

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


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

image.png

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


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

image.png

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


源码地址:https://www.fearlazy.com/index.php/76.html


演示站
上一篇:Qt如何实现拖拽功能?
下一篇:Qt 提示错误LNK1104:无法打开文件”xxx.lib“

发表评论