如何使用C++中MFC编写五子棋游戏程序

发布时间:2021-06-15 15:43:34 作者:小新
来源:亿速云 阅读:192

这篇文章主要介绍了如何使用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://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编写五子棋游戏程序

棋局进行中

如何使用C++中MFC编写五子棋游戏程序

棋局结束

如何使用C++中MFC编写五子棋游戏程序

感谢你能够认真阅读完这篇文章,希望小编分享的“如何使用C++中MFC编写五子棋游戏程序”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

推荐阅读:
  1. xCode 编写C++程序
  2. MFC应用程序

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ mfc

上一篇:C#中怎么将Excel转成PDF

下一篇:使用C#怎么实现一个网络爬虫

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》