154.A五子棋游戏的单机版及网络版的实现 毕业论文_第1页
154.A五子棋游戏的单机版及网络版的实现 毕业论文_第2页
154.A五子棋游戏的单机版及网络版的实现 毕业论文_第3页
154.A五子棋游戏的单机版及网络版的实现 毕业论文_第4页
154.A五子棋游戏的单机版及网络版的实现 毕业论文_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

1、本本 科科 生生 毕毕 业业 论论 文文 题 目:五子棋游戏的单机版及网络版的实现 院 系:信息科学与技术学院 计算机科学系 专 业: 网络工程 学生姓名: xxx 学 号: xxx 指导教师: xxx 源代码联系本人 二九 年 三 月 摘摘 要要 随着 it 技术的发展,很多日常生活中的游戏都被搬到了计算机里供大众娱乐,尤其是博弈 类的棋类游戏,如中国象棋,围棋,五子棋等,近年来人们对人工智能技术的研究成果更使得 计算机在这些博弈游戏中能战胜很多玩家。 本文结合五子棋这个游戏的特点,将阐述单机版五子棋的算法设计,突出人工智能在博弈 方面的应用,旨在试验人工智能里的一些搜索算法,最终确定人工智

2、能在未来各学科里的重要 应用性;最后还涉及网络版五子棋的设计实现,同时介绍一般网络游戏的架构。 第一章简要介绍五子棋相关的状况。第二章概述了人工智能与五子棋相关的各种算法。第 三章详细描述本设计所使用的人工智能算法。第四章讲述一般网络游戏的架构以及本设计中网 络版五子棋的实现细则。第五章总结本次设计过程中的各种收获。 关键词:关键词:五子棋; 人工智能; 博弈; 网络游戏 abstract with the development of it technology, a lot games in daily life have been moved to the computer for pu

3、blic entertainment, especially the game of chess-type games, such as chinese chess, the game of go , gobang , etc., in recent years , artificial intelligence research makes the results that computer can overcome a lot of players in these games. in this paper, with the characteristics of gobang ,i wi

4、ll describe algorithm design on stand-alone version of gobang ,to highlight the application of artificial intelligence in the game , and test some search algorithms of artificial intelligence , and ultimately determine the important application of artificial intelligence in the various disciplines ;

5、 finally the paper also involves the design of implementation gobang online version , at the same time introduces the general architecture of online games. chapter i briefly introduce the relevant situation of gobang. chapter ii provides an overview of artificial intelligence and gobang related algo

6、rithms. chapter iii detailed description of the design of algorithms used in artificial intelligence. chapter iv on the general network architecture of the games as well as the online version of the design in the implementation details.chapter v summarized the harvest of the designing. keywords: gob

7、ang;artificial intelligence;game;online game 目目 录录 第一章第一章前言前言.1 1.1 五子棋的棋盘.1 1.2 五子棋的基本规则.2 第二章第二章 人工智能的应用人工智能的应用.5 2.1 人工智能的发展历史.5 2.2 人工智能研究的特点.7 2.3 人工智能的应用.7 2.4 博弈算法极大极小搜索算法.9 第三章第三章 五子棋单机部分详细设计五子棋单机部分详细设计.12 第四章第四章 五子棋联机部分详细设计五子棋联机部分详细设计.19 4.1 联机网络游戏概述.19 4.2 联机五子棋的设计.20 第五章第五章 结论结论.24 参考文献参考

8、文献.29 致谢致谢.30 第一章第一章前言前言 五子棋是我国古代的、传统的黑白棋种之一,大约在南北朝时期随围棋一起 先后传入朝鲜、日本等地。五子棋在日本叫“连珠棋” ,英文称之为“gobang” 或者 fir(five in a row 的缩写) , 亦有“连五子” , “五子连” , “串珠”., “五目” , “五目碰”等多种称谓1。 通过一系列的规则变化使连珠五子棋这一简单的游戏复杂化、规范化,而最终成为今天的职业 连珠五子棋,同时也成为一种国际比赛棋。 1988 年 8 月 8 日,国际连珠联盟( ri f )由日 本、 俄罗斯、瑞典、亚美尼亚等九个成员 国在瑞典宣告成立。五子棋在国

9、内外发展速度相当快,预计在几年后,五子棋能在很多国家形 成热门运动。 我国也不例外, 在很多热衷于五子棋事业的棋手的共同努力下,有望在不久的 将来成为五子棋运动的中心。 随着我国经济社会的快速发展,人们生活水平不断提高,人们的生活观念发生改变,高质 量的生活、现代化的生活方式成为人们追求的目标,休闲、 娱乐性体育活动作为时尚生活的一 部分, 被越来越多的人所追捧。 棋类项目作为一种智力性体育项目, 可以修身养性、 益智 健心, 也可以满足人们对于休闲和娱乐的需求. 一些项目如五子棋等由于项目自身的特点和生 命力, 也一直被人们所喜爱, 因此得以生存和发展, 成为许多人喜爱的休闲娱乐性棋类项目。

10、 随着时代的发展、社会的进步和人民生活水平的提高, 人们对业余体育文化生活方面的需求会 不断增加, 这些“ 趣味性”棋类项目 将会越来越受到关注和重视。 1.1 五子棋的棋盘五子棋的棋盘 五子棋的棋盘如图 1 所示,正中一点为“天元” 。棋盘两端的横线称端线。棋盘左右最外 边的两条纵线称边线。从两条端线和两条边线向正中发展而纵横交叉在第四条线形成的四个点 称为“星” 。天元和星应在棋盘上用直径约为 0.5 厘米的实心小圆点标出。 图 1 五子棋棋盘示意图 以持黑方为准,棋盘上的纵轴线从左到右用英文字母 ao 标记。横行线从近到远用数字 115 标记。纵横轴上的横纵线交叉点分别用横纵线标记的名称

11、合写成。如“天元”h8,四个 “星”分别为 d4,d12,l12,l4。 1.2 五子棋的基本规则五子棋的基本规则 黑白双方依次落子, 任一方先在棋盘上形成横向,竖向,斜向的连续的相同颜 色的五个( 含五个以上) 棋子的一方为胜。2 1)连 在棋阳线和阴线的任意一条线上形成的有 5 个或 5 个以上的同色棋子不间 隔地紧紧相连。五连:在棋盘上形成的 5 个同色棋子的“ 连” 。长连:在棋盘上形成的 6 个或 6 个以上同色棋子的“ 连” 。 2) “四”包括“活四”和“冲四” 。 活四:如图 2 所示,在棋盘某一条阳线或阴线上有同色 4 子不间隔地紧紧相连,且在此 4 子两端延长线上各有一个无

12、子的交叉点与此 4 子紧密相连。 图 2 活四 冲四:除“ 活四” 外的,再下一着棋便可形成五连,并且存在五连的可能性的局面。白棋 再下一着可形成长连的局面也视为“四” ,如图 3 所示。 图 3 黑棋各种不同的冲四 3) “三”指活三,包括“连三”和“跳三” 。 连三:在棋盘某一条阳线或阴线上有同色三子相连,且在此三子两端延长线 上有一端至少有一个,另一端至少有两个无子的交叉点与此三子紧密相连。 跳三:中间仅间隔一个无子交叉点的连三, 但两端延长线均至少有一个无子 的交叉点与此三子相连。 4)禁手:对局中禁止使用的着法。 黑棋禁手包括“三三” , “ 四四” 和“ 长连” , 禁手只对黑棋而

13、言。 三三:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方“ 活” 的局面,如图 4 所示。 图 4 三三禁手 四四:由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方“ 四” 的局面。 5 )先手 对方必须应答的着法,其中“ 冲四“ 称为绝对先手。 6 )四三 指某一方同时具备两个先手,其中一个是“ 四” ,一个是“ 活三”. 7 )三手可交换 是指黑棋下盘面第 3 着棋后,白方在应白之前,如感觉黑方棋形不利于己方,可提出交 换,即执白棋一方变为执黑棋一方,而黑方不可以不换。 8 )五手两打 是指黑棋在下盘面上关键的第五手棋时, 必须下两步棋,让白 棋在这两步棋中任选一步, 然后

14、再继续对弈。一般说来,白棋肯定拿掉对白方不利的一点, 而 保留对黑方较为不利的那点让黑方行棋。 第二章第二章 人工智能的应用人工智能的应用 2.1 人工智能的发展历史人工智能的发展历史 1.1. 萌芽时期(萌芽时期(19561956 年以前)年以前) 17 世纪,法国物理学家 b.pascalb.pascal 制成的机械加法器机械加法器; 在其基础上,德国数学家 leibnizleibniz 制成了四则运算的计算器计算器。 1936 年 英国数学家 turningturning 提出了图灵机模型; 1938 年 德国工程师 zusezuse 研制成了第一台累计数字计算机数字计算机; 1946

15、年 美国诞生了第一台电子数字计算机电子数字计算机 eniaceniac; 1945 年,奥地利学者系统论的创立 1948 年,美国数学家 n.wiener 控制论的创立; 1948 年,美国数学家 c.e.shannon 信息论的创立; 2.2. 形成时期(形成时期(1956-19611956-1961 年)年) 1956 年,在美国 dartmouth 大学的一次历史性聚会是人 工智能学科正式诞生的标志。有三个较有影响的研究团队: 心理学小组心理学小组:a.newella.newell、j.shawj.shaw 和和 h.simonh.simon 等人于等人于 1957 年编制出逻辑理论机

16、lt,证 明了数学原理中第 2 章的 38 条定理,1963 年的新版 lt 证明了该章全部共 52 条定 理。1960 年,通用问题求解器 gps 能求解 10 种不同类课题的问题 ibmibm 研究小组研究小组:a.samuela.samuel 研究的具有自学习、自组织和自适应能力的西洋跳棋程序, 1959 年,该程序战胜了设计者,1962 年,战胜了美国的一个州冠军。 mitmit 研究小组:研究小组:1959 年,mccarthy 发明了人工智能主要的语言 lisp。1958 年开发了行 动计划咨询系统。1960 年 minsky 的论文:走向人工智能的步骤。 其他:其他:1956 年

17、 n.chomsky 的文法体系、1958 年 shelffridge 的模式识别系统等,都对 人工智能研究产生了有益的影响。 3.3. 发展时期(发展时期(19611961 年以后)年以后) 符号主义学派方面: 1965 年,j.a.robinson 的归结原理,推动了定理机器证明技术的发展: 1965 年,e.a.feigenbaum 研制的基于领域知识和专家知识的 dendral 程序,能根据质 谱仪的数据并利用相关知识,推断出有机化合物的分子结构,达到甚至超过了化学家的 水平。后来又有医学专家系统 mycin 系统、地质矿产勘探专家系统 prospector、计算机 配置专家系统 r1

18、 等等。 1969 年,c.green 提出了基于一阶谓词演算方法。 1973 年,r.f.simmon 提出语义网结构。 1972 年,m.minsky 提出框架结构。 1972 年,法国马赛大学 a.colmerauer 等提出了逻辑程序设计语言 prolog。 1977 年,e.a.feigenbaum 提出了“知识工程”的概念,人工智能的研究从以推理为中 心转向以知识为中心,进入了所谓的知识期。 进入 20 世纪 80 年代后,专家系统和知识工程在理论、技术和应用方面都有长足的进步 和发展。 o专家系统的建造进入了应用高级开发工具阶段。 o出现了多专家系统、大型专家系统、微专家系统等。

19、 o专家系统和知识工程技术已应用到各种计算机应用系统中,出现了智能管理信息系统、 智能决策支持系统、智能控制系统、智能 cad 系统、智能 cai 系统、智能数据库系统和 智能多媒体系统等等。 o知识表示、不确定性推理等方面都取得了重大的进展。 连接主义学派方面 1943 年,mcculloch 和 pitts 第 1 次提出模拟神经元 。 1957 年,p.rosenblatp.rosenblat 开发了所谓感知机(perception)的单层神经网络。 1962 年,b.windrow.windrow 提出了自适应线性元件(asaline),并应用于天气预报、电子线路 板分析、人工视觉等许

20、多问题。 1969 年,m.l.minskym.l.minsky 应用数学理论深入分析了单层神经网络,证明它不能实现异或门 的功能,使神经网络系统研究热潮迅速降温。 1982 年,j.hopfield.hopfield 提出了一种全互联的神经元网络,并于 19851985 年成功地求解了 tsptsp 问题(几秒内求解(几秒内求解有 3131 个城市的 tsptsp 问题) 。 1985 年,rumelhart 提出了反向传播(bp)算法,解决了多层人工神经网络的学习问题, 使冷落了 20 多年的神经网络研究又东山再起。 此后神经网络在智能控制、语言识别、图形文字识别、最优化问题求解和智能计算

21、机 等领域进行了实践并取得了一系列的成果。3 2.2 人工智能研究的特点人工智能研究的特点 人工智能是一门知识的科学。以知识为对象,研究知识的获取、表示和使用。 人工智能的系统过程是,数据处理-知识处理,数据-符号。符号表示的是知识而不是数值、 数据。 问题求解过程有启发,有推导。 人工智能是引起争论最多的科学之一。 问题焦点:当前人工智能的研究应该以人类的普遍思维规律为主,还是以特定知识的处理 和运用为主?智能的本质是什么?机器能达到人的水平吗?总而言之,人工智能研究是非常困 难的。 万能的逻辑推理体系至今没有创造出来,并不是因为人工智能专家的本事不够,而是因为 这种万能的体系从根本上就是不

22、可能有的。他最大的弱点就是缺乏知识,缺乏人类在几千年的 文明史上积累起来的知识,在实际生活中,人是根据知识行事的,而不是根据在抽象原则上的 推理行事的。 即使就推理体系来说,它的主要技术是状态空间搜索,而在执行中遇到的主要困难就是 组合爆炸 ,事实表明,单靠一些思维原则是解决不了组合爆炸问题的,要摆脱困境,只有大 量使用理性的知识。 2.3 人工智能的应用人工智能的应用 1、问题求解。 人工智能的第一大成就是下棋程序,在下棋程度中应用的某些技术,如向前看几步,把 困难的问题分解成一些较容易的子问题,发展成为搜索和问题归纳这样的人工智能基本技术。 今天的计算机程序已能够达到下各种方盘棋和国际象棋

23、的锦标赛水平。但是,尚未解决包括人 类棋手具有的但尚不能明确表达的能力。如国际象棋大师们洞察棋局的能力。另一个问题是涉 及问题的原概念,在人工智能中叫问题表示的选择,人们常能找到某种思考问题的方法,从而 使求解变易而解决该问题。到目前为止,人工智能程序已能知道如何考虑它们要解决的问题, 即搜索解答空间,寻找较优解答。 2、 自然语言处理。 自然语言的处理是人工智能技术应用于实际领域的典型范例,经过多年艰苦努力,这一 领域已获得了大量令人注目的成果。目前该领域的主要课题是:计算机系统如何以主题和对话 情境为基础,注重大量的常识世界知识和期望作用,生成和理解自然语言。这是一个极其 复杂的编码和解码

24、问题。 3、逻辑推理与定理证明。 逻辑推理是人工智能研究中最持久的领域之一,其中特别重要的是要找到一些方法,只 把注意力集中在一个大型的数据库中的有关事实上,留意可信的证明,并在出现新信息时适时 修正这些证明。对数学中臆测的题。定理寻找一个证明或反证,不仅需要有根据假设进行演绎 的能力,而且许多非形式的工作,包括医疗诊断和信息检索都可以和定理证明问题一样加以形 式化,因此,在人工智能方法的研究中定理证明是一个极其重要的论题。 4、专家系统。 专家系统是目前人工智能中最活跃、最有成效的一个研究领域,它是一种具有特定领域内 大量知识与经验的程序系统。近年来,在“ 专家系统”或“ 知识工程”的研究中

25、已出现了成 功和有效应用人工智能技术的趋势。人类专家由于具有丰富的知识,所以才能达到优异的解决 问题的能力。那么计算机程序如果能体现和应用这些知识,也应该能解决人类专家所解决的问 题,而且能帮助人类专家发现推理过程中出现的差错,现在这一点已被证实。如在矿物勘测、 化学分析、规划和医学诊断方面,专家系统已经达到了人类专家的水平。成功的例子如: prospector 系统发现了一个钼矿沉积,价值超过 1 亿美元。dendrl 系统的性能已超过一 般专家的水平,可供数百人在化学结构分析方面的使用。my cin 系统可以对血液传染病的诊断 治疗方案提供咨询意见。经正式鉴定结果,对患有细菌血液病、脑膜炎

26、方面的诊断和提供治疗 方案已超过了这方面的专家。 5、智能信息检索技术。 信息获取和精化技术已成为当代计算机科学与技术研究中迫切需要研究的课题,将人工 智能技术应用于这一领域的研究是人工智能走向广泛实际应用的契机与突破口。 4 2.4 博弈算法极大极小搜索算法博弈算法极大极小搜索算法 1 . 博弈树一与或图博弈树一与或图 grundy 游戏 有一堆数目为 n 的钱币,由两位选手轮流进行分堆,要求每个选手每次只把其中某一堆分 成数目不等的两小堆。 例如选手甲把 n 分成两堆后, 轮到乙就可以挑其中一堆来分, 如此进 行下去, 直到有一位选手先无法把钱币分成不相等的两堆时就得认输. 5 钱币问题分

27、析: 如果用数字序列 x1 xn 表示 n 堆钱币不同个数,再用两个说明符号 max,min 表示选手,那 么(x1, ,xn,m)表示某个选手的走步状态,规则 if(x1, ,xn,max) and (xi=y+z 而对于 ma x 扩展出的所有 mi n 节点, 要确保 ma x 节点获胜,必须所有 mi n 节点都是必败节点;因此对 ma x 层节点来说,是一个“ 或”的概 念,而对于 mi n 层节点,是一个“ 与”的概念。由此扩展出来的博弈树,称为“与或图” 。 2.极大极小算法极大极小算法 博弈程序的任务就是对博弈树进行搜索找出当前最优的一步行棋。 对博弈树进行极大极小搜索, 可以

28、达到这一目的。极大极小搜索,是因为博弈双方所要达到的目的相反, 一方要寻找的利 益恰是一方失去的利益, 所以博弈的一方总是希望下一走是儿子节点中取值最大者, 而另一 方恰恰相反。 这便形成了极大极小过程。 当然,程序不能也没有必要做到搜索整棵博弈树的所有节点,对于一些已经确定为不佳的 走步可以将以它为根节点的子树剪掉。 而且,搜索也不必真地进行到分出胜负的棋局,只需要在一定深度范围内对局面进行评价 即可。 只有搜索空间缩小到一定程度, 搜索才可以真正的进行。当搜索进行到一定深度, 用 局面评价机制来评价棋局, 按照极大极小的原则选出最优,向上回溯, 给出这一局面的父亲 节点的价值评价,然后再继

29、续向上回溯,一 直到根节点,最优走步就是这样搜索出来的。例如: 设计一个评估函数 f,对所有棋局进行评估。 = 我方胜定的棋局 n 0 对我方有利的棋局 n, f(n) =0 和局或双方势均力敌的棋局 n, 0 对我方不利的棋局 n =- 我方败定的棋局 n 基本思想:考虑双方向前对弈若干步,然后作出决策,从可能的走法中选择对自己最有利的走 法。即考虑与或树(状态空间)的若干层,我方(max)走棋时,选择下一层评估值最大的方向走棋, 对方(min)的走法选择下一层评估值最小的方向走棋,最后一层的结点直接用评估函数估算,然 后计算上层结点的倒推值,一般来说,考虑的层数越多,得到的倒推值就更准确。

30、 3.极大极小法过程描述极大极小法过程描述 a)t:=(s,max), open:=s, closed=(); b)loop1: if open=() then go loop2; c)n:=first(open), remove(n,open), add(n,closed) d)if n 可以直接判定胜、负或平局 then f(n) =或 -或 0 else expend(n)ni,add(ni,t) if d(ni)k then add(ni,open), go loop 1; else 计算 f(ni), go loop1 /到达深度 k e)loop2 :if closed=() th

31、en go loop3 else n =first(closed); f)if (npmax)且(f(ncimin)有值) then f(np)=max(f(nci),remove(np ,closed) /若 max 所有子节点均有值,则该 max 取其极大值 if (npmin)且(f(ncimax)有值) then f(np)=min(f(nci),remove(np ,closed /若 min 所有子节点均有值,则该 min 取其极小值 g)go loop2 h)loop3: if f(s) nil then exit(end m(move,t) 算法补充说明: 分两个阶段计算 f(

32、s) 用宽度优先法生成规定深度的全部博弈树,然后对其所有端节点计算其静态估计函数值。 从底向上逐级求非端节点的倒推估计值,直到求出初始节点的倒推值 f(s)为止。 根据 f(s)即可取得较好的走步 等对手响应后,再以当前状态为初始状态,重复调用该过程即可。 第三章第三章 五子棋单机部分详细设计五子棋单机部分详细设计 在本次“五子棋单机部分“程序的编写中,运用了博弈树进行搜索,在选取最优的走步时使用极 大极小分析法,考虑到搜索的时间复杂度和空间复杂度,在程序中只进行了2步搜索,即计算机 在考虑下一步的走法时,只对玩家进行一步的推测。 (程序中的棋盘规格为15*15) 下面对具体做法进行描述: 3

33、.13.1数据结构定义:数据结构定义: 棋盘定义:int board1515; 在15*15的棋盘上,获胜的情况总共有572种, 表 1 获胜的情况 * 如表1中的第一行“*“所代表的格子就是一种获胜组合。 计算机和玩家的获胜组合情况bool ctable1515572, bool ptable1515572,来表示棋盘上的各个位置都在那种获胜组合中。 计算机和玩家在各个获胜组合中所填入的棋子数int win2572,如有一方在某一获胜组合 的棋子数达到5个,该方即获胜。 bool player:是否轮到玩家下棋 bool computer:是否轮到计算机下棋 bool start:游戏是否开

34、始 bool pwin:玩家是否获胜 bool cwin:计算机是否获胜 cpoint m_pplastpos;/玩家走的前一步棋 cpoint m_pclastpos;/计算机走的前一步棋 为便于说明程序的主要算法,这里先说本程序中估价函数的选取方法: e=p1+p2; p1为下完当前这步棋时计算机的得分;p2为下完当前这步棋时玩家的得分(p2其实为负) , 这样做即考虑了进攻的因数,由考虑了防守的因数,两个方面都进行了考虑,防止计算机只考 虑进攻而忽略防守,同时也防止计算机只考虑防守而忽略进攻,从而达到比较好的情况。 3.23.2主要流程描述主要流程描述 其程序流程如下: (1)初始化棋盘

35、:判断哪方先开始, (2)初始化计算机和玩家的获胜组合情况 bool ctable1515572,bool ptable1515572 void initializeboard(),里面设置好ctable ptable win 等变量 (3)给出下了一个子后的分数:根据各个获胜组合里拥有的不同棋数来给不同的分数 int givescore(int type, int x, int y) int i,score=0; for(i=0;i572;i+) /计算机下 if(type=1) if(ctablexyi) switch(win1i) case 1: score+=5; break; cas

36、e 2: score+=50; break; case 3: score+=100; break; case 4: score+=10000; break; default: break; /人下 else if(ptablexyi) switch(win0i) case 1: score-=5; break; case 2: score-=50; break; case 3: score-=500; break; case 4: score-=5000; break; default: break; return score; (4)核心程序 , (5)即计算机如何运用极小极大法分析, (6

37、)选取最优走法, (7)在程序中极小极大法即体现在两个while循环前后及之间的内容,其估价函数的体现在 ctemp+pscore中 void comturn() /bestx,best为当前最佳位置,i,j是人能下的各种位置;pi,pj是计算机能下的各种位置 int bestx,besty,i,j,pi,pj,ptemp,ctemp,pscore=10,cscore=-10000, ctempboard1515,ptempboard1515; int m,n,temp120,temp220;/暂存第一步搜索的信息 if(start) if(board77=2) bestx=7; besty=

38、7; else bestx=8; besty=8; start=false; else /寻找最佳位置 getboard(ctempboard,board); while(searchblank(i,j,ctempboard) /进行第一步查找 n=0; pscore=10; getboard(ptempboard,board);/获取当前棋盘状态 ctempboardij=3;/标记已被查找 ctemp=givescore(1,i,j); for(m=0;mptemp)/此时为玩家下子,运用极小极大法时应选取最小值 pscore=ptemp; for(m=0;mcscore) /此时为计算机

39、下子,运用极小极大法时应选取最最大值 cscore=ctemp+pscore; bestx=pi; besty=pj; boardbestxbesty=1; if(m_pclastpos.x!=-1 else drawwhitechess(m_pclastpos.x,m_pclastpos.y); if(!m_bwfirst) drawnowblack(bestx,besty); else drawnowwhite(bestx,besty); m_pclastpos.x=bestx; m_pclastpos.y=besty; for(i=0;i572;i+) /修改计算机下子后,棋盘的变化状况

40、 if(ctablebestxbestyi if(ptablebestxbestyi) ptablebestxbestyi=false; win0i=7; computer=false; player=true; (8)玩家下棋:(其中坐标(9) 加减目的是调整图片的位置和棋盘对齐) void onlbuttondown(uint nflags, cpoint point) int x,y,tx,ty; / todo: add your message handler code here and/or call default if(player while(ty=36) ty-=36; tx

41、+=x/36; ty+=y/36; if(tx18) x=x/36+1; else x=x/36; if(ty18) y=y/36+1; else y=y/36; if(boardxy=2) boardxy=0;/设为玩家的棋子 if(m_pplastpos.x!=-1 else drawblackchess(m_pplastpos.x,m_pplastpos.y); if(!m_bwfirst) drawnowwhite(x,y); else drawnowblack(x,y); m_pplastpos.x=x; m_pplastpos.y=y; for(int i=0;i572;i+)/修

42、改玩家下子后棋盘状态的变化 if(i=80) i=80; if(ptablexyi if(ctablexyi) ctablexyi=false; win1i=7; player=false; computer=true; cdialog:onlbuttondown(nflags, point); (10) 程序流程的部分控制: void ontimer(uint nidevent) / todo: add your message handler code here and/or call default iswin();/是否已有一方获胜 if(pwin) /玩家获胜 killtimer(0

43、); messagebox(恭喜,您真厉害!); player=false; computer=false; m_binit=true; else if(cwin) /计算机获胜 killtimer(0); messagebox(抱歉,您输了); player=false; computer=false; m_binit=true; else /双方都没有获胜 if(computer) comturn(); cdialog:ontimer(nidevent); 第四章第四章 五子棋联机部分详细设计五子棋联机部分详细设计 4.1 联机网络游戏概述联机网络游戏概述 本设计里的网络版部分并不是平时的

44、网络游戏,它不需要另外的服务器,客户端程序同时 拥有了服务端的功能,但只能供两个直连用户(例如在同一局域网的用户)连机对战,概括的 说,它其实是一个简化后的“网络游戏” 。我们先了解一下一般网络游戏的架构。 系统大多数采用客户端/服务器(c/s)编程模式,tcp/ip 协议作为客户端和服务器的通信 网络层,.客户端采用 winsocket api 作为网络层。 系统采用多服务器分布式架构,由一个主服务器(mainserver)和多个从服务器(playserver) 同时工作以实现游戏逻辑和用户管理及通讯的功能。主服务器管理客户端用户身份验证、登录 以及管理从服务器的建立,由多个从服务器管理游戏

45、通信,大厅及房间,从服务器可任意添加、删除、 修改等。 系统首先启动主服务器(mainserver) ,主服务器从数据库中读取从服务器的所有信息到主 服务器的内存。首先读取 gametype 表以建立所有的游戏类型的基本信息,然后读取 serviceinfo(界面树结点信息表)以获得包括客户端界面结构、从服务器的信息、大厅和房间的 一切信息。当有客户端请求登录并成功和主服务器连接的时候,主服务器将这所有的信息一次 性发到客户端内存,客户端根据这些信息生成界面结构树。 主服务器启动后还可以在主服务器里创建多个从服务器及房间,创建完成后从服务器的 ip 地址及端口号就作为它的唯一标识被同时写进数据

46、库和主服务器的内存;房间号、房间所属的 游戏类型、所属的从服务器号也作为房间的唯一标识被同时写进数据库和主服务器的内存。 从服务器创建以后就在它所属的机器上启动。 客户端登录后首先和主服务器建立连接(并且一直到客户端退出才断开)连接成功后生成 界面结构树(前述) ,当用户点击某个游戏房间的时候系统从内存中读出这个房间的所有信息 (前述) ,根据房间所属从服务器的 ip 地址及端口号试图和这个从服务器建立连接,连接成功 后相应的从服务器就将这个房间的所有信息发到这个客户端,客户端收到以后就根据这些信息 生成房间。每当有客户端的游戏位置发生改变的时候就向从服务器发送改变信息,从服务器保 存、修改所

47、有与它连接的客户端的位置信息列表。 当一张桌子坐满时游戏开始。游戏开始后客户端也是和从服务器通信以更新游戏信息。 当客户端退出游戏后就回到大厅的这个房间,当退出大厅的时候首先和从服务器断开连接,然 后和主服务器断开连接,最后终止整个客户端程序。 三 模块结构 系统包括三大主要模块结构:mainserver,playserver,game.此外还有客户端安装,更新模 块等。在三大主要模块结构中还有子 dll(动态链接库)模块。 1)mainserver(exe 项目):封装主服务器功能,包括管理客户端用户身份验证、登录以及管 理从服务器的建立,数据库读写等。 2)playserver(exe 项

48、目):封装从服务器功能,包括管理客户端游戏通信,游戏逻辑,大厅及 房间等。 3)game(exe 项目):封装客户端所有功能,包括客户端登录,大厅及房间,客户端游戏通 信,游戏逻辑等。 4.2 联机五子棋的设计联机五子棋的设计 棋盘等的结构与前面的单机版是一样的,这里重点阐述联机版相关的操作: 4.2.1 与游戏相关的各种网络信息 消息类型,网络上传递的消息的类型,游戏开始,退出游戏,悔棋等 enum msg_type msg_startgame, msg_agreegame, msg_move, msg_chat, msg_back, msg_gameinfo, msg_exitgame,

49、; 传送的信息,传递消息的缓冲区以及消息的类型,类型就是上面的枚举类型 typedef struct _transfer_info msg_type msgtype; char datamax_transferbuf_size; transfer_buf,*ptransfer_buf; 用户信息,这个结构包括用户的名字,计算机 ip,输赢记录等 typedef struct _user_info char name24; char ip20; int win; int lose; int peace; int fasthand; user_info,*puser_info; 开始游戏,请求开始

50、游戏的用户名 typedef struct _startgame_info char name24; startgame_info,*pstartgame_info; 同意游戏,同意开始游戏的另一个用户名 typedef struct _agreegame_info char name24; agreegame_info,*pagreegame_info; 游戏过程中关于游戏的状态信息 typedef struct _game_info int gameinfo; / 1 认输 2 同意认输 4 平局 5 同一平局 6 不同意平局 / 7 悔棋 8 同意 9 不同意 game_info,*pg

51、ame_info; 聊天内容,加入聊天功能时要用到 typedef struct _chat_info char *chat; chat_info,*pchat_info; 落子信息,包括谁下子了,下到了哪个位置上 typedef struct _move_info int m_turn; intm_x; intm_y; move_info,*pmove_info; 总共落子信息 typedef struct _record_info int rear; move_info move225; record_info,*precord_info; 4.2.2 相关的类 由于是博弈游戏,所以我们需

52、要一个裁判类,该类管理棋盘的下子情况(哪些地方下了白 棋,哪些地方下了黑棋,哪些地方是空白的) ,管理某个位置是否能下棋,是否有一方已经胜出, 是否和棋等。 class cmatch /裁判类 public: cmatch(); virtual cmatch(); public: int chessboardlwlw; /0 表示没有子落下;1 表示黑子落下;2 表示白子落下 public: bool candown(int x,int y,int who); bool iswin(int who,int pos52); bool isheqi(); void clear(); ; 同时为便于

53、网络编程,我们还用到一个套接字类,用于方便我们初始化网络,连接另一台 计算机,发送和接收消息等。 class cmysocket public: cmysocket(); virtual cmysocket(); public: bool initsocket(hwnd hwnd); / 初始化网络 socket createsocket(); / 创建套接字 bool connectserver(socket sock,cstring ip); / 连接服务器 bool setclientasyncmodel(socket sock); / 设置客户端异步选择模型 bool setserve

54、rasyncmodel(socket sock); / 设置服务端异步选择模型 bool initserver(socket sock,cstring ip); / 初始化服务器 void recvbuf(socket sock); / tcp 接收消息 void sendbuf(socket sock,char *buf,int len); / tcp 发送消息 private: hwnd m_hwnd; ; 比较简单的游戏流程,当一玩家下一步棋后,首先调用裁判类看这步棋是否合规则,然后 更新相关的显示,同时调用 cmysocket 把相应的消息发到另一玩家,另一玩家收到消息后就 作出相关的

55、界面更新及相关变量的设置。 第五章第五章 结论结论 程序运行结果如下: 单机,如图 6 所示: 图 6 单机五子棋运行结果 联机: 打开联机五子棋程序,如图 7. 图 7 联机五子棋 设置主机,如图 8 所示。 图 8 设置主机 连接成功,开始游戏,如图 9. 图 9 连接成功 开始游戏 游戏结束,如图 10 所示: 图 10 游戏结束 本设计的优点:运用了人工智能的算法,能使计算机模拟人思考五子棋的过程,同时它把 网络版也整合到一起,方便联机对战。 另外,此设计还存在一些不完美的地方:1.人工智能算法不够高级或者可以考虑加入等级 调节的操作,让不同玩家能选择不同的难度进行游戏。2.联机对战只

56、限于局域网,如果有独立的 服务端程序就可以消除这个缺点,但考虑到设计的复杂程序及时间问题,所以最终设计成目前 的情况。3.程序的界面可以改善,通过参考目前网络上的游戏软件,界面都很华丽,目的应该是 为了吸引玩家,这个也是本设计需要改进的地方。 通过本设计我进一步了解到人工智能算法在计算机科学里是多么的重要,同时也进一步了 解到面向对象设计带来的便利。 参考文献参考文献 1郑炜旸 锄大地与五子棋网络游戏的设计与实现 20040511 2孙宏伟 何丰泉 五子连珠棋初步 哈尔滨 黑龙江科技出版社 1999 3马少平等 人工智能,清华大学出版社 4蔡自兴 徐光 人工智能及其应用 第三版 清华大学出版社

57、 200309 5朱全民 博弈机器人系统的设计及关键技术研究 20060424 致谢致谢 本论文是在导师 xxx 悉心指导下完成的,同时也感谢导师给我一次参与实际商业项目 的机会,虽然我没有从头到尾都参与到项目里,但这过程里真正学到很多,这些在学校里 都是无法领会到的。导师渊博的专业知识,严谨的治学态度,精益求精的工作作风,诲人 不倦的高尚师德,严以律己、宽以待人的崇高风范,朴实无华、平易近人的人格魅力对我 影响深远。不仅使我树立了远大的学术目标、掌握了基本的研究方法,还使我明白了许多 待人接物与为人处世的道理。本论文从选题到完成,每一步都是在导师的指导下完成的, 倾注了导师大量的心血。在此,谨向导师表示崇高的敬意和衷心的感谢!本论文的顺利完 成,离不开各位老师、同学和朋友的关心和帮助。在此感谢所有人的指导和帮助。在四年 的学习期间,曾得到很多同学的关心和帮助,在此表示深深的感谢。没有他们的帮助和支 持是没有办法完成我的论文的,同窗之间的友谊永远长存. 毕业论文开题报告毕业论文开题报告 论文(设计)题目:五子棋游戏的单机版及网络版的实现 (简述选题的目的、思路、方法、相关支持条件及

温馨提示

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

评论

0/150

提交评论