MFC课程设计报告

上传人:z**** 文档编号:148257380 上传时间:2022-09-04 格式:DOCX 页数:26 大小:73.66KB
收藏 版权申诉 举报 下载
MFC课程设计报告_第1页
第1页 / 共26页
MFC课程设计报告_第2页
第2页 / 共26页
MFC课程设计报告_第3页
第3页 / 共26页
资源描述:

《MFC课程设计报告》由会员分享,可在线阅读,更多相关《MFC课程设计报告(26页珍藏版)》请在装配图网上搜索。

1、设计一个简单的五子棋游戏一、设计目标与内容1. 了解 Windows 编程的基础知识,掌握 MFC 应用程序的基本知 识;2. 基本掌握面向对象程序设计的基本思路和方法;3. 掌握用VC+开发应用程序的的一般步骤和方法;4. 能够利用所学的基本知识, 设计一个简单的五子棋游戏,具有以下功能:数据结构的设计;五子棋棋盘的绘制。两 人下棋时,两人下棋算法的设计。两人下棋时判断任一方 获胜的算法的设计。二、设计要求1.用VC+进行编码,实现应用程序的功能。注重编码质量, 代码要有适当的注释;提交设计报告一份(课程设计任务书、目录、主要的数据结构、 设计的基本思路、设计的步骤及主要代码、心得体会、参考

2、文献)。总体设计运行时效果如下:图 3-1这个程序只能进行两个人之间的对弈,不能进行人机对弈,由 于时间和个人能力的原因所以人机对弈的算法就没有写出。同时 程序中也存在着很多漏洞,但基本的功能都已经实现,还有待继 续改进。详细设计新建工程 game_wzq选择单文档应用程序,在 Step 4 of 6 中先中 Windows Sockets 复选框。如下图:MFC应用启序向寻-歩慕4共白歩| ApplicationPrt.Priat PrevievPrikt Sctp.Exit您是否希璽包含以下特点:PP7ReadyEditing Control: | Record鹽藏工具栏初始化狀态栏打印和

3、打印预览上下文相关帮助3D外观MAPI (Messaging API J 7 Windows Sockets (W|Chck Box (S) Radio Bvttoa O Radio Bvttoa您的工具栏的样式: 柠普通类似IE您的最近文件列表数目:高级回I上一步下一步完成取涓图3-2资源编辑黑白位图 Bitmap 以表示棋盘上面的棋子IDB_BLACKDB_WHITE黑白鼠标 Cursor 以替换当前鼠标:IDC_CURSOR1 黑棋子IDC_CURSOR2 白棋子黑白图标 Icon 以显示在状态栏供以提示IDI_BLACKIDI_WHITE菜单以供操作:开始:ID_START保存:ID_

4、SAVE打开:ID_OPEN如下图所示:-I-t3 game wzq resources i 21 Accelerator-BitmapIDB BLACK鳖IDB_WHITE-卜日 Cursor驗 IDC_CURSOR1 關 IDC_CURSOR2 -Dialog冒 IDD_ABOUTBOXT 日 Icon IDI_BUCKI Q IDI_WHITE| Q IDR_GAME_WTYPE:匚金曲 閤 ReSourj FileVie VAVie1 idrZmainframe 由 Q Menu j rj String Table 由 1 Toolbar 也 O Version图3-3变量函数首先,为

5、了实现状态栏的应用,我们必须更改它的变量在 MainFrm.h 文件里面,把 CStatusBar m_wndStatusBar 为 public接着是在 game_wzqView.h 文件里面添加变量函数: /两个鼠标HCURSOR hcursorwhite;HCURSOR hcursorblack;/棋盘数组int wzq1919;/ colorwhite TRUE 时白棋下,否则黑棋下bool colorwhite;/棋子位图CBitmap m_bmblack;CBitmap m_bmwhite; /保存文件 void Save();/检查是否结束void over(CPoint poi

6、nt);/鼠标操作afx_msg void OnLButtonUp(UINT nFlags, CPoint point); /鼠标图形更换afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);/菜单的开始afx_msg void OnStart();/菜单的保存afx_msg void OnSave();/ 菜单的打开afx_msg void OnOpen();具体实现1、由于我们的游戏的棋盘大小是一定的,不能改变大小的, 是应该符合要求的。在如下函数添加设置窗口大小的语句: BOOL CMainFrame:PreC

7、reateWindow(CREATESTRUCT& cs) if( !CFrameWnd:PreCreateWindow(cs) )return FALSE;/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT cs cs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST;cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX; / 设置窗口大小:400*340cs.cx=450;cs.cy=500;return TRUE;2、

8、初始化变量:在构造函数里添加初始代码:CGame_wzqView:CGame_wzqView()/Load 鼠标图像和棋子位图hcursorblack=AfxGetApp()-LoadCursor(IDC_CURSOR1); hcursorwhite=AfxGetApp()-LoadCursor(IDC_CURSOR2);m_bmwhite.LoadBitmap(IDB_WHITE);m_bmblack.LoadBitmap(IDB_BLACK);/ 清理棋盘/ 数组值为0表示没有棋子for(int i=0;i19;i+)for(int j=0;jFillRect(myrect1,&mybru

9、sh1);/ 画棋盘框线CPen mypen;CPen*myoldPen;mypen.CreatePen(PS_SOLID,1,RGB(0,0,0);myoldPen=pDC-SelectObject(&mypen);for(int i=0;iMoveTo(40,40+i*20);pDC-LineTo(400,40+i*20);pDC-MoveTo(40+i*20,40);pDC-LineTo(40+i*20,400);/ 重画时显示存在的棋子CDC Dc;if(Dc.CreateCompatibleDC(pDC)=FALSE)AfxMessageBox(Cant create DC);for

10、(int n=0;n19;n+)for(int m=0;mBitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY)else if(wzqnm=-1)/ 显示黑棋Dc.SelectObject(m_bmblack);pDC-BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY)4 、设置鼠标:棋盘画好了,接下来就是下棋了。但鼠标并没有像我们上面说的 那样变成白棋,加函数如下:BOOL CGame_wzqView:OnSetCursor(CWnd* pWnd, UINT nHitTest,UINT message)if(

11、nHitTest=HTCLIENT)/白棋下,显示白棋鼠标if(colorwhite)/调用主框架里面的状态栏CMainFrame*pFrm=(CMainFrame*)AfxGetApp()-m_pMainWnd;CStatusBar*pStatus=&pFrm-m_wndStatusBar; if(pStatus)pStatus-GetStatusBarCtrl().SetIcon(0,AfxGetApp()-L oadIcon(IDI_WHITE);pS tat us-Se tPaneTex t( 0,白棋下);SetCursor(hcursorwhite);/显示黑棋鼠标elseSetC

12、ursor(hcursorblack);CMainFrame*pFrm=(CMainFrame*)AfxGetApp()-m_pMainWndCStatusBar*pStatus=&pFrm-m_wndStatusBar; if(pStatus)/显示图像pStatus-GetStatusBarCtrl().SetIcon(0,AfxGetApp()-L oadIcon(IDI_BLACK);/显示文字pStat us-Se tPaneTex t(0,黑棋下);return 1;return CView:OnSetCursor(pWnd, nHitTest, message);5、下棋操作:这

13、就涉及到 OnLButtonDown(UINT nFlags, CPoint point)和 OnLBu tt onUp(UINT nFlags, CPoin t poin t)两个函数了。要用哪 一个或用两个?用Down函数时是在鼠标按下时放下棋子,可是, 要是我们按下后意识到按错了怎么办;那就改用Up函数,表示 当鼠标键松开时放下棋子。0K!添加函数如下:void CGame_wzqView:OnLButtonUp(UINT nFlags, CPointpoint)CView:OnLButtonUp(nFlags, point);CDC *pDC=GetDC();CDC Dc;if(Dc.

14、CreateCompatibleDC(pDC)=FALSE)AfxMessageBox(Cant create DC);/ 是否在棋盘内if(point.x30&point.x30&point.yBitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);/表示存在白棋wzqpxpy=1;/检查是否结束over(point);/换黑棋下 colorwhite=false;else if(wzqpxpy=0)Dc.SelectObject(m_bmblack);pDC-BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRC

15、COPY);wzqpxpy=-1;over(point);colorwhite=true;由上面可以看出,当鼠标键松开时判断,如果那个位置没有棋子 则放下,并把棋盘数组赋相应的值:1 或-16、是否结束: 接着是用一个over ()函数判断是否结束,是则结束并重新开始;否则,接着把鼠标变成对方棋子,表示对方下棋。那over ()函数又是怎样的呢?此函数是利用刚下棋的位置为中心,检查它各个方向上的连续五 个棋子是否同色,是则结束并重新开始。然而,我们又是怎样判断一个方向上的五个棋子的同色的?这就涉及地为什么我要把五子棋数组赋值为1和-1的问题。因为这样 有一个好处:利用连续五个棋子的值相加,如果

16、它们的值的绝对 值等于5,则说明是同色。当然,这只是这样赋值的一点作用, 真正的作用将在后面介绍。添加如下:void CGame_wzqView:over(CPoint point)/获取鼠标指向数组位置,即中心位置int x=(point.x-30)/20;int y=(point.y-30)/20;/计算开始判断的坐标 xx,yyint xx,yy;if(x4)xx=0;elsexx=x-4;if(y4) yy=0;elseyy=y-4; int i,j,a; /横向判断 for(i=xx;i15;i+) a=0;for(j=i;ji+5;j+) a=a+wzqjy;/ 五个都是白棋 if

17、(a=5) AfxMessageBox(白棋胜!); / 重新开始 OnStart();return;/ 五个都是黑棋 if(a=-5)AfxMessageBox( 黑棋胜!);OnStart();return;/竖向判断for(i=yy;i15;i+)a=0;for(j=i;ji+5;j+)a=a+wzqxj;if(a=5)AfxMessageBox( 白棋胜!);OnStart();return;if(a=-5)AfxMessageBox( 黑棋胜!);OnStart();return;/向右下角/判断起点位置if(xy)if(xx=0)yy=y-x;elseif(yy=0)xx=x-y;

18、/参数over=l时退出循环int over=0;doa=0;for(i=0;i5;i+)if(xx+i)19|(yy+i)(18-x)if(x13)yy=y-(18-x);xx=18;elseyy=y-4;xx=x+4;elseif(y5)xx=x+y;yy=0;elseyy=y-4;xx=x+4;over=0;doa=0;for(i=0;i=0|(yy+i)19) a=a+wzqxx-iyy+i;if(a=5)AfxMessageBox( 白棋胜!);OnStart();return;if(a=-5)AfxMessageBox( 黑棋胜!);OnStart();return;/ 到了边界e

19、lseover=1;xx-=1;yy+=1;while(over=0);文件保存和读取1、保存文件函数是一个菜单选项。它的作用就是保存当前游 戏的状态。首先,我们应该为我们自己的文件定义一个后缀 名:.wzq;接着是打开保存文件的公共对话框,如果确定,则表 示保存,那么就先获取文件名,然后按照一定的顺序保存各个点 的数组的值,最后保存当前是哪种颜色下棋。void CGame_wzqView:OnSave()/设置保存的文件,后缀名 wzqCFileDialog dlg(FALSE,wzq,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROM PT,(*.WZQ)|*.

20、wzq|All Files|*.*|,this);/如果公共类对话框为确定if(dlg.DoModal()=IDOK)/获取文件名dlg.GetFileName();/否则,退出elsereturn;/字符串变量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;i19;i+)for(

21、j=0;j19;j+)if(wzqij=-1)file.WriteString(-1n);if(wzqij=0)file.WriteString(0n);if(wzqij=1)file.WriteString(1n);/保存当前下棋颜色if(colorwhite=true)file.WriteString(1n);elsefile.WriteString(0n);/关闭文件 file.Close();2、读文件就是把我们以前保存的文件打开,读取当前打开文 件的内容,并给数组赋值使和文件内容相同,然后可以继续进行 游戏。void CGame_wzqView:OnOpen()CFileDialog

22、 dlg(TRUE,wzq,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMP T,(*.WZQ)|*.wzq|All Files|*.*|,this);if(dlg.DoModal()=IDOK) dlg.GetFileName();elsereturn;CString str;int i,j,m;CStdioFile file;if(file.Open(dlg.GetFileName(),CFile:modeRead)=0)AfxMessageBox(open error!);return;CArchive ar(&file,CArchive:load);for(i=0;i19;i+)for(j=0;j19;j+)ar.ReadString(str);sscanf(str,%d,&m);if(m=-1)wzqij=-1;if(m=0)wzqij=0;if(m=1)wzqij=1;ar.ReadString(str);sscanf(str,%d,&m);if(m=1)colorwhite=true;elsecolorwhite=false;file.Close();ar.Close();Invalidate(false);OK,现在我们的程序已经完成了,可以两个人进行对弈了。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!