基于Visual C++的五子棋游戏毕业设计_第1页
基于Visual C++的五子棋游戏毕业设计_第2页
基于Visual C++的五子棋游戏毕业设计_第3页
基于Visual C++的五子棋游戏毕业设计_第4页
基于Visual C++的五子棋游戏毕业设计_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、山东凯文科技职业学院山东凯文科技职业学院 2011 届毕业论文届毕业论文 基于 visual c+的五子棋游戏设计 主要算法的设计与实现 学 院: 信息学院 学生姓名: xxx 指导教师: 张老师 专 业: 软件技术 班 级: 08 软件 1 班 完成时间: 2011 年 6 月 29 日 山东凯文科技职业学院 摘 要 本论文主要阐述以面向对象的程序开发语言 vc+为开发工具,设计一个五子棋游戏。本系统是个 小型游戏,可以单机使用,也可以网络两个人游戏,也可以和电脑进行游戏。论文首先介绍了开发背 景及开发语言的介绍。然后介绍设计该游戏的框架结构,然后介绍了程序的设计过程,以及程序的相 关算法。

2、其中算法是我主要负责的,算法(algorithm)是一系列解决问题的清晰指令 ,算法代表 着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得 所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。 不同的算法可能用不同的时间、空间或效率来完成同样的任务。 关键词:游戏,系统,图片,算法, visual c+ abstract this paper mainly expounds on object-oriented programming language for development tools, design of vc

3、 + + a renju game. this system is a small game, can use single, also can network two game, can also and computer games. it firstly introduces the development background and development of language is introduced. and then introduced the design frame structure of the game, then introduces the design p

4、rocess of the program, and the related algorithm procedures. among them is i mainly responsible for the algorithm, the algorithm (done) is a series of the solution to the problem of clear instructions, the algorithm represents a systematic approach describe the solving strategy mechanism. that is, t

5、o some of the standard input, in limited time get required output. if an algorithm with a defect, or is not suitable for a problem is, carry out the algorithm will not solve the problem. different algorithm may use different time, space or efficiency to complete the same task. keywords: the game, th

6、e system, pictures,algorithm, visual c + + 山东凯文科技职业学院 目目 录录 1 引言.1 1.1五子棋介绍.1 1.2开发背景.1 1.3开发环境及运行环境.1 1.3.1开发环境.1 1.3.2运行环境.1 2 c+简介.2 3软件架构.2 3.1棋盘类.3 3.2游戏模式类.3 4主要算法.4 4.1判断胜负.4 4.2人机对弈算法.6 4.2.1获胜组合.6 4.2.2落子后处理.7 4.2.3查找棋盘空位.7 4.2.4落子打分.8 4.2.5防守策略.10 4.2.6选取最佳落子.11 4.2.7 统计数据.11 5几点补充说明.15 6心

7、得体会.15 参考文献.16 致谢.16 山东凯文科技职业学院 1 1 引言 1.1五子棋介绍 五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“連珠” ,英译为 “renju” ,英文称之为“gobang”或“fir” (five in a row 的缩写) ,亦有“连五子” 、 “五子连” 、 “串珠” 、 “五目” 、 “五目碰” 、 “五格”等多种称谓。 五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休 闲的明显特征“短、平、快” ,又有古典哲学的高深学问“阴阳易理” ;它既有简单易学的特性,为 人民群众所喜闻乐见,又有深奥的技巧和高水平

8、的国际性比赛;它的棋文化源渊流长,具有东方的 神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理 的结晶。 1.2开发背景 当前网络上流传的五子棋游戏功能并不尽善尽美,其中最主要的问题就是人机对战和网络对战 不能够一起实现,所以我决定开发1一个既能够人机对战,又能够进行网络对战的五子棋系统。 1.3开发环境及运行环境 1.3.1开发环境 intel pentium y450,2g 内存,320g 硬盘 microsoft windows xp professional microsoft visual c+ 6.0 microsoft developer n

9、etwork for visual studio.net 2003 visual assist x 10.1.1301.0 1.3.2运行环境 intel pentium 2 及以上处理器,32m 以上内存,4g 以上硬盘 microsoft windows 9x/nt 操作系统 800*600 或以上的屏幕分辨率 山东凯文科技职业学院 2 2 c+简介 语言之所以要起名为 “c” ,是因为它是主要参考那个时候的一门叫b 的语言,它的设计 者认为 c 语言是 b 语言的进步,所以就起名为 c 语言;但是 b 语言并不是因为之前还有个 a 语言,而是 b 语言的作者为了纪念他的妻子,他的妻子名字

10、的第一个字母是 b; 当 c 语言 发展到顶峰的时刻,出现了一个版本叫c with class,那就是 c+最早的版本,在 c 语言中 增加 class 关键字和类,那个时候有很多版本的c 都希望在 c 语言中增加类的概念;后来 c 标准委员会决定为这个版本的c 起个新的名字,那个时候征集了很多种名字,最后采纳了其中 一个人的意见,以 c 语言中的+运算符来体现它是 c 语言的进步,故而叫 c+,成立了 c+ 标准委员会。 c+是一种语言,仅仅是它的语法、特性、标准类库就已经是一门非常高深的课程, c+设计成静态类型、和 c 同样高效且可移植的多用途程序设计语言。设计成直接的和广泛的 支援多种

11、程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。 设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。设计成尽可能与c 兼 容,籍此提供一个从 c 到 c+的平滑过渡。避免平台限定或没有普遍用途的特性。不使用会带 来额外开销的特性。设计成无需复杂的程序设计环境。 c+标准演变了许多年。c+模板是近几年来对此语言的一种扩展,模板是根据类型参数来产生 函数和类的机制,有时也称模板为“参数化的类型” 。使用模板,可以设计一个对许多类型的数据 进行操作的类,而不需要为每个类型的数据建立一个单独的类。标准模板库(standard tempalte library,s

12、tl )和微软的活动模板库(active tempalte library,atl )都基于这个 c+语言扩展。 c+标准可分为两部分, c+语言本身和 c+标准库。c+标准库对于 visual c+是相当新的, 实际上微软只是在发布 visual c+ 5.0 时去除了一些“bug” 。标准库提供了标准的输入/输出、字 符串、容器(如矢量、列表和映射等)、非数值运算(如排序、搜索和合并等)和对数值计算的支持。 应该说, c/c+包含了相对少的关键字,而且很多最有用的函数都来源于库,c+标准库实现容器 和算法的部分就是 stl。 stl 是数据结构和算法的一个框架,数据结构包括矢量、列表和映射

13、等,算法包括这些数据 结构的查找、拷贝和排序等。1994 年 7 月,ansi/iso c+标准委员会投票决定接受 stl 为 c+标准 库的一部分,这个建议是根据 alex stepanov、meng lee 和 david musser 这三人的编程和软件库 研究提出的。stl 的产生是为了满足通用性的设计目标,而不是为了提高性能。 3软件架构 软件的总体架构如图 3.1: 山东凯文科技职业学院 3 图 3.1 软件架构 考虑到整个的下棋过程(无论对方是电脑抑或其他网络玩家)可以分为:己方落子、等待对方 落子、对方落子、设置己方棋盘数据这一系列过程,因此一人游戏类、二人游戏类和棋盘类之间的

14、 关系参考了 abstractfactory(抽象工厂)模式,以实现对两个不同模块进行一般化的控制。2 3.1棋盘类 整个架构的核心部分,类名为 ctable。封装了棋盘的各种可能用到的功能3,如保存棋盘数据、 初始化、判断胜负等。用户操作主界面,主界面与 ctable 进行交互来完成对游戏的操作。 3.2游戏模式类 用来管理人机对弈/网络对弈两种游戏模式,类名为 cgame。cgame 是一个抽象类,经由它派 生出一人游戏类 conegame 和网络游戏类 ctwogame,如图 3.2: 图 3.2 cgame 类派生关系 一人游戏类二人游戏类 棋盘类 主界面 用户 抽象类 cgame c

15、onegamectwogame 游戏类指针 山东凯文科技职业学院 4 这样,ctable 类就可以通过一个 cgame 类的指针4,在游戏初始化的时候根据具体游戏模式 的要求实例化 conegame 或 ctwogame 类的对象;然后利用多态性5,使用 cgame 类提供的公 有接口就可以完成不同游戏模式下的不同功能了。 4 4主要算法主要算法 五子棋游戏中,有相当的篇幅是算法的部分。无论是人机对弈,还是网络对弈,都需要合理算 法的支持,本节中将详细介绍五子棋中使用的算法。13 4.14.1判断胜负判断胜负 五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的右、下、右下、左下四个方向

16、是否有连续的五个同色棋子出现,如图4.1: 图 4.1 判断胜负方向 这个算法也就是 ctable 的 win 成员函数。从设计的思想上,需要它接受一个棋子颜色的参数, 然后返回一个布尔值,这个值来指示是否胜利,代码如下: bool ctable:win( int color ) const int x, y; / 判断横向 for ( y = 0; y 15; y+ ) for ( x = 0; x 11; x+ ) if ( color = m_dataxy / 判断纵向 for ( y = 0; y 11; y+ ) for ( x = 0; x 15; x+ ) if ( color

17、= m_dataxy / 判断“”方向 for ( y = 0; y 11; y+ ) for ( x = 0; x 11; x+ ) if ( color = m_dataxy 山东凯文科技职业学院 6 / 判断“/”方向 for ( y = 0; y 11; y+ ) for ( x = 4; x 15; x+ ) if ( color = m_dataxy / 不满足胜利条件 return false; 需要说明的一点是,由于这个算法所遵循的搜索顺序是从左到右、自上而下,因此在每次循环 的时候,都有一些坐标无需纳入考虑范围。例如对于横向判断而言,由于右边界所限,因而所有横 坐标大于等于

18、11 的点,都构不成达到五子连的条件,所以横坐标的循环上界也就定为 11,这样也 就提高了搜索的速度。 4.24.2人机对弈算法人机对弈算法 人机对弈算法完全按照 cgame 基类定义的接口标准,封装在了 conegame 派生类之中。下面将 对这个算法进行详细地介绍。14 4.2.1获胜组合 获胜组合是一个三维数组,它记录了所有取胜的情况。也就是说,参考于 ctable:win 中的情 况,对于每一个落子坐标,获胜的组合一共有 15 * 11 * 2 + 11 * 11 * 2 = 572 种。 而对于每个坐标的获胜组合,应该设置一个1515572大小的三维数组。 山东凯文科技职业学院 7

19、在拥有了这些获胜组合之后,就可以参照每个坐标的 572 种组合给自己的局面和玩家的局面进 行打分,也就是根据当前盘面中某一方所拥有的获胜组合多少进行权值的估算,给出最有利于自己 的一步落子坐标。 由于是双方对弈,所以游戏的双方都需要一份获胜组合,也就是: bool m_computer1515572; / 电脑获胜组合 bool m_player1515572; / 玩家获胜组合 在每次游戏初始化(conegame:init)的时候,需要将每个坐标下可能的获胜组合都置为 true。 此外,还需要设置计算机和玩家在各个获胜组合中所填入的棋子数: int m_win2572; 在初始化的时候,将每

20、个棋子数置为 0。 4.2.2落子后处理 每当一方落子后,都需要作如下处理: 如果己方此坐标的获胜组合仍为 true,且仍有可能在此获胜组合处添加棋子,则将此获 胜组合添加棋子数加 1; 如果对方此坐标的获胜组合仍为 true,则将对方此坐标的获胜组合置为 false,并将对方 此获胜组合添加棋子数置为-1(不可能靠此组合获胜) 。 以玩家落子为例,代码为: for ( i = 0; i 572; i+ ) / 修改状态变化 if ( m_playerstepput.xstepput.yi if ( m_computerstepput.xstepput.yi ) m_computerstepp

21、ut.xstepput.yi = false; m_win1i = -1; 山东凯文科技职业学院 8 4.2.3查找棋盘空位 在计算机落子之前,需要查找棋盘的空位,所以需要一个 searchblank 成员函数完成此项工作, 此函数需要进行不重复的查找,也就是说,对已查找过的空位进行标记,并返回找到空位的坐标, 其代码如下: bool conegame:searchblank( int for ( x = 0; x 15; x+ ) for ( y = 0; y 15; y+ ) if ( nowtablexy = -1 j = y; return true; return false; 4.

22、2.4落子打分 找到空位后,需要对这个点的落子进行打分,这个分数也就是这个坐标重要性的体现,代码如 下: int conegame:givescore( const step for ( i = 0; i getcolor() = stepput.color ) / 玩家下 if ( m_playerstepput.xstepput.yi ) switch ( m_win0i ) case 1: nscore -= 5; break; case 2: nscore -= 50; break; case 3: nscore -= 500; break; case 4: nscore -= 500

23、0; break; default: break; else / 计算机下 if ( m_computerstepput.xstepput.yi ) switch ( m_win1i ) case 1: nscore += 5; break; case 2: 山东凯文科技职业学院 10 nscore += 50; break; case 3: nscore += 100; break; case 4: nscore += 10000; break; default: break; return nscore; 如代码所示,考虑到攻守两方面的需要,所以将玩家落子给的分数置为负值。 4.2.5防守

24、策略 落子的考虑不单单要从进攻考虑,还要从防守考虑。这一细节的实现其实就是让计算机从玩家 棋盘布局分析战况,然后找出对玩家最有利的落子位置。整个过程如下: for ( m = 0; m getcolor(); step.x = i; step.y = j; ptemp = givescore( step ); if ( pscore ptemp ) / 此时为玩家下子,运用极小极大法时应选取最小值 pscore = ptemp; for ( m = 0; m cscore ) cscore = ctemp + pscore; bestx = pi; besty = pj; 在这之后,重新改变一

25、下棋盘的状态(4.2.2)即可。 山东凯文科技职业学院 12 4.2.7 统计数据 在对战结束的时候我们可以查询一下我们的胜率和一些别的战斗情况。 代码如下: cstatdlg:cstatdlg(cwnd* pparent /*=null*/) : cdialog(cstatdlg:idd, pparent) /afx_data_init(cstatdlg) / note: the classwizard will add member initialization here /afx_data_init void cstatdlg:dodataexchange(cdataexchange*

26、pdx) cdialog:dodataexchange(pdx); /afx_data_map(cstatdlg) / note: the classwizard will add ddx and ddv calls here /afx_data_map begin_message_map(cstatdlg, cdialog) /afx_msg_map(cstatdlg) on_bn_clicked(idc_btn_reset, onbtnreset) /afx_msg_map end_message_map() / cstatdlg message handlers bool cstatdl

27、g:oninitdialog() cdialog:oninitdialog(); 山东凯文科技职业学院 13 / todo: add extra initialization here / 读取姓名 ctable *ptable = (ctable *)getparent()-getdlgitem( idc_table ); setdlgitemtext( idc_st_name, ptable-m_strme ); showstat(); return true; / return true unless you set the focus to a control / exception:

28、 ocx property pages should return false void cstatdlg:onok() / todo: add extra validation here cfiveapp *papp = (cfiveapp *)afxgetapp(); / 写入战绩统计 tchar str10; wsprintf( str, _t(%d), papp-m_nwin ); :writeprivateprofilestring( _t(stats), _t(win), str, papp-m_szini ); wsprintf( str, _t(%d), papp-m_ndra

29、w ); :writeprivateprofilestring( _t(stats), _t(draw), str, papp-m_szini ); wsprintf( str, _t(%d), papp-m_nlost ); :writeprivateprofilestring( _t(stats), _t(lost), str, papp-m_szini ); cdialog:onok(); void cstatdlg:onbtnreset() / todo: add your control notification handler code here cfiveapp *papp =

30、(cfiveapp *)afxgetapp(); papp-m_nwin = 0; papp-m_ndraw = 0; papp-m_nlost = 0; showstat(); 山东凯文科技职业学院 14 void cstatdlg:showstat() cfiveapp *papp = (cfiveapp *)afxgetapp(); cstring str; str.format( _t(%d), papp-m_nwin ); setdlgitemtext( idc_st_win, str ); str.format( _t(%d), papp-m_ndraw ); setdlgitem

31、text( idc_st_draw, str ); str.format( _t(%d), papp-m_nlost ); setdlgitemtext( idc_st_lost, str ); / 计算胜率 if ( 0 = papp-m_nwin ) str = _t(胜率:0%); else str.format( _t(胜率:%d%), papp-m_nwin * 100 / ( papp-m_nwin + papp- m_ndraw + papp-m_nlost ) ); setdlgitemtext( idc_st_percent, str ); 代码执行后的效果图如下: 山东凯文

32、科技职业学院 15 图 4.2 效果图 5 5几点补充说明几点补充说明 考虑到程序的响应速度,人机对弈算法只对玩家的棋子进行了一步的推测。 由于计算机在落子时选取的是得分最高的一步落子,所以如果玩家在开局的时候不改变落 子步骤,那么将会获得从头至尾相同的棋局。 考虑到下棋同时还要聊天,所以并未对落子时间加入任何限制,同样如果玩家离开游戏也 不会判负。 对于人机对弈的悔棋处理,由于这个算法的开销相当大,每一步落子都会存在不同的棋盘 布局,所以实现从头到尾的悔棋不是很现实(将会存在过多的空间保存棋盘布局) ,因而 在人机对弈模式下,只允许玩家悔最近的两步落子。 6 6心得体会心得体会 经过这段时间

33、的紧张忙碌,这次的毕业设计已制作了一个较完整的五子棋游戏,从各方面来讲, 都有比较大的收获,同时也大大提高了实际操作的能力,当然,期间遇到的困难也是层出不穷。由 于对游戏的概念比较模糊,在前期的编程设计过程中脑海中仅仅有一个框架,而很多却细节没有考 虑到,结果一度走入一边编程,一边改模版的尴尬境地,进度缓慢,思路不清。后来,在艰难进展 的过程中渐渐领悟到了一些编程的方法和系统设计的思想,所谓眼过千遍不如手过一遍,在自己实 际操作中暴露出来的问题自己的体会最深刻,也就更有想法去克服他。在困境中摸索,总结,转变 思路,继续前进,这是对我制作本游戏过程的一个概括。 在不断的学习与改进中我体会到: 1.做毕业设计本身也是一个学习新鲜事物的过程,从设计初的不懂到最后顺利完成设计,我体会

温馨提示

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

评论

0/150

提交评论