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

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

在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);
}

程序界面

打开程序