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则退出。

 

→→→源码下载

 

刚学习vc++,下载了些源码,这是我下载到的最好的一个版本啦~~~~~~~~~ 不好意思,发的是原文件,有点小问题: 首先声明这是VC.net 的解决方案(所以楼上有朋友说没有看见VC++6.0的的WorkSpace(.dsw……) 原文件是老版本的,打开的时候可能会提醒你转换~~ +作者设置了只读属性,建议先把只读属性去除…… 据说是 vc2005 的语法检查更加的严格了,所以会有一些 warning ~~~~~可以忽略的…… 另外还是会有一个错误……如下: 如果直接打开的话我这里的vc.net2005 提示: “ --- 已启动生成: 项目: Pente, 配置: Debug Win32 ------ 正在编译... StdAfx.cpp WINVER not defined. Defaulting to 0x0502 (Windows Server 2003) 正在编译... SetupDlg.cpp RecordDlg.cpp PenteDlg.cpp c:\documents and settings\kjl801\桌面\vc.net 五子棋源码\pentedlg.cpp(45) : warning C4101: 'szVer' : unreferenced local variable Pente.cpp c:\documents and settings\kjl801\桌面\vc.net 五子棋源码\pente.cpp(53) : error C3861: 'Enable3dControls': identifier not found HelperAPI.cpp c:\documents and settings\kjl801\桌面\vc.net 五子棋源码\helperapi.cpp(14) : warning C4996: 'strcat' was declared deprecated e:\visual studio 2005\vc\include\string.h(78) : see declaration of 'strcat' Message: 'This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.' Dib.cpp c:\documents and settings\kjl801\桌面\vc.net 五子棋源码\dib.cpp(537) : warning C4244: '=' : conversion from 'ULONGLONG' to 'DWORD', possible loss of data BestDlg.cpp AboutDlg.cpp Generating Code... 生成日志保存在“file://c:\Documents and Settings\kjl801\桌面\vc.net 五子棋源码\Debug\BuildLog.htm” Pente - 1 个错误,3 个警告 ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ========== ” 我的解决方法是把下面这一段注释掉就Ok了: /* #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif */ // 这一部分在vc6.0 的MFC新建的工程里面 经常看见……可能是版本不支持的原因导致的…… 修改后可能会提示你 原文件是只读的……点击“ 改写” 就是了 ……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值