十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章主要介绍了如何使用C++中MFC编写五子棋游戏程序,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
创新互联建站服务项目包括通山网站建设、通山网站制作、通山网页制作以及通山网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,通山网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到通山省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!MFC简介:
MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数。 MFC除了是一个类库以外,还是一个框架,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll。xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西,但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率。但是MFC的封装很浅,所以效率上损失不大。
开始正文
简述
在学习了C++ MFC编程后,就萌生了编写一个五子棋程序的想法。诚然,用C#来编写的话可能界面会好很多,但是我的主要目标不在界面而是算法,所以利用了VS的MFC来编写程序。
程序特点
鼠标移动过程中有选中框跟随,下棋位置实时自动反馈
选中框位置只会在合法的下棋位置出现(即棋线的交叉处并且没有下过的位子),所以即使你的鼠标不在棋线交叉处,程序也会实时自动反馈鼠标在当前位置将要下棋的位置,这避免了下棋过程中的错下。
提供悔棋功能
为了进一步避免错下,提高程序的可用性,本程序还设计了一个悔棋按钮(程序设置大悔棋次数为1次)
提供多种棋盘大小
标准的五子棋棋盘为15x15,为了提供更多样的棋盘大小,本程序还设有17x17和19x19两种非常规棋盘。
提供复盘功能
在棋局结束后,程序会给出棋局的复盘结果,可以从中分析出棋局胜败的原因。
解决了MFC绘图窗口移出屏幕图像消失的问题
你可以在完整代码中看到解决刷新问题的解决方案
代码较为基础,只需要掌握基础的MFC编程知识就可以自己实现
因为本人也是编程小白,算法设计比较基础和简单,只掌握基础的C++编程知识就可以看懂代码
程序实现
完整代码可访问我的github: https://github.com/Vaczzy/SimpleGobang
step1:在VS中创建一个MFC对话框程序工程。
(创建好后可以直接将我提供的源码复制到工程中即可运行,如遇问题可以下方留言)
step2:新建一个名为CMainGobang的类,在类中编写主要代码
下面给出了MainGobang.h头文件中的全部代码:
struct Pieces//棋子判断单元 { bool bIsPieces;//是否已有棋 bool bIsBlack;//黑棋或白棋 int x,y;//棋子所在格 }; struct MyRectangle { int x,y;//选中框核心坐标 }; public: CMainGobang(void); ~CMainGobang(void); private: /////basic information int iSize;//棋盘大小参数 int xmax,xmin,ymax,ymin;//棋盘大小参数 int idx;//棋盘每小格长度 /////pieces information int iPieces;//棋子计数//当前棋子计数为iPieces-1 int iPiecesNum;//棋子总数 Pieces *pPieces;//棋子 /////rectangle information int iRectangleNum;//选中框个数 MyRectangle *pmyRectangle;//选中框 /////for draw rectangle&draw pieces bool NoRectangle(int x,int y);//判断该位置上是否有选中框 bool NoPieces(int x,int y);//判断该位置上是否有棋子 /////for judge win bool IsBlack(int x,int y);//判断该位置上棋子颜色 bool IsConnect(int iDir,int x,int y);//查找相连的棋子 int ConnectNum();//返回相连棋子个数 /////for machine fight //void MaConnectNum(int iConnectNum,int iDir);//返回弱相连棋子个数/iDir方向参数 int ConnectDir();//返回相连棋子方向 public: void DrawMainTable(CDC *pDC,CRect rect,int iTableSize);//绘制棋盘函数 void SetPieces();//设参函数//将初始化代码与绘制棋盘代码分开 void DrawRectangle(CDC *pDC,CPoint pt);//绘制选中框/返回是否绘制 void DrawPieces(CDC *pDC,CRect rect,CPoint pt);//绘制棋子函数 bool ClearPieces(CDC *pDC,bool &bBlack);//清除棋子函数/用于悔棋 void KeepPieces(CDC *pDC,CRect rect,int iTableSize);//循环绘制棋子 //用以解决刷新问题 void MachineDraw(CDC *pDC);//机器下棋函数 bool Success();//判断胜利函数 void ReplayMark(CDC *pDC);//复盘标记函数
在MainGobang.cpp文件中添加函数实现
限于文章篇幅,这里只给出了绘制棋盘的函数实现以供参考,其他函数实现可访问:https://github.com/Vaczzy/SimpleGobang中MyGobang_DHK文件夹中MainGobang.cpp文件
CMainGobang::CMainGobang(void) {} CMainGobang::~CMainGobang(void) { if(pPieces!=NULL) { delete []pPieces; pPieces=NULL; } if(pmyRectangle!=NULL) { delete []pmyRectangle; pmyRectangle=NULL; } } //绘制棋盘函数 //后期可添加棋盘大小参数 //控件坐标 void CMainGobang::DrawMainTable(CDC *pDC,CRect rect,int iTableSize) { iSize=iTableSize; //先覆盖背景 CRect Back; Back.top=rect.top+1; Back.bottom=rect.bottom-1; Back.left=rect.left+1; Back.right=rect.right-1; pDC->FillSolidRect(&Back,RGB(240,240,240));//填充 //计算每格长度 idx=(((rect.right-rect.left)/(iTableSize+1))>((rect.bottom-rect.top)/(iTableSize+1)))? (rect.bottom-rect.top)/(iTableSize+1): (rect.right-rect.left)/(iTableSize+1); CBrush brush(RGB(0,0,0)); CBrush *OldBrush=pDC->SelectObject(&brush); int ixp,iyp;//棋盘星坐标 //绘制天元 ixp=(rect.right-rect.left)/2; iyp=(rect.bottom-rect.top)/2; pDC->Ellipse(ixp-3,iyp-3,ixp+3,iyp+3); //绘制星 ixp-=4*idx; iyp-=4*idx;//左上角 pDC->Ellipse(ixp-3,iyp-3,ixp+3,iyp+3); iyp+=8*idx;//左下角 pDC->Ellipse(ixp-3,iyp-3,ixp+3,iyp+3); ixp+=8*idx;//右下角 pDC->Ellipse(ixp-3,iyp-3,ixp+3,iyp+3); iyp-=8*idx;//右上角 pDC->Ellipse(ixp-3,iyp-3,ixp+3,iyp+3); pDC->SelectObject(OldBrush);//恢复设备环境中原来的画笔 brush.DeleteObject();//释放绘图资源 //计算棋盘大小并放置于窗口中间 ymin=(rect.bottom-rect.top)/2-(iTableSize-1)/2*idx; ymax=ymin+(iTableSize-1)*idx; xmin=(rect.right-rect.left)/2-(iTableSize-1)/2*idx; xmax=xmin+(iTableSize-1)*idx; for(int x=xmin;x<=xmax;x+=idx) { pDC->MoveTo(x,ymin); pDC->LineTo(x,ymax); } for(int y=ymin;y<=ymax;y+=idx) { pDC->MoveTo(xmin,y); pDC->LineTo(xmax,y); } }
step3:在xxxx(xxxx为你创建的工程名)Dlg.cpp中编写与界面有关的代码
这一步主要是编写一些与界面有关的代码
本程序的位置反馈主要添加在OnMouseMove函数中,如下:
限于文章篇幅,文件所有代码可访问:https://github.com/Vaczzy/SimpleGobang 中 MyGobang_DHK文件夹中MyGobang_DHKDlg.cpp文件
//鼠标移动函数 void CMyGobang_DHKDlg::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CPoint pt; CRect rect; GetDlgItem(IDC_MainTable)->GetWindowRect(&rect);//获取控件屏幕坐标 GetCursorPos(&pt);//获取鼠标点击坐标(屏幕坐标坐标) pt.x-=rect.left;//转化为控件中坐标 pt.y-=rect.top; CDC *pDC=picMain.GetDC();//获取该控件的画布 if(bIsReady) { gobang.DrawRectangle(pDC,pt); } CDialogEx::OnMouseMove(nFlags, point); }
程序界面
打开程序
棋局进行中
棋局结束
感谢你能够认真阅读完这篇文章,希望小编分享的“如何使用C++中MFC编写五子棋游戏程序”这篇文章对大家有帮助,同时也希望大家多多支持创新互联建站,关注创新互联网站建设公司行业资讯频道,更多相关知识等着你来学习!
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。