




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、传播优秀word版文档 ,希望对您有帮助,可双击去除!设计一个简单的五子棋游戏一、设计目标与内容1. 了解windows编程的基础知识,掌握mfc应用程序的基本知识;2. 基本掌握面向对象程序设计的基本思路和方法;3. 掌握用vc+开发应用程序的的一般步骤和方法;4. 能够利用所学的基本知识, 设计一个简单的五子棋游戏,具有以下功能:数据结构的设计;五子棋棋盘的绘制。两人下棋时,两人下棋算法的设计。两人下棋时,判断任一方获胜的算法的设计。二、设计要求1. 用vc进行编码,实现应用程序的功能。注重编码质量,代码要有适当的注释;提交设计报告一份(课程设计任务书、目录、主要的数据结构、设计的基本思路
2、、设计的步骤及主要代码、心得体会、参考文献)。总体设计 运行时效果如下: 图3-1 这个程序只能进行两个人之间的对弈,不能进行人机对弈,由于时间和个人能力的原因所以人机对弈的算法就没有写出。同时程序中也存在着很多漏洞,但基本的功能都已经实现,还有待继续改进。 详细设计u 新建工程game_wzq 选择单文档应用程序,在step 4 of 6中先中windows sockets复选框。如下图: 图3-2u 资源编辑 黑白位图bitmap以表示棋盘上面的棋子: idb_black db_white 黑白鼠标cursor以替换当前鼠标: idc_cursor1 黑棋子 idc_cursor2 白棋子
3、黑白图标icon以显示在状态栏供以提示 idi_black idi_white菜单以供操作:开始: id_start 保存: id_save打开: id_open如下图所示: 图3-3u 变量函数首先,为了实现状态栏的应用,我们必须更改它的变量: 在mainfrm.h文件里面,把cstatusbar m_wndstatusbar 为public 接着是在game_wzqview.h文件里面添加变量函数: /两个鼠标 hcursor hcursorwhite;hcursor hcursorblack;/棋盘数组 int wzq1919; / colorwhite true时白棋下,否则黑棋下 b
4、ool 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);/菜单的开始afx_msg void onstart();/菜单的保存 afx_msg void onsave(); /菜单的打
5、开 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_to
6、pmost; 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=afxgetapp()->loadcursor(idc_cursor2); m_bmwhite.loadbitma
7、p(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;3、画棋盘: 在ondraw(cdc* pdc)函数中画棋盘,由于在游戏过程中有可能重画棋盘,而那时棋盘上面有棋子,所以,我们在这个函数里面必须有画棋子的语句。我们用数组的做为1表示白棋,-1表示黑棋。void cgame_wzqview:ondraw(cdc* pdc)cgame_wzqdoc* pdoc
8、= 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; mypen.createpen(ps_solid,1,rgb(0,0,0); myoldpen=pdc->selectobject(&mypen); for(int i=0;i
9、<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.select
10、object(m_bmwhite);pdc->bitblt(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
11、 message) 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,"白棋下&q
12、uot;);setcursor(hcursorwhite);/显示黑棋鼠标elsesetcursor(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,"
13、黑棋下");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, cpoin
14、t 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;/是否已经有棋
15、子if(colorwhite&&wzqpxpy=0)dc.selectobject(m_bmwhite);pdc->bitblt(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,srccopy); wzqpxpy=-1
16、;over(point);colorwhite=true;由上面可以看出,当鼠标键松开时判断,如果那个位置没有棋子,则放下,并把棋盘数组赋相应的值:1或-1 6、是否结束: 接着是用一个over()函数判断是否结束,是则结束并重新开始;否则,接着把鼠标变成对方棋子,表示对方下棋。那over()函数又是怎样的呢? 此函数是利用刚下棋的位置为中心,检查它各个方向上的连续五个棋子是否同色,是则结束并重新开始。然而,我们又是怎样判断一个方向上的五个棋子的同色的?这就涉及地为什么我要把五子棋数组赋值为1和-1的问题。因为这样有一个好处:利用连续五个棋子的值相加,如果它们的值的绝对值等于5,则说明是同色。
17、当然,这只是这样赋值的一点作用,真正的作用将在后面介绍。添加如下: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) 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; /五个
18、都是白棋 if(a=5) afxmessagebox("白棋胜!"); /重新开始 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("黑棋胜!"
19、); onstart();return; /向右下角 /判断起点位置 if(x<y) if(xx=0) yy=y-x; else if(yy=0) xx=x-y; /参数over=1时退出循环 int over=0; do 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(); re
20、turn; /到了边界 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+wzqxx-iyy+i; if(a=5) afxmessagebox("白棋胜!");
21、 onstart(); return; if(a=-5) afxmessagebox("黑棋胜!"); onstart(); return; /到了边界 else over=1; xx-=1; yy+=1; while(over=0);u 文件保存和读取1、 保存文件函数是一个菜单选项。它的作用就是保存当前游戏的状态。首先,我们应该为我们自己的文件定义一个后缀名:.wzq;接着是打开保存文件的公共对话框,如果确定,则表示保存,那么就先获取文件名,然后按照一定的顺序保存各个点的数组的值,最后保存当前是哪种颜色下棋。void cgame_wzqview:onsave() /设置
22、保存的文件,后缀名wzqcfiledialog dlg(false,"wzq",null,ofn_hidereadonly|ofn_overwriteprompt,"(*.wzq)|*.wzq|all files|*.*|",this);/如果公共类对话框为确定if(dlg.domodal()=idok) /获取文件名dlg.getfilename();/否则,退出elsereturn;/字符串变量cstring str;int i,j; cstdiofile file;/如果有问题,退出if(file.open(dlg.getfilename(),cf
23、ile: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");elsefile.writestring(&q
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新闻传媒理论与实践练习题库
- 影视剧拍摄合同书
- 校园社团活动安全责任协议
- 2025《中级会计实务》冲刺考点:合同成本的确认与计量的要点分析
- 残疾人就业安置与职业培训服务合同
- 素食餐厅连锁加盟经营许可协议范本
- 分公司合作开发与知识产权归属协议
- 旅游景点特色铺面租赁及旅游纪念品销售合同
- 高速公路项目部分收费权益转让合同
- 驳接爪专用采购合同包含操作培训条款
- 代加工物料管理制度
- 模切安全生产培训
- 安宁疗护之疼痛管理
- AI驱动的智能汽车故障诊断系统
- 水土保持方案编制经费预算书
- 中国中铁股份有限公司内部控制运行管理办法试行
- 2025潍坊辅警考试题库
- 危险性较大的分部分项工程专项施工方案严重缺陷清单(试行)
- 四川省 2025届高考历史全真模拟试题(含解析)
- 采购管理数字化转型-深度研究
- 2025年助理会计考试试题及答案
评论
0/150
提交评论