QT实现五子棋(附源码)


    以上是自己写的五子棋的效果图。
    这个五子棋没有AI,只是很简单的绘图和判断五子相连功能。
    下面来说一下实现五子棋的主要思想。
    我们需要几个变量,用来存储当前的相关信息。首先一个是棋盘布局的二维数组chessBoard[N][N],棋盘有几行几列,N的值就是这个,这个变量用来还原当前棋盘布局,用+1 和 -1 分别表示黑子和白子,用0表示当前位置无子。其次是棋子列表chess[N*N][3],这个数组存储的是所有的棋子的信息,记录哪一行哪一列存储的是黑子还是白子。这个变量不用也行,用了可能会稍微方便一些。还有一个就是chessNum,这个整形数用来记录当前下了多少个子了,那么我们可以根据这个来计算下一个子是什么颜色了。
    首先,就是要绘制一个棋盘,一个棋盘的绘制就是用绘图事件结构voidMainWindow::paintEvent(QPaintEvent*) 这个事件结构用来绘制棋盘,包括横线竖线和棋子。
    然后就是棋子绘制,这里用到的就是鼠标按键事件了 voidMainWindow::mousePressEvent(QMouseEvent*mouseEvent) 。这里呢,首先要判断鼠标按键的位置是否在棋盘内,鼠标按键在边框上也会产生鼠标事件,判断在棋盘内之后,再去判断当前位置能不能下子。能不能下子的条件有:1.这个地方没有子;2.这个地方在横竖交叉之处。对于2这个条件,可以这样判断,当前点和最近的横竖交叉点之间的距离是否少于一个定值。如果完全是相等,估计很难做到,所以下子的位置跟实际位置相差不大就可以确定要下子的位置了。
    每次有鼠标事件的时候,判断当前该不该下子,该下什么颜色的子,然后更新相关数据,重新绘制棋盘。之后就是判断五子连线了。每次重新绘图完成之后,就去判断刚下的那颗子能不能构成五子相连。网上找了资料,没有特别好的判断五子相连的方法,于是采用了最笨的方法,枚举,判断该子与刚下的子与其周围的子是否能连成五个。其实总共也就二十种情况,写完一种,剩下的复制一下,改几个数据就好了,写起来也挺快的。
    如果判断当棋子数量已经达到N*N了,也就是占据整个棋盘了,就判断流局,比赛结束。如果有一方赢了,比赛结束。这两种情况都弹出对话框,Again or Exit。当选择Again的时候,就把所有数据清空,若是选择Exit则退出。

源码下载链接:http://download.csdn.net/detail/love_ljq/9525797




原创文章 26 获赞 35 访问量 6万+

猜你喜欢

转载自blog.csdn.net/love_ljq/article/details/51407920