使用C++ MFC编写一个简单的五子棋游戏程序分享!

MFC简介:

  MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数。 MFC除了是一个类库以外,还是一个框架,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll。xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西,但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率。但是MFC的封装很浅,所以效率上损失不大。

开始正文

简述

在学习了C++ MFC编程后,就萌生了编写一个五子棋程序的想法。诚然,用C#来编写的话可能界面会好很多,但是我的主要目标不在界面而是算法,所以利用了VS的MFC来编写程序。

程序特点

程序实现

完整代码可访问我的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://www.ctvol.com/c-cdevelopment/483867.html

(0)
上一篇 2020年11月10日
下一篇 2020年11月10日

精彩推荐