最新MFC设计五子棋完全代码.docx
《最新MFC设计五子棋完全代码.docx》由会员分享,可在线阅读,更多相关《最新MFC设计五子棋完全代码.docx(19页珍藏版)》请在冰豆网上搜索。
最新MFC设计五子棋完全代码
MFC设计五子棋完全代码
MFC程序设计
MFC制作五子棋
目录:
1.目的与要求……………………….….……..…….
2.主要功能………………………………………….
3.设计过程中的经验与教训……………………….
4.自己收获与缺乏……………………….………….
5.重要程序清单…………………………………….
6.窗口截图………………………………………….
函数未能定义或实现。
整个设计过程所学的东西也很多。
以五子棋游戏为例。
首先要知道其根本规那么,并设法用不同的函数来解决规那么的限定。
设计过程中常常会出现函数已经构造,却未加定义的情况。
做本游戏时,查看了大量资料。
在棋盘的画法上有所纠结。
是直接将棋盘背景图直接参加还是调用函数进行棋盘绘制都是要考虑的。
经过屡次尝试,不断进行函数的调试和界面图标的设计。
最终完成此次实验。
虽然屡次返工,虽然有一天从早上做到第二天凌晨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.窗口截图