欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    MFC课程设计报告一个简单的五子棋游戏.docx

    • 资源ID:3161463       资源大小:41.83KB        全文页数:15页
    • 资源格式: DOCX        下载积分:6.99金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要6.99金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    MFC课程设计报告一个简单的五子棋游戏.docx

    MFC课程设计报告一个简单的五子棋游戏网络092刘砺锋 设计一个简单的五子棋游戏 一、设计目标与内容 1. 了解Windows编程的基础知识,掌握MFC应用程序的基本知识; 2. 基本掌握面向对象程序设计的基本思路和方法; 3. 掌握用VC+开发应用程序的的一般步骤和方法; 4. 能够利用所学的基本知识, 设计一个简单的五子棋游戏,具有以下功能:数据结构的设计;五子棋棋盘的绘制。两人下棋时,两人下棋算法的设计。两人下棋时,判断任一方获胜的算法的设计。 二、设计要求 1. 用VC进行编码,实现应用程序的功能。注重编码质量,代码要有适当的注释; 提交设计报告一份。 总体设计 运行时效果如下: 网络092刘砺锋 图3-1 这个程序只能进行两个人之间的对弈,不能进行人机对弈,由于时间和个人能力的原因所以人机对弈的算法就没有写出。同时程序中也存在着很多漏洞,但基本的功能都已经实现,还有待继续改进。 详细设计 u 新建工程game_wzq 网络092刘砺锋 选择单文档应用程序,在Step 4 of 6中先中Windows Sockets复选框。如下图: 图3-2 u 资源编辑 黑白位图Bitmap以表示棋盘上面的棋子: IDB_BLACK DB_WHITE 黑白鼠标Cursor以替换当前鼠标: IDC_CURSOR1 黑棋子 网络092刘砺锋 IDC_CURSOR2 白棋子 黑白图标Icon以显示在状态栏供以提示 IDI_BLACK IDI_WHITE 菜单以供操作: 开始: ID_START 保存: ID_SAVE 打开: ID_OPEN 如下图所示: 图3-3 u 变量函数 首先,为了实现状态栏的应用,我们必须更改它的变量: 网络092刘砺锋 在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 point); /鼠标操作 afx_msg void OnLButtonUp(UINT nFlags, CPoint point); /鼠标图形更换 afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); 网络092刘砺锋 /菜单的开始 afx_msg void OnStart; /菜单的保存 afx_msg void OnSave; /菜单的打开 afx_msg void OnOpen; u 具体实现 1、由于我们的游戏的棋盘大小是一定的,不能改变大小的,是应该符合要求的。在如下函数添加设置窗口大小的语句: BOOL CMainFrame:PreCreateWindow(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*340 cs.cx=450; cs.cy=500; 网络092刘砺锋 return TRUE; 2、初始化变量: 在构造函数里添加初始代码: 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;i<19;i+) for(int j=0;j<19;j+) wzqij=0; /白棋先下 colorwhite=true; 网络092刘砺锋 3、画棋盘: 在OnDraw(CDC* pDC)函数中画棋盘,由于在游戏过程中有可能重画棋盘,而那时棋盘上面有棋子,所以,我们在这个函数里面必须有画棋子的语句。 我们用数组的做为1表示白棋,-1表示黑棋。 void CGame_wzqView:OnDraw(CDC* pDC) CGame_wzqDoc* pDoc = GetDocument; ASSERT_VALID(pDoc); /画背景 CBrush mybrush1; mybrush1.CreateSolidBrush(RGB(192,192,192); CRect myrect1(0,0,1200,800); pDC->FillRect(myrect1,&mybrush1); /画棋盘框线 CPen mypen; CPen*myoldPen; 网络092刘砺锋 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+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); 网络092刘砺锋 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(nHitTest=HTCLIENT) /白棋下,显示白棋鼠标 if(colorwhite) /调用主框架里面的状态栏 网络092刘砺锋 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) 网络092刘砺锋 /显示图像 pStatus->GetStatusBarCtrl.SetIcon(0,AfxGetApp->LoadIcon(IDI_BLACK); /显示文字 pStatus->SetPaneText(0,"黑棋下"); return 1; return CView:OnSetCursor(pWnd, nHitTest, message); 5、下棋操作: 这就涉及到OnLButtonDown(UINT nFlags, CPoint point)和OnLButtonUp(UINT nFlags, CPoint point)两个函数了。要用哪一个或用两个?用Down函数时是在鼠标按下时放下棋子,可是,要是我们按下后意识到按错了怎么办;那就改用Up函数,表示当鼠标键松开时放下棋子。OK!添加函数如下: void CGame_wzqView:OnLButtonUp(UINT nFlags, CPoint 网络092刘砺锋 point) CView:OnLButtonUp(nFlags, point); CDC *pDC=GetDC; CDC Dc; if(Dc.CreateCompatibleDC(pDC)=FALSE) AfxMessageBox("Can't create DC"); /是否在棋盘内 if(point.x>30&&point.x<410&&point.y>30&&point.y<410) int px=(point.x-30)/20; int py=(point.y-30)/20; /是否已经有棋子 if(colorwhite&&wzqpxpy=0) Dc.SelectObject(m_bmwhite); pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY); /表示存在白棋 wzqpxpy=1; /检查是否结束 网络092刘砺锋 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,SRCCOPY); wzqpxpy=-1; over(point); colorwhite=true; 由上面可以看出,当鼠标键松开时判断,如果那个位置没有棋子,则放下,并把棋盘数组赋相应的值:1或-1 6、是否结束: 网络092刘砺锋 接着是用一个over函数判断是否结束,是则结束并重新开始;否则,接着把鼠标变成对方棋子,表示对方下棋。 那over函数又是怎样的呢? 此函数是利用刚下棋的位置为中心,检查它各个方向上的连续五个棋子是否同色,是则结束并重新开始。 然而,我们又是怎样判断一个方向上的五个棋子的同色的?这就涉及地为什么我要把五子棋数组赋值为1和-1的问题。因为这样有一个好处:利用连续五个棋子的值相加,如果它们的值的绝对值等于5,则说明是同色。当然,这只是这样赋值的一点作用,真正的作用将在后面介绍。添加如下: void CGame_wzqView:over(CPoint point) /获取鼠标指向数组位置,即中心位置 int x=(point.x-30)/20; int y=(point.y-30)/20; /计算开始判断的坐标 xx,yy int xx,yy; if(x<4) xx=0; else xx=x-4; if(y<4) 网络092刘砺锋 yy=0; else yy=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("白棋胜!"); /重新开始 OnStart; return; /五个都是黑棋 if(a=-5) 网络092刘砺锋 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) 网络092刘砺锋 AfxMessageBox("黑棋胜!"); OnStart; return; /向右下角 /判断起点位置 if(x<y) if(xx=0) yy=y-x; else if(yy=0) xx=x-y; /参数over=1时退出循环 int over=0; do 网络092刘砺锋 a=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; /到了边界 else 网络092刘砺锋 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 网络092刘砺锋 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+wzqxx-iyy+i; if(a=5) 网络092刘砺锋 AfxMessageBox("白棋胜!"); OnStart; return; if(a=-5) AfxMessageBox("黑棋胜!"); OnStart; return; /到了边界 else over=1; xx-=1; yy+=1; while(over=0); 网络092刘砺锋 u 文件保存和读取 1、保存文件函数是一个菜单选项。它的作用就是保存当前游戏的状态。首先,我们应该为我们自己的文件定义一个后缀名:.wzq;接着是打开保存文件的公共对话框,如果确定,则表示保存,那么就先获取文件名,然后按照一定的顺序保存各个点的数组的值,最后保存当前是哪种颜色下棋。 void CGame_wzqView:OnSave /设置保存的文件,后缀名wzq CFileDialog dlg(FALSE,"wzq",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.WZQ)|*.wzq|All Files|*.*|",this); /如果公共类对话框为确定 if(dlg.DoModal=IDOK) /获取文件名 dlg.GetFileName; /否则,退出 else return; /字符串变量 CString str; int i,j; 网络092刘砺锋 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.WriteString("0n"); if(wzqij=1) file.WriteString("1n"); /保存当前下棋颜色 if(colorwhite=true) file.WriteString("1n"); 网络092刘砺锋 else file.WriteString("0n"); /关闭文件 file.Close; 2、读文件就是把我们以前保存的文件打开,读取当前打开文件的内容,并给数组赋值使和文件内容相同,然后可以继续进行游戏。 void CGame_wzqView:OnOpen CFileDialog dlg(TRUE,"wzq",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"(*.WZQ)|*.wzq|All Files|*.*|",this); if(dlg.DoModal=IDOK) dlg.GetFileName; else return; CString str; int i,j,m; CStdioFile file; if(file.Open(dlg.GetFileName,CFile:modeRead)=0) 网络092刘砺锋 AfxMessageBox("open error!"); return; CArchive ar(&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) wzqij=-1; if(m=0) wzqij=0; if(m=1) wzqij=1; ar.ReadString(str); sscanf(str,"%d",&m); if(m=1) colorwhite=true; else 网络092刘砺锋 colorwhite=false; file.Close; ar.Close; Invalidate(false); OK,现在我们的程序已经完成了,可以两个人进行对弈了。

    注意事项

    本文(MFC课程设计报告一个简单的五子棋游戏.docx)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开