怎么使用c 中mfc编写五子棋游戏程序-亚博电竞手机版
怎么使用c 中mfc编写五子棋游戏程序
本篇内容介绍了“怎么使用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绘图窗口移出屏幕图像消失的问题
你可以在完整代码中看到解决刷新问题的亚博vip888的解决方案
代码较为基础,只需要掌握基础的mfc编程知识就可以自己实现
因为本人也是编程小白,算法设计比较基础和简单,只掌握基础的c 编程知识就可以看懂代码
程序实现
step1:在vs中创建一个mfc对话框程序工程。
(创建好后可以直接将我提供的源码复制到工程中即可运行,如遇问题可以下方留言)
step2:新建一个名为cmaingobang的类,在类中编写主要代码
下面给出了maingobang.h头文件中的全部代码:
structpieces//棋子判断单元{boolbispieces;//是否已有棋boolbisblack;//黑棋或白棋intx,y;//棋子所在格};structmyrectangle{intx,y;//选中框核心坐标};public:cmaingobang(void);~cmaingobang(void);private://///basicinformationintisize;//棋盘大小参数intxmax,xmin,ymax,ymin;//棋盘大小参数intidx;//棋盘每小格长度/////piecesinformationintipieces;//棋子计数//当前棋子计数为ipieces-1intipiecesnum;//棋子总数pieces*ppieces;//棋子/////rectangleinformationintirectanglenum;//选中框个数myrectangle*pmyrectangle;//选中框/////fordrawrectangle&drawpiecesboolnorectangle(intx,inty);//判断该位置上是否有选中框boolnopieces(intx,inty);//判断该位置上是否有棋子/////forjudgewinboolisblack(intx,inty);//判断该位置上棋子颜色boolisconnect(intidir,intx,inty);//查找相连的棋子intconnectnum();//返回相连棋子个数/////formachinefight//voidmaconnectnum(inticonnectnum,intidir);//返回弱相连棋子个数/idir方向参数intconnectdir();//返回相连棋子方向public:voiddrawmaintable(cdc*pdc,crectrect,intitablesize);//绘制棋盘函数voidsetpieces();//设参函数//将初始化代码与绘制棋盘代码分开voiddrawrectangle(cdc*pdc,cpointpt);//绘制选中框/返回是否绘制voiddrawpieces(cdc*pdc,crectrect,cpointpt);//绘制棋子函数boolclearpieces(cdc*pdc,bool&bblack);//清除棋子函数/用于悔棋voidkeeppieces(cdc*pdc,crectrect,intitablesize);//循环绘制棋子//用以解决刷新问题voidmachinedraw(cdc*pdc);//机器下棋函数boolsuccess();//判断胜利函数voidreplaymark(cdc*pdc);//复盘标记函数
在maingobang.cpp文件中添加函数实现
cmaingobang::cmaingobang(void){}cmaingobang::~cmaingobang(void){if(ppieces!=null){delete[]ppieces;ppieces=null;}if(pmyrectangle!=null){delete[]pmyrectangle;pmyrectangle=null;}}//绘制棋盘函数//后期可添加棋盘大小参数//控件坐标voidcmaingobang::drawmaintable(cdc*pdc,crectrect,intitablesize){isize=itablesize;//先覆盖背景crectback;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);cbrushbrush(rgb(0,0,0));cbrush*oldbrush=pdc->selectobject(&brush);intixp,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(intx=xmin;x<=xmax;x =idx){pdc->moveto(x,ymin);pdc->lineto(x,ymax);}for(inty=ymin;y<=ymax;y =idx){pdc->moveto(xmin,y);pdc->lineto(xmax,y);}}
step3:在xxxx(xxxx为你创建的工程名)dlg.cpp中编写与界面有关的代码
这一步主要是编写一些与界面有关的代码
本程序的位置反馈主要添加在onmousemove函数中,如下:
//鼠标移动函数voidcmygobang_dhkdlg::onmousemove(uintnflags,cpointpoint){//todo:在此添加消息处理程序代码和/或调用默认值cpointpt;crectrect;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编写五子棋游戏程序”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注恰卡编程网网站,小编将为大家输出更多高质量的实用文章!