MFC设计五子棋完全代码.docx

上传人:b****5 文档编号:6374640 上传时间:2023-01-05 格式:DOCX 页数:18 大小:301.98KB
下载 相关 举报
MFC设计五子棋完全代码.docx_第1页
第1页 / 共18页
MFC设计五子棋完全代码.docx_第2页
第2页 / 共18页
MFC设计五子棋完全代码.docx_第3页
第3页 / 共18页
MFC设计五子棋完全代码.docx_第4页
第4页 / 共18页
MFC设计五子棋完全代码.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

MFC设计五子棋完全代码.docx

《MFC设计五子棋完全代码.docx》由会员分享,可在线阅读,更多相关《MFC设计五子棋完全代码.docx(18页珍藏版)》请在冰豆网上搜索。

MFC设计五子棋完全代码.docx

MFC设计五子棋完全代码

MFC程序设计

MFC制作五子棋

 

目录:

1.目的与要求……………………….….……..…….

2.主要功能………………………………………….

3.设计过程中的经验与教训……………………….

4.自己收获与不足……………………….………….

5.重要程序清单…………………………………….

6.窗口截图………………………………………….

 

1.目的与要求

利用已有的C++基础,结合对MFC的学习,进行窗口化设计。

由于MFC提供了MFCppWizard自动生成框架。

使得简单的编程更加简单,界面简洁。

这次用MFC设计了一个简单的五子棋游戏。

可以进行简单的双人对战。

目的在于更加熟悉MFC的使用来完成游戏的制作。

再此期间,搜集大量信息,以及函数的源代码。

不断进行整合,进行函数构造。

2主要功能

MFC的窗口更适合小型游戏的界面。

五子棋可以说是再简单不过的小游戏了,不过其中确包含了大量的函数实现游戏的正常运转。

若要是游戏顺利进行,必须要有程序约束游戏规则。

因此本游戏要解决,棋子所放位置的判断,棋子颜色的区分,以及玩家的输赢。

解决这些问题,玩家便可以进行一场二人大战了。

本游戏可以让两个玩家在标准的五子棋盘上进行游戏,最先连成五子者,游戏可以显示哪一方获胜。

最终的结果可以保存入文件夹。

3.设计过程中的经验与教训

本次游戏设计,所遇到的阻力比较大。

经过多次返工。

多次函数未能定义或实现。

整个设计过程所学的东西也很多。

以五子棋游戏为例。

首先要知道其基本规则,并设法用不同的函数来解决规则的限定。

设计过程中常常会出现函数已经构造,却未加定义的情况。

做本游戏时,查看了大量资料。

在棋盘的画法上有所纠结。

是直接将棋盘背景图直接加入还是调用函数进行棋盘绘制都是要考虑的。

经过多次尝试,不断进行函数的调试和界面图标的设计。

最终完成此次实验。

虽然多次返工,虽然有一天从早上做到第二天凌晨5点,但最终的成功,使这些都变成浮云。

不断尝试,永不放弃,最终一定成功。

4.自己收获与不足

此次实验初期,本计划完成一个比较优秀的作品,但最终多种原因没有达到预期理想的界面。

首先谈谈收获,个人认为此次MFC课程设计更适合简单游戏的设计。

五子棋的界面简单,相对规则也不多。

设计过程中,最大的收获要算程序的扩充,函数的调试。

其实MFC已给出框架,所要做的便是填充内容。

懂得了以位图的形式表示棋子,以cusor替换当前鼠标。

还有鼠标热点的设置。

在BOOLCMainFrame下构造函数以坐标的形式以改变棋盘大小。

同时构造出一系列画棋盘,判断鼠标,判断输赢等函数。

为函数添加数据成员并使其一一实现。

对相应菜单进行属性更改并进行消息映射,建立响应函数。

整个过程都得到了了解及应用。

同时,不足也很多,本游戏调用函数进行了棋盘绘制,使得界面过于简单。

由于时间,能力等问题,未能加入人工智能实现人机对战。

而且对于老师所给出的对话框的设计及应用也未能加入。

棋子的位图都是自己绘制,并不十分美观。

如果有充足的时间,我想这些一定会得到完善。

5.重要程序清单

构造函数

//两个鼠标

HCURSORhcursorwhite;

HCURSORhcursorblack;

//棋盘数组

intwzq[19][19];

//colorwhiteTRUE时白棋下,否则黑棋下

boolcolorwhite;

//棋子位图

CBitmapm_bmblack;

CBitmapm_bmwhite;

 

//保存文件

voidSave();

//检查是否结束

voidover(CPointpoint);

//鼠标操作

afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);

//鼠标图形更换

afx_msgBOOLOnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage);

//菜单的开始

afx_msgvoidOnStart();

//菜单的保存

afx_msgvoidOnSave();

//菜单的打开

afx_msgvoidOnOpen();

 

 

窗口设计

BOOLCMainFrame:

:

PreCreateWindow(CREATESTRUCT&cs)

{

if(!

CFrameWnd:

:

PreCreateWindow(cs))

returnFALSE;

//TODO:

ModifytheWindowclassorstylesherebymodifying

//theCREATESTRUCTcs

cs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST;//

cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;//;

//设置窗口大小:

400*340

cs.cx=450;

cs.cy=500;

returnTRUE;

棋盘与棋子的绘制

voidCMy3_1View:

:

OnDraw(CDC*pDC)

{

CMy3_1Doc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

//TODO:

adddrawcodefornativedatahere

//画背景

CBrushmybrush1;

mybrush1.CreateSolidBrush(RGB(192,192,192));

CRectmyrect1(0,0,1200,800);

pDC->FillRect(myrect1,&mybrush1);

//画棋盘框线

CPenmypen;

CPen*myoldPen;

mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));

myoldPen=pDC->SelectObject(&mypen);

for(inti=0;i<19;i++)

{

pDC->MoveTo(40,40+i*20);

pDC->LineTo(400,40+i*20);

pDC->MoveTo(40+i*20,40);

pDC->LineTo(40+i*20,400);

}

//重画时显示存在的棋子

CDCDc;

if(Dc.CreateCompatibleDC(pDC)==FALSE)

AfxMessageBox("Can'tcreateDC");

for(intn=0;n<19;n++)

for(intm=0;m<19;m++)

if(wzq[n][m]==1)

{

//显示白棋

Dc.SelectObject(m_bmwhite);

pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);

}

elseif(wzq[n][m]==-1)

{

//显示黑棋

Dc.SelectObject(m_bmblack);

pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);

}

}

 

}

 

设置鼠标:

 

BOOLCMy3_1View:

:

OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

if(nHitTest==HTCLIENT)

{

//白棋下,显示白棋鼠标

if(colorwhite)

{

//调用主框架里面的状态栏

CMainFrame*pFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd;

CStatusBar*pStatus=&pFrm->m_wndStatusBar;

if(pStatus)

{

pStatus->GetStatusBarCtrl().SetIcon(0,AfxGetApp()->LoadIcon(IDI_WHITE));

pStatus->SetPaneText(0,"白棋下");

}

SetCursor(hcursorwhite);

}

//显示黑棋鼠标

else

{

SetCursor(hcursorblack);

CMainFrame*pFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd;

CStatusBar*pStatus=&pFrm->m_wndStatusBar;

if(pStatus)

{

//显示图像

pStatus->GetStatusBarCtrl().SetIcon(0,AfxGetApp()->LoadIcon(IDI_BLACK));

//显示文字

pStatus->SetPaneText(0,"黑棋下");

}

}

return1;

}

returnCView:

:

OnSetCursor(pWnd,nHitTest,message);

}

 

判断输赢

voidCMy3_1View:

:

over(CPointpoint)

{

//获取鼠标指向数组位置,即中心位置

intx=(point.x-30)/20;

inty=(point.y-30)/20;

//计算开始判断的坐标xx,yy

intxx,yy;

if(x<4)

xx=0;

else

xx=x-4;

if(y<4)

yy=0;

else

yy=y-4;

inti,j,a;

//横向判断

for(i=xx;i<15;i++)

{

a=0;

for(j=i;j

{

a=a+wzq[j][y];

//五个都是白棋

if(a==5)

{

AfxMessageBox("白棋胜!

");

//重新开始

OnStart();

return;

}

//五个都是黑棋

if(a==-5)

{

AfxMessageBox("黑棋胜!

");

OnStart();

return;

}

}

}

//竖向判断

for(i=yy;i<15;i++)

{

a=0;

for(j=i;j

{

a=a+wzq[x][j];

if(a==5)

{

AfxMessageBox("白棋胜!

");

OnStart();

return;

}

if(a==-5)

{

AfxMessageBox("黑棋胜!

");

OnStart();

return;

}

}

}

//向右下角

//判断起点位置

if(x

{

if(xx==0)

yy=y-x;

}

else

{

if(yy==0)

xx=x-y;

}

//参数over=1时退出循环

intover=0;

do

{

a=0;

for(i=0;i<5;i++)

{

if((xx+i)<19||(yy+i)<19)

{

a=a+wzq[xx+i][yy+i];

if(a==5)

{

AfxMessageBox("白棋胜!

");

OnStart();

return;

}

if(a==-5)

{

AfxMessageBox("黑棋胜!

");

OnStart();

return;

}

}

//到了边界

else

over=1;

}

xx+=1;

yy+=1;

}while(over==0);

//向左下角

if(y>(18-x))

{

if(x>13)

{

yy=y-(18-x);

xx=18;

}

else

{

yy=y-4;

xx=x+4;

}

}

else

{

if(y<5)

{

xx=x+y;

yy=0;

}

else

{

yy=y-4;

xx=x+4;

}

}

over=0;

do

{

a=0;

for(i=0;i<5;i++)

{

if((xx-i)>=0||(yy+i)<19)

{

a=a+wzq[xx-i][yy+i];

if(a==5)

{

AfxMessageBox("白棋胜!

");

OnStart();

return;

}

if(a==-5)

{

AfxMessageBox("黑棋胜!

");

OnStart();

return;

}

}

//到了边界

else

over=1;

}

xx-=1;

yy+=1;

}while(over==0);

}

文件保存

voidCMy3_1View:

:

OnSave()

{

//TODO:

Addyourcommandhandlercodehere

//设置保存的文件,后缀名wzq

CFileDialogdlg(FALSE,"wzq",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.WZQ)|*.wzq|AllFiles|*.*||",this);

//如果公共类对话框为确定

if(dlg.DoModal()==IDOK)

//获取文件名

dlg.GetFileName();

//否则,退出

else

return;

//字符串变量

CStringstr;

inti,j;

 

CStdioFilefile;

//如果有问题,退出

if(file.Open(dlg.GetFileName(),CFile:

:

modeCreate|CFile:

:

modeWrite|CFile:

:

typeText)==0)

{

AfxMessageBox("saveerror!

");

return;

}

//循环把棋盘数组的值写进文件

for(i=0;i<19;i++)

for(j=0;j<19;j++)

{

if(wzq[i][j]==-1)

file.WriteString("-1\n");

if(wzq[i][j]==0)

file.WriteString("0\n");

if(wzq[i][j]==1)

file.WriteString("1\n");

}

//保存当前下棋颜色

if(colorwhite==true)

file.WriteString("1\n");

else

file.WriteString("0\n");

//关闭文件

file.Close();

}

 

读取文件:

 

读文件就是把我们以前保存的文件打开,读取当前打开文件的内容,并给数组赋值使和文件内容相同,然后可以继续进行游戏。

 

//与保存文件相反

voidCMy3_1View:

:

OnOpen()

{

//TODO:

Addyourcommandhandlercodehere

CFileDialogdlg(TRUE,"wzq",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.WZQ)|*.wzq|AllFiles|*.*||",this);

if(dlg.DoModal()==IDOK)

dlg.GetFileName();

else

return;

 

 

CStringstr;

inti,j,m;

 

CStdioFilefile;

if(file.Open(dlg.GetFileName(),CFile:

:

modeRead)==0)

{

AfxMessageBox("saveerror!

");

return;

}

CArchivear(&file,CArchive:

:

load);

 

for(i=0;i<19;i++)

for(j=0;j<19;j++)

{

ar.ReadString(str);

sscanf(str,"%d",&m);

if(m==-1)

wzq[i][j]=-1;

if(m==0)

wzq[i][j]=0;

if(m==1)

wzq[i][j]=1;

}

ar.ReadString(str);

sscanf(str,"%d",&m);

if(m==1)

colorwhite=true;

else

colorwhite=false;

file.Close();

ar.Close();

 

Invalidate(false);

}

 

6.窗口截图

 

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1