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

2020-02-20 22:01:22王冬梅

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);//复盘标记函数