版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MFC程序设计MFC制作五子棋目录:1. 目的与要求.2. 主要功能.3. 设计过程中的经验与教训.4. 自己收获与缺乏.5. 重要程序清单.6. 窗口截图.1.目的与要求利用已有的C+根底,结合对MFC的学习,进行窗口化设计。由于MFC提供了MFCppWizard自动生成框架。使得简单的编程更加简单,界面简洁。这次用MFC设计了一个简单的五子棋游戏。可以进行简单的双人对战。目的在于更加熟悉MFC的使用来完成游戏的制作。再此期间,搜集大量信息,以及函数的源代码。不断进行整合,进行函数构造。2主要功能MFC的窗口更适合小型游戏的界面。五子棋可以说是再简单不过的小游戏了,不过其中确包含了大量的函数
2、实现游戏的正常运转。假设要是游戏顺利进行,必须要有程序约束游戏规那么。因此本游戏要解决,棋子所放位置的判断,棋子颜色的区分,以及玩家的输赢。解决这些问题,玩家便可以进行一场二人大战了。本游戏可以让两个玩家在标准的五子棋盘上进行游戏,最先连成五子者,游戏可以显示哪一方获胜。最终的结果可以保存入文件夹。3. 设计过程中的经验与教训本次游戏设计,所遇到的阻力比拟大。经过屡次返工。屡次函数未能定义或实现。整个设计过程所学的东西也很多。以五子棋游戏为例。首先要知道其根本规那么,并设法用不同的函数来解决规那么的限定。设计过程中常常会出现函数已经构造,却未加定义的情况。做本游戏时,查看了大量资料。在棋盘的画
3、法上有所纠结。是直接将棋盘背景图直接参加还是调用函数进行棋盘绘制都是要考虑的。经过屡次尝试,不断进行函数的调试和界面图标的设计。最终完成此次实验。虽然屡次返工,虽然有一天从早上做到第二天凌晨5点,但最终的成功,使这些都变成浮云。不断尝试,永不放弃,最终一定成功。4. 自己收获与缺乏此次实验初期,本方案完成一个比拟优秀的作品,但最终多种原因没有到达预期理想的界面。首先谈谈收获,个人认为此次MFC课程设计更适合简单游戏的设计。五子棋的界面简单,相对规那么也不多。设计过程中,最大的收获要算程序的扩充,函数的调试。其实MFC已给出框架,所要做的便是填充内容。懂得了以位图的形式表示棋子,以cusor替换
4、当前鼠标。还有鼠标热点的设置。在BOOL CMainFrame下构造函数以坐标的形式以改变棋盘大小。同时构造出一系列画棋盘,判断鼠标,判断输赢等函数。为函数添加数据成员并使其一一实现。对相应菜单进行属性更改并进行消息映射,建立响应函数。整个过程都得到了了解及应用。同时,缺乏也很多,本游戏调用函数进行了棋盘绘制,使得界面过于简单。由于时间,能力等问题,未能参加人工智能实现人机对战。而且对于老师所给出的对话框的设计及应用也未能参加。棋子的位图都是自己绘制,并不十分美观。如果有充足的时间,我想这些一定会得到完善。5. 重要程序清单构造函数/两个鼠标 HCURSOR hcursorwhite;HCUR
5、SOR hcursorblack; /棋盘数组int wzq1919; / colorwhite TRUE时白棋下,否那么黑棋下bool colorwhite; /棋子位图CBitmap m_bmblack;CBitmap m_bmwhite; /保存文件void Save();/检查是否结束void over(CPoint point);/鼠标操作afx_msg void OnLButtonUp(UINT nFlags, CPoint point);/鼠标图形更换afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT mes
6、sage);/菜单的开始afx_msg void OnStart();/菜单的保存afx_msg void OnSave();/菜单的翻开afx_msg void OnOpen(); 窗口设计BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)if( !CFrameWnd:PreCreateWindow(cs) )return FALSE;/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT cscs.dwExStyle=cs.d
7、wExStyle|WS_EX_TOPMOST;/cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;/; /设置窗口大小:400*340cs.cx=450;cs.cy=500; return TRUE;棋盘与棋子的绘制void CMy3_1View:OnDraw(CDC* pDC)CMy3_1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/画背景 CBrush mybrush1; mybrush1.CreateSolidB
8、rush(RGB(192,192,192); CRect myrect1(0,0,1200,800); pDC->FillRect(myrect1,&mybrush1);/画棋盘框线CPen mypen;CPen*myoldPen;mypen.CreatePen(PS_SOLID,1,RGB(0,0,0); myoldPen=pDC->SelectObject(&mypen); for(int i=0;i<19;i+)pDC->MoveTo(40,40+i*20);pDC->LineTo(400,40+i*20);pDC->MoveTo(40
9、+i*20,40);pDC->LineTo(40+i*20,400); /重画时显示存在的棋子CDC Dc;if(Dc.CreateCompatibleDC(pDC)=FALSE) AfxMessageBox("Can't create DC");for(int n=0;n<19;n+)for(int m=0;m<19;m+)if(wzqnm=1)/显示白棋Dc.SelectObject(m_bmwhite);pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);else if(wz
10、qnm=-1)/显示黑棋Dc.SelectObject(m_bmblack);pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY); 设置鼠标: BOOL CMy3_1View:OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) / TODO: Add your message handler code here and/or call defaultif(nHitTest=HTCLIENT)/白棋下,显示白棋鼠标if(colorwhite) /调用主框架
11、里面的状态栏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);/显示黑棋鼠标elseSetCursor(hcursorblack);
12、CMainFrame*pFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd;CStatusBar*pStatus=&pFrm->m_wndStatusBar;if(pStatus)/显示图像pStatus->GetStatusBarCtrl().SetIcon(0,AfxGetApp()->LoadIcon(IDI_BLACK);/显示文字pStatus->SetPaneText(0,"黑棋下");return 1;return CView:OnSetCursor(pWnd, nHitTest, messa
13、ge);判断输赢void CMy3_1View:over(CPoint point)/获取鼠标指向数组位置,即中心位置int x=(point.x-30)/20;int y=(point.y-30)/20;/计算开始判断的坐标 xx,yyint xx,yy; if(x<4)xx=0;elsexx=x-4;if(y<4)yy=0;elseyy=y-4;int i,j,a;/横向判断for(i=xx;i<15;i+) a=0;for(j=i;j<i+5;j+)a=a+wzqjy;/五个都是白棋 if(a=5)AfxMessageBox("白棋胜!");/
14、重新开始OnStart();return;/五个都是黑棋if(a=-5)AfxMessageBox("黑棋胜!");OnStart();return;/竖向判断for(i=yy;i<15;i+) a=0;for(j=i;j<i+5;j+)a=a+wzqxj; if(a=5)AfxMessageBox("白棋胜!");OnStart();return;if(a=-5)AfxMessageBox("黑棋胜!");OnStart();return;/向右下角/判断起点位置if(x<y)if(xx=0)yy=y-x;else
15、if(yy=0)xx=x-y;/参数over=1时退出循环int over=0;doa=0;for(i=0;i<5;i+)if(xx+i)<19|(yy+i)<19)a=a+wzqxx+iyy+i;if(a=5)AfxMessageBox("白棋胜!");OnStart();return;if(a=-5)AfxMessageBox("黑棋胜!");OnStart();return;/到了边界elseover=1; xx+=1;yy+=1;while(over=0); /向左下角 if(y>(18-x)if(x>13)yy=y
16、-(18-x);xx=18;elseyy=y-4;xx=x+4;elseif(y<5)xx=x+y;yy=0;elseyy=y-4;xx=x+4; over=0;doa=0;for(i=0;i<5;i+)if(xx-i)>=0|(yy+i)<19)a=a+wzqxx-iyy+i;if(a=5)AfxMessageBox("白棋胜!");OnStart();return;if(a=-5)AfxMessageBox("黑棋胜!");OnStart();return;/到了边界elseover=1; xx-=1;yy+=1;while(
17、over=0); 文件保存void CMy3_1View:OnSave() / TODO: Add your command handler code here/设置保存的文件,后缀名wzqCFileDialog dlg(FALSE,"wzq",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.WZQ)|*.wzq|All Files|*.*|",this);/如果公共类对话框为确定if(dlg.DoModal()=IDOK) /获取文件名dlg.GetFileName();/否那么,退出elsereturn;/
18、字符串变量CString str;int i,j; CStdioFile file;/如果有问题,退出if(file.Open(dlg.GetFileName(),CFile:modeCreate|CFile:modeWrite|CFile:typeText)=0)AfxMessageBox("save error!");return;/循环把棋盘数组的值写进文件for(i=0;i<19;i+)for(j=0;j<19;j+)if(wzqij=-1)file.WriteString("-1n");if(wzqij=0)file.W
19、riteString("0n");if(wzqij=1)file.WriteString("1n");/保存当前下棋颜色if(colorwhite=true)file.WriteString("1n");elsefile.WriteString("0n");/关闭文件 file.Close(); 读取文件: 读文件就是把我们以前保存的文件翻开,读取当前翻开文件的内容,并给数组赋值使和文件内容相同,然后可以继续进行游戏。 /与保存文件相反void CMy3_1View:OnOpen() / TODO: Add your command handler code hereCFileDialog dlg(TRUE,&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论