1、课程设计说明书 题目:_ 五子棋_ 姓 名:_ 院 (系):_ 专业班级:_ 学 号:_ 指导教师:_ 成 绩:_ 时间:_ 年月_日至_ 年月_日 课程设计任务书 题目_ 五子棋_ 专业、班级_学号_姓名_ 五子棋:又名五子连珠棋,是一项有趣、益智的棋类游戏,易学 难精, 但妙趣横生。下一局棋所费时间不多,工余饭后“杀上一盘” 开发智力,勤 于动脑,调剂感情,有利于开发智商居家必备。 故此利用已学知识在 VisualVisual C+6.0C+6.0 上写出五子棋程序。 完成期限:2015 年 12 月 4 日 指导教师签名:_ 课程负责人签名:_ 2018 目录 1.1. 设计目标与内容
2、.1 1 2.2. 设计要求 .2.2. 2.12.1 新建工程 game_wzqgame_wzq.3 3 2.22.2 资源编辑 .4 4 2.32.3 变量函数 .5 5 2.42.4 具体实现 .6 6 2.52.5 文件保存和读取 .2222 3.3. 附录.2727 4.4.参考文献 .2929 1 第一章 设计目标与内容 1. 了解 Windows 编程的基础知识,掌握 MFC 应用程序的基本知识 2. 基本掌握面向对象程序设计的基本思路和方法; 3. 掌握用 VC+开发应用程序的的一般步骤和方法; 4. 能够利用所学的基本知识 , 设计一个简单的五子棋游戏,具有以下功 能: 1数
3、据结构的设计;五子棋棋盘的绘制。 2两人下棋时,两人下棋算法的设计。 3两人下棋时 , 判断任一方获胜的算法的设计。 2 第二章设计要求 用 VOVO+进行编码,实现应用程序的功能。注重编码质量,代码要有 适当的 注释; 提交设计报告一份(课程设计任务书、目录、主要的数据结构、设计的基 本思 路、设计的步骤及主要代码、心得体会、参考文献)。 总体设计 运行时效果如下: Sgamevzq二 | 回 富I 文件(B蝙無(E)萱看陋帮助 五子棋| 白損下数字 这个程序只能进行两个人之间的对弈,不能进行人机对弈,由于时间和 3 个人能力的原因所以人机对弈的算法就没有写出。同时程序中也存在着很 多漏洞,
4、但基本的功能都已经实现,还有待继续改进。 详细设计 第一节 新建工程 game_wzqgame_wzq 选择单文档应用程序,在 Step 4 of 6 中先中WindowsSockets 复选框 如下图: MFC去乏程字冃寻-多長4丈丘汙 密是否希蟲包書以下特点: 丽隐裁工具栏 莊初始化状态栏 眉打印和打印預览 厂上F文相关帮助 F 3D外现 厂MAPI (Messaging API (!) H 丽Windows Sockets W| 逐的工具栏的样式: 席普谨 广类假IE 轻的最近文件列表数目; 弓高级回 下一步 第二节 资源编辑 黑白位图 Bitmap 以表示棋盘上面的棋子: IDB_BL
5、ACK DB_WHITE Rada# 完成 Editing ControI: | IRccord Radies Bvttom 4 黑白鼠标 Cursor 以替换当前鼠标: IDC_CURSOR1 黑棋子 IDC_CURSOR2 白棋子 黑白图标 ICon 以显示在状态栏供以提示 IDI_BLACK IDI_WHITE 菜单以供操作: 开始: ID_START 保存: ID_SAVE 打开: ID_OPEN 如下图所示: 5 誉誉IDBIHLACKI製製I IDBWHITE日日LJ Cursor IDC CURS0R1 B IDCZCURSOR? H !3Dialog 习习IDD_ABOUTBO
6、X FT IDI_BLACK Lj IlDLWHITE IDR GAME V/TYPE IDR_MAINFRAME :+: O Meiniu + LJ String Table 弔弔I -jTtiolbair 4 OVersion! 第三节变量函数 首先,为了实现状态栏的应用,我们必须更改它的变量: 在 MainFrm.h 文件里面,把 CStatusBar m_wndStatusBar 为 public 接着是在 game_wzqView.h 文件里面添加变量函数: /两个鼠标 HCURSOR hcursorwhite; HCURSOR hcursorblack; /棋盘数组 int wzq
7、1919; / colorwhite TRUE bool colorwhite; /棋子位图 CBitmap m_bmblack; CBitmap m_bmwhite; / 保存文件 void Save(); 时白棋下,否则黑棋下 _J game_wzq rcsDurccs OAccelerator -Hitmap 6 / 检查是否结束 void over(CPoint point); / 鼠标操作 afx_msg void OnLButtonUp(UINT nFlags, CPoint point); / 鼠标图形更换 afx_msg BOOL OnSetCursor(CWnd* pWnd,
8、 UINT nHitTest, UINT message); / 菜单的开始 afx_msg void OnStart(); / 菜单的保存 afx_msg void OnSave(); / 菜单的打开 afx_msg void OnOpen(); 第四节 具体实现 1、由于我们的游戏的棋盘大小是一定的,不能改变大小的,是应该符合要 求的。 在如下函数添加设置窗口大小的语句: BOOL CMainFrame:PreCreateWindow(CREATESTRUCT / TODO: Modify the Window class or styles here by modifying / the
9、 CREATESTRUCT cs 7 cs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST; cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX; / 设置窗 口大小: 400*340 cs.cx=450; cs.cy=500; return TRUE; 2、初始化变量: 在构造函数里添加初始代码: CGame_wzqView:CGame_wzqView() /Load 鼠标图像和棋子位图 hcursorblack=AfxGetApp()-LoadCursor(IDC_CURSOR1); hcursorwhite=AfxG
10、etApp()-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, / 画棋盘框线 CPen mypen; 9 CPen*myoldPen; mypen.CreatePen(PS_SOLID,1,RGB(0,0,0); myoldPen=pDC-SelectObject( for(int i=0;iMoveTo(40,4
11、0+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(int n=0;n19;n+) for(int m=0;mBitBlt(n*20+32,m*20+32,160,160, else if(wzqnm=-1) 10 /显示黑棋 Dc.SelectObject(m_bmblack); pDC-BitB
12、lt(n*20+32,m*20+32,160,160, 4 、设置鼠标: 棋盘画好了,接下来就是下棋了。但鼠标并没有像我们上面说的那样变成 白棋, 加函数如下: BOOLCGame_wzqView:OnSetCursor(CWnd*pWnd, UINT nHitTest, message) if(nHitTest=HTCLIENT) / 白棋下,显示白棋鼠标 if(colorwhite) /调用主框架里面的状态栏 CMainFrame *pFrm=(CMainFrame*)AfxGetApp()-m_pMainWnd; CStatusBar*pStatus= if(pStatus) pStat
13、us-GetStatusBarCtrl().SetIcon(0,AfxGetApp()-LoadIcon(I DI_WHITE); UINT 11 pStatus-SetPaneText(0, 白棋下 ); SetCursor(hcursorwhite); / 显示黑棋鼠标 else SetCursor(hcursorblack); CMainFrame*pFrm=(CMainFrame*)AfxGetApp()-m_pMainWnd; CStatusBar*pStatus= if(pStatus) / 显示图像 pStatus-GetStatusBarCtrl().SetIcon(0,Afx
14、GetApp()-LoadIcon(I DI_BLACK); / 显示文字 pStatus-SetPaneText(0, 黑棋下 ); return 1; return CView:OnSetCursor(pWnd, nHitTest, message); 12 5、下棋操作: 这 就 涉 及 到 OnLButtonDown(UINT nFlags, CPoint point) 和 OnLButtonUp(UINT nFlags, CPoint point) 两个函数了。要用哪一个或用 两个? 用 Down 函数时是在鼠标按下时放下棋子,可是,要是我们按下后意 识到按错了 怎么办;那就改用 U
15、p 函数,表示当鼠标键松开时放下棋子。OK 添加函数如下: void CGame_wzqView:OnLButtonUp(UINT nFlags, CPoint point) CView:OnLButtonUp(nFlags, point); CDC *pDC=GetDC(); CDC Dc; if(Dc.CreateCompatibleDC(pDC)=FALSE) AfxMessageBox(Cant create DC); / 是否在棋盘内 if(point.x30 13 / 表示存在白棋 wzqpxpy=1; / 检查是否结束 over(point); colorwhite=false;
16、 else if(wzqpxpy=0) Dc.SelectObject(m_bmblack); pDC-BitBlt(px*20+32,py*20+32,160,160, wzqpxpy=-1; over(point); colorwhite=true; 由上面可以看出,当鼠标键松开时判断,如果那个位置没有棋子,则放下, 并把棋盘数组赋相应的值: 1 或-1 6、是否结束: 接着是用一个 over ()函数判断是否结束,是则结束并重新开始;否则, 接着把 鼠标变成对方棋子,表示对方下棋。 / 换黑棋下 14 那 over ()函数又是怎样的呢? 15 此函数是利用刚下棋的位置为中心,检查它各个
17、方向上的连续五个棋子是 否同 色,是则结束并重新开始。 然而,我们又是怎样判断一个方向上的五个棋子的 同色的?这就涉及地为 什么我要把五子棋数组赋值为 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
18、; if(x4) xx=0; else xx=x-4; if(y4) yy=0; else yy=y-4; int i,j,a; / 横向判断 for(i=xx;i15;i+) 16 a=0; for(j=i;ji+5;j+) a=a+wzqjy; / 五个都是白棋 if(a=5) AfxMessageBox(白棋胜!); / 重新开始 OnStart(); return; /五个都是黑棋 if(a=-5) AfxMessageBox(黑棋胜!); OnStart(); return; 17 / 竖向判断 for(i=yy;i15;i+) a=0; for(j=i;ji+5;j+) a=a+w
19、zqxj; if(a=5) AfxMessageBox( OnStart(); return; if(a=-5) AfxMessageBox( OnStart(); return; 白棋胜!); 黑棋胜!); 18 / 向右下角 / 判断起点位置 if(xy) if(xx=0) yy=y-x; else if(yy=0) xx=x-y; / 参数 over=1 时退出循环 int over=0; do a=0; for(i=0;i5;i+) 19 if(xx+i)19|(yy+i)(18-x) 20 if(x13) yy=y-(18-x); xx=18; else yy=y-4; xx=x+4
20、; else if(y5) xx=x+y; yy=0; else yy=y-4; xx=x+4; over=0; do 21 a=0; for(i=0;i=0|(yy+i)19) a=a+wzqxx-iyy+i; if(a=5) AfxMessageBox( 白棋胜 !); OnStart(); return; if(a=-5) 22 AfxMessageBox( 黑棋胜 !); OnStart(); return; / 到了边界 else over=1; xx-=1; yy+=1; while(over=0); 第五节 文件保存和读取 保存文件函数是一个菜单选项。它的作用就是保存当前游戏的
21、状态。首先, 我们应该为我们自己的文件定义一个后缀名: .wzq ;接着是打开保存文 件 的公共对话框,如果确定,则表示保存,那么就先获取文件名,然后按照 一定的顺 序保存各个点的数组的值,最后保存当前是哪种颜色下棋。 void CGame_wzqView:OnSave() / 设置保存的文件,后缀名 wzq 23 CFileDialog dlg(FALSE,wzq,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,(*.WZ Q)|*.wzq|All Files|*.*|,this); / 如果公共类对话框为确定 if(dlg.DoModal()=IDOK)
22、 / 获取文件名 dlg.GetFileName(); / 否则,退出 else return; / 字符串变量 CString str; int i,j; CStdioFile file; / 如果有问题,退出 if(file.Open(dlg.GetFileName(),CFile:modeCreate|CFile:modeW rite|CFile:typeText)=0) AfxMessageBox(save error!); 24 return; / 循环把棋盘数组的值写进文件 for(i=0;i19;i+) for(j=0;j19;j+) if(wzqij=-1) file.Writ
23、eString(-1n); if(wzqij=0) file.WriteString(0n); if(wzqij=1) file.WriteString(1n); / 保存当前下棋颜色 if(colorwhite=true) file.WriteString(1n); else file.WriteString(0n); / 关闭文件 file.Close(); 读文件就是把我们以前保存的文件打开,读取当前打开文件的内容,并给 数组赋值使和 文件内容相同,然后可以继续进行游戏。 25 void CGame_wzqView:OnOpen() CFileDialog dlg(TRUE,wzq,NU
24、LL,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) AfxMessageBox(open error!); return; CArchive ar( if(m=0) wzqij=0; if(m=1) wz
25、qij=1; ar.ReadString(str); sscanf(str,%d, if(m=1) colorwhite=true; else colorwhite=false; file.Close(); ar.Close(); Invalidate(false); OK,现在我们的程序已经完成了,可以两个人进行对弈了 27 附录: int over=0; do a=0; for(i=0;i5;i+) if(xx+i)19|(yy+i)m_pMainWnd; CStatusBar*pStatus= if(pStatus) pStatus-GetStatusBarCtrl().SetIcon(
26、0,AfxGetApp()-LoadIcon( IDI_WHITE); pStatus-SetPaneText(0, 白棋下 ); SetCursor(hcursorwhite); / 显示黑棋鼠标 else SetCursor(hcursorblack); CMainFrame*pFrm=(CMainFrame*)AfxGetApp()-m_pMainWnd; CStatusBar*pStatus= if(p / 显示图像 pStatus-GetStatusBarCtrl().SetIcon(0,AfxGetApp()-LoadIcon(I DI_BLACK); / 显示文字 29 pStatus-SetPaneText(0, 黑棋下 ); return 1; return CView:OnSetCursor(pWnd, nHitTest, message);
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。