基于OpenGL小游戏开发及实践.docx_第1页
基于OpenGL小游戏开发及实践.docx_第2页
基于OpenGL小游戏开发及实践.docx_第3页
基于OpenGL小游戏开发及实践.docx_第4页
基于OpenGL小游戏开发及实践.docx_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

精品文档 2015 届毕业设计论文 基于OpenGL的小型游戏开发及实践 院 、 部: 计算机与信息科学学院 学生姓名: 杜磊 指导教师: 方小勇 职称 副教授 专 业: 计算机科学与技术 班 级: 1103 完成时间: 2015-6 摘 要信息时代的到来使得电脑越来越普及,人们对电脑游戏的需求也越来越高。游戏的界面美观性,可操作性无疑是人们考虑的关键因素。OpenGL是一种主流的图形处理工具,基于OpenGL开发的小游戏有更好的观赏性,本次论文论述的是基于OpenGL开发的五子棋小游戏。五子棋,起源于中国古代传统的黑白棋游戏,简单易懂又不缺乏趣味性。其中的对弈较量,不仅增强人的思维能力,开发人的智力,而且简单的游戏规则中蕴含着深奥的棋技,是修身养性,陶冶情操的一款经典游戏。本次论文是基于OpenGL和C+语言在Visual Studio 2008环境下编程,设计了一款人机对战、人人对战功能的五子棋游戏。采用极大极小搜索算法及alpha-beta剪枝算法,采取优先级策略来判别棋局,实现了单机游戏的人工智能。运用了OpenGL的alpha混合及深度测试等一系列的特性,将计算机图形学与算法相结合,旨在设计出一款界面客观性强,游戏可操作性强的一款小游戏软件。通过学习,基本掌握OpenGL函数库的使用,能够制作简单的平台界面,实现人机交互功能,探讨和研究了博弈论的相关知识,学会将算法与日常事务的结合,运用算法去解决问题。由于时间原因,界面的美观性有待改进,游戏的多样性以及难易程度的合理性并不是做的很好,希望在今后的学习中更加完善不足的功能。关键词 : OpenGL;五子棋;小游戏;博弈论7欢迎下载7欢迎下载7欢迎下载。ABSTRACTThe arrival of information age makes computers more and more widespread, people are also more and more high demand for computer games. The game interface aesthetics, operability is undoubtedly the key factors what people consider. OpenGL is a mainstream of graphics processing tools, based on OpenGL, little game have a better view and admire a gender, this thesis is based on OpenGL developed gobang game.Gobang, originated in the ancient Chinese traditional black white game, easy to understand and not a lack of interest. The game, not only enhance the persons thinking ability, developers of intelligence, and the simple rules of the game contains profound Chess skills, cultivate ones morality raises a gender, edify sentiment of a classic game.This paper is based on OpenGL and C+ language programming in Visual Studio 2008 environment, designed a function of the man-machine against and everyone against gobang game. The minimax search algorithm and alpha - beta pruning algorithm, discriminant chess, take priority strategy to realize the single-player game AI. Using a series of features about the alpha blend of OpenGL and depth test and so on, combining computer graphics and algorithm, aims to design an interface strong objectivity, games strong operability of a small game software.Through learning that the basic to master the use of OpenGL library function, I can make a simple platform interface, realize the human-computer interaction function, discusses and studies the related theory knowledge, learn to algorithm combined with the daily affairs, using the algorithm to solve the problems. Due to time reasons, interface aesthetics needs to be improved, the diversity of the game, and the rationality of ease is not doing very well, the lack of hope in the future to learn to be more perfect function.Key words : OpenGL; Gobang; game; game theory目 录1 绪论11.1 课题研究的背景及意义11.2 五子棋的发展与现状21.3 OpenGL国内外研究现状21.4 本章总结32 基于OpenGL五子棋开发使用工具42.1 C+42.2 OpenGL42.2.1 什么是OpenGL42.2.2 OpenGL的特点52.3 Visual Studio 200852.4 本章总结63 基于OpenGL五子棋算法的实现73.1 极大极小搜索中的评价函数73.2 极大极小搜索及alpha-beta剪枝123.3 本章总结134 基于OpenGL五子棋系统设计144.1 操作设计144.1.1 人机对战144.1.2 人人对战154.1.3 鼠标与键盘的操作164.3 界面设计184.3.1 OpenGL的图形生成184.3.2 基本图形的绘制方法194.3.3 主界面窗口设计204.3.4 棋盘界面设计224.1 本章总结235 系统实现246 总结29参考文献30致 谢32附 录331 绪论本章节研究课题的背景及意义,明确做次课题的目的,通过查阅资料更好地熟悉课题。1.1 课题研究的背景及意义人类之所以不断在进步,是因为我们人类一直不断的在思考,在学习完计算机图形学这门课程之后,我对图形学的研究很感兴趣,我在思考能不能用所学的知识来做一些实践,恰巧我平时喜欢棋类游戏,我就想基于OpenGL来开发一款游戏,而五子棋游戏程序的开发符合人类进步也是促进人类进步的一大动力之一。五子棋游戏程序让人们方便快捷的可以下五子棋,让人们在何时都能通过下棋来提高逻辑思维能力,同时也培养儿童的兴趣以及爱好,让孩子更加聪明。同时,五子棋游戏程序的开发也使得五子棋这个游戏得到了广泛的推广,让世界各地的人们知道五子棋,玩上五子棋,这已经不是局限。五子棋游戏程序使得越来越多的人喜欢上了五子棋,热爱下五子棋,它是具有很好的带动性的。于是我收集了国内外有关计算机图形学的资料,我发现国内外最近几年计算机图形学发展迅速,使得三维表现技术得以形成,这些三维表现技术使单调的二维界面逐步转变为丰富立体的三围界面,我们能够再现三维世界中的物体,能够用三维形体来表示复杂的信息,这种技术就是可视化(Visualization)技术。可视化技术把数据转化为图形,使人能够在三维图形世界中直接对具有形体的信息进行操作,和计算机直接交流。这都归功于计算机图形学、计算机可视化技术的发展。人们对计算机可视化技术的研究已经历了一个很长的历程,而且形成了许多可视化工具,其中SGI公司推出的GL三维图形库表现突出,易于使用而且功能强大。进而发展为OpenGL。OpenGL作为一个图形硬件接口,很好地为程序员提供一个功能强大,低层次的渲染库,能够运用于任何软件平台,也得到了广泛的硬件支持。OpenGL也为游戏开发提供强大的图形界面平台,使得游戏画面感丰富,提高可观赏性。可见基于OpenGL的游戏开发将会成为主流市场,会给游戏行业带来新一番的收获和体验。所以我想基于OpenGL来制作一款五子棋小游戏,对此课题的研究也将让我更近一步熟悉OpenGL,通过动手实践更好地学习新知识,巩固旧知识2欢迎下载。1.2 五子棋的发展与现状充分的准备是成功的第一步,在确定了这一论文课题后,我收集了大量的有关于五子棋的资料,五子棋这一棋类运动已迅速在国际上发展起来。外国人都十分看好这一不起眼的智力游戏,并认为五子棋不仅能提高思维、开发智力、手脑并用、修身养性而且富含哲理,具有东方的神秘和西方的直观,是中西文化的交汇点。许多国家的人对五子棋都有不同的爱称,例如韩国人把五子棋称之为“情侣棋”,因为五子棋可以两个人下,别有一番趣味,所以此次设计中,我将设计人人对战功能,供双人玩这个游戏,言下之意,我希望设计一款情人之间可以下的五子棋,这样有利于增加情感的交流;欧洲人称之为“中老年棋”,表示五子棋适合中老年人的生理特点和思维方式,所以我这一次设计中希望设计人机对战的功能,这样老年人就可以跟电脑下棋,为老年人提供一个休闲娱乐的工具,由此可见,尽管国度不同,语言各异,但人们都可以借助五子棋这一简单而又深奥的棋艺进行交流、比赛,增进友谊,这也是我从五子棋的现状中得到启发想要设计的一款软件。五子棋的流行令人瞠目结舌,目前有几十个国家都在下五子棋,也引申出各种级别和规模的比赛。自1989年起,每两年都有五子棋世界锦标赛举行,从第一届在日本东京都到俄罗斯联邦的莫斯科、瑞典以及爱沙尼亚的塔林,一届比赛比一届精彩,日本人在这个比赛中一直都占据了领先的位置,除第三届的冠军是爱沙尼亚人之外,其余三届的冠军都是日本人。日本目前对连珠(五子棋)技术的研究也相当普遍和全面,并且日本五子棋职业棋手是令人敬畏的,他们的水平是世界级的,并且在日益增长。同时五子棋的理论研究与探索也呈现蓬勃发展的势头,从1858年第一部五子棋专著问世以来,目前,全世界有2000多种五子棋的书籍及期刊,且用各种语言发行。五子棋在我国的各省市地区都有很大的发展,收到人们的喜爱。最具有代表性的就属北京,举办了各种规模的赛事,其他省市也举办了大大小小的赛事。所以我觉得做一个五子棋系统肯定有很多人喜爱。1.3 OpenGL国内外研究现状OpenGL作为一个性能优越的图形应用程序设计界面(API)适合于广泛的计算机环境,从个人计算机、工作站到超级计算机,OpenGL都能实现高性能的图形功能。由于许多在计算机界具有领导地位的计算机公司纷纷采用OpenGL作为图形应用程序设计界面,OpenGL应用程序具有广泛的移植性。OpenGL已成为目前的图形开发标准。OpenGL(OpenGL Graphics Library,开发性图形库)是目前用于开发2D图形应用程序的首选环境,具有可移植性、可交换性等优点,是行业领域中最为广泛接纳的2D图形API,也是目前应用最为广泛的计算机图形标准,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。通过对OpenGL的特点、功能、工作流程和绘图流程的学习,我们将会对OpenGL有一个初步的了解,建立起基本的概念。在国外OpenGL是具有一定的生命力的,唯一能够取代微软对图形技术的完全控制的API。但是由于Silicon Graphics公司已经不再以任何让微软不悦的方式推广OpenGL,所以采用OpenGL开发游戏还是具有一定风险。鉴于OpenGL的特点,还是有许多非常重要的开发人员仍然在使用OpenGL进行游戏的开发与创作。因此,硬件开发商目前正在想法设法地加强硬件对OpenGL的技术支持。1.4 本章总结通过查阅资料和阅读文献,我了解到OpenGL小游戏制作的研究现状,了解一些商业上对OpenGL的运用,通过对五子棋的调研发现,喜欢这一游戏的人居多,所以我明确了本次课题的对象:基于OpenGL设计出一款五子棋游戏。2 基于OpenGL五子棋开发使用工具2.1 C+C+是在C语言的基础上开发的一种通用编程语言,应用广泛。C+支持多种编程范式 面向对象编程、泛型编程和过程化编程。C+语言灵活,运算符的数据结构丰富、具有结构化控制语句、程序执行效率高,而且同时具有高级语言与汇编语言的优点,与其它语言相比 ,可以直接访问物理地址,与汇编语言相比又具有良好的可读性和可移植性。C+引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。2.2 OpenGL2.2.1 什么是OpenGLOpenGL是一种图形与硬件的接口。它包括了上百个图形函数,开发者可以用这些函数来建立三维模型和进行三维实时交互。与其他图形程序设计接口不同,OpenGL提供了十分清晰明了的图形函数,因此初学的程序设计员也能利用OpenGL的图形处理能力和1670万种色彩的调色板很快地设计出三维图形以及三维交互软件。OpenGL强有力的图形函数不要求开发者把三维物体模型的数据写成固定的数据格式,这样开发者不但可以直接使用自己的数据,而且可以利用其他不同格式的数据源。这种灵活性极大地节省了开发者的时间,提高了软件开发效益。长期以来,从事三维图形开发的技术人员都不得不在自己的程序中编写矩阵变换、外部设备访问等函数,这样为调制这些与自己的软件开发目标关系并不十分密切的函数费脑筋,而OpenGL正是提供一种直观的编程环境,它提供的一系列函数大大地简化了三维图形程序。(1)OpenGL提供一系列的三维图形单元供开发者调用。(2)OpenGL提供一系列的图形变换函数。 (3)OpenGL提供一系列的外部设备访问函数,使开发者可以方便地访问鼠标、键盘、空间球、数据手套等这种直观的三维图形开发环境体现了OpenGL的技术优势,这也是许多三维图形开发者热衷于OpenGL的缘由所在。2.2.2 OpenGL的特点OpenGL具有标准化:它是唯一真正开放的,独立于供应商的、跨平台的图形标准。稳定性:OpenGL用时间证明它在各个平台上运用良好,它具有明确而控制良好的规范,并具有向后兼容性,使现有的应用程序不会失效。扩展性:许多开发商利用这一特性通过对API进行扩展来对OpenGL的功能进行升级。可缩放性:基于OpenGL的应用程序可以在各种系统上运行,其范围从家用电脑到PC机,从工作站到超级计算机,可以说,OpenGL应用程序可以适应开发人员选择的各种目标平台。易用性:OpenGL具有良好的结构,直观的设计和逻辑命令。与其他的图形程序包相比,OpenGL应用程序的代码行数少。此外,OpenGL封装了有关基本硬件信息,使开发人员无须针对具体的硬件进行专门的设计。可靠性和可移植性:在OpenGL兼容的任何硬件上,不管使用什么操作系统,同一个应用程序的显示结果均相同。与其它图形程序包相比,OpenGL应用程序的代码行数少。此外,OpenGL封装了有关基本硬件的信息,使开发人员无需针对具体的硬件进行专门的设计。在CAD/CAM/CAE、医学图像处理、虚拟现实、娱乐、广告等不同领域中,开发人员可以利用OpenGL的这些能力自由发挥自己的创造性。2.3 Visual Studio 2008Visual studio 2008是微软自行研发的一款开发系统,支持Windows平台下各类应用软件和应用服务的开发。作为C+与OpenGL的开发平台,能很好地进行代码编写和调试。具有良好的运用性和友好性。Visual studio 2008为程序员提供了一个面向对象的Windows编程接口MFC(Microsoft Foundation Class),它大大地简化了Windows编程工作。此次小游戏开发中我也使用了编程接口MFC。MFC提供了一个标准化的结构,这样开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是“站在巨人肩膀上”,从一个比较高的起点编程,故节省了大量的时间;其次,它提供了大量的代码,指导用户编程时实现某些技术和功能。对用户来说,用MFC开发的最终应用程序具有标准的、熟悉的Windows界面,这样的应用程序易学易用。2.4 本章总结作为一名计算机专业的学生,利用网络资源学习是一项基本的技能,我通过网络进一步学习了本次设计所用到的开发工具,很大的提高了我编程水平。3 基于OpenGL五子棋算法的实现此章节中将介绍基于OpenGL五子棋所涉及到的一些算法,采用解析代码的方法,阐述博弈论中的深度搜索策略。3.1 极大极小搜索中的评价函数极大极小搜索策略一般都是使用在一些博弈类的游戏之中,例如本次课题的五子棋游戏。要讨论极大极小搜索算法,首先要明白什么是搜索。最基本的搜索方法是暴力搜索:所谓暴力搜索就是采用循环语句将所有可能的情况搜索一遍,这个搜索方法在本例中不适用,因为如果采用暴力搜索,把最终的结果得到的话,搜索树的深度太大了,机器不能满足。所以我们考虑另一个搜索策略,即深度搜索。规定一个搜索的深度,在这个深度范围内进行深度优先搜索。极大极小搜索算法的本质就是深度搜索,在搜索过程中,对本方有利的搜索点上应该取极大值,而对本方不利的搜索点上应该取极小值。这里的极大极小值是相对而言的。在设计人与机器对弈的情况下,我应该站在机器的角度考虑,为机器设计出最佳的走棋策略。机器和人对弈,轮到机器走棋了,那么我们会遍历机器的每一个可能走棋方法,然后对于前面机器的每一个走棋方法,遍历人的每一个走棋方法,然后接着遍历机器的每一个走棋方法,如此下去,直到得到确定的结果或者达到了搜索深度的限制。当达到了搜索深度限制,此时无法判断结局如何,一般都是根据当前局面的形式,给出一个得分,计算得分的方法被称为评价函数,不同游戏的评价函数差别很大,需要很好的设计。本课题中,我设计的评价函数如下(函数名为:EvaluateSituation(char* situation)):在这个五子棋游戏中,定义棋盘的大小为15*15的方格举矩阵,也就是225小格的正方形棋盘。用数组char situ1515来表示。五子棋的规则是,有五个同颜色的子相连成一条直线,在横向,纵向,左斜路,右斜路上,即为获胜。我们用“0”来表示我方的棋子,用“+”来表示敌方的棋子。则我们用两种情况来分析得分,用一个Int型变量score来记录分数。首先我们来寻找,的情况,以下用主要的代码以及我对代码的解释:在横路上搜索,核心的代码如下:For(i=0;i10;i+)/横向只需搜索十个格子,有五个格子是被棋子占用,因为我们搜索的是连续5个棋子的情况,搜索十个格子就会达到目的;For(j=0;j15;j+)if(situij=-1)&(situi+1j=-1)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=-1)/连续的五个格子都占有棋子;score+=500000;/对黑子进行匹配的情况(500000分)else if(situij=-1)&(situi+1j=-1)&(situi+2j=0)&(situi+3j=-1)&(situi+4j=-1)score+=720; /对黑子进行匹配的情况(720分) else if(situij=0)/对黑子进行匹配的情况(720分)) score+=720; else if(situi+4j=0)/对黑子进行匹配的情况(720分)) score+=720;else if(situi+2j=0)/对黑子进行匹配的情况(720分)) score+=720;else if(situi+3j=0)/对黑子进行匹配的情况(720分)) score+=720;/同样的道理,对白子进行匹配:else if(situij=1)&(situi+1j=1)&(situi+2j=1)&(situi+3j=1)&(situi+4j=1)score-=500000;/对白子进行匹配的情况else if(situij=1)&(situi+1j=1)&(situi+2j=0)&(situi+3j=1)&(situi+4j=1)score+=720; /对白子进行匹配的情况(720分) else if(situij=0)/对白子进行匹配的情况(720分)) score+=720; else if(situi+4j=0)/对白子进行匹配的情况(720分)) score+=720;else if(situi+2j=0)/对白子进行匹配的情况(720分)) score+=720;else if(situi+3j=0)/对白子进行匹配的情况(720分)) score+=720; 在纵路上搜索,核心的代码及解释如下: For(0=i15)For(0=j11) /与横路上同理,i的值不变j的值依次+1寻找符合标准的情况 例如匹配黑子 的情况:If(situij=-1)&(situij+1=-1)&(situij+2=-1)&(situij+3=-1)&(situij+4=-1)同样地可以匹配白子情况分数为负分。在左斜路上搜索,主要的代码及解释如下: For(4=j15;j+) For(0=ij-3;i+)if(situij-i=-1)&(situi+1j-i-1=-1)&(situi+2j-i-2=-1)&(situi+3j-i-3=-1)&(situi+4j-i-4=-1) /对黑子进行匹配的情况(500000分) score+=500000;同理对黑子的其他情况进行匹配,对白子也进行同样匹配得分为负数。在右斜路上搜索,主要的代码及解释如下:For(1=i=ji+3;j-)If(situi+14-jj=-1)&(situi+14-j+1j-1=-1)&(situi+14-j+2j-2=-1)&(situi+14-j+3j-3=-1)&(situi+14-j+4j-4=-1)/对黑子进行匹配的情况(500000分) score+=500000;同理对黑子的其他情况进行匹配,对白子也进行同样匹配得分为负数。寻找完以上情况之后,我们还要对一些得分较少的情况进行搜索,我们对,等几种情况进行搜索。在横路上搜索,主要的代码及解释如下:For(0=i10;i+) For(0=j15;j+)If(situij=0)&(situi+1j=-1)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=-1)&(situi+5j=0) /对黑子进行匹配的情况(4320分) score+=4320;If(situij=0)&(situi+1j=-1)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=0)&(situi+5j=0) / 对黑子进行匹配的情况(720分) score+=720;If(situij=0)&(situi+1j=0)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=-1)&(situi+5j=0) / 对黑子进行匹配的情况(720分) score+=720;If(situij=0)&(situi+1j=-1)&(situi+2j=-1)&(situi+3j=0)&(situi+4j=-1)&(situi+5j=0) /对黑子进行匹配的情况(720分) score+=720;If(situij=0)&(situi+1j=-1)&(situi+2j=0)&(situi+3j=-1)&(situi+4j=-1)&(situi+5j=0) / 对黑子进行匹配的情况(720分) score+=720;If(situij=0)&(situi+1j=0)&(situi+2j=-1)&(situi+3j=-1)&(situi+4j=0)&(situi+5j=0) / 对黑子进行匹配的情况(120分) score+=120;If(situij=0)&(situi+1j=0)&(situi+2j=-1)&(situi+3j=0)&(situi+4j=-1)&(situi+5j=0) /对黑子进行匹配的情况(120分) score+=120;If(situij=0)&(situi+1j=-1)&(situi+2j=0)&(situi+3j=-1)&(situi+4j=0)&(situi+5j=0) /对黑子进行匹配的情况(120分) score+=120;If(situij=0)&(situi+1j=0)&(situi+2j=0)&(situi+3j=-1)&(situi+4j=0)&(situi+5j=0) /对黑子进行匹配的情况(20分) score+=4320;If(situij=0)&(situi+1j=0)&(situi+2j=-1)&(situi+3j=0)&(situi+4j=0)&(situi+5j=0) /对黑子进行匹配的情况(20分) score+=20;同理白棋也用这样的方式搜索,分数为负数。在纵路上搜索,主要的代码及解释:For(0=i15;i+) For(0=j10;j+) if(situij=0)&(situij+1=-1)&(situij+2=-1)&(situij+3=-1)&(situij+4=-1)&(situij+5=0) /对黑子进行匹配的情况(4320分) score+=4320; 同样的道理对其他的黑子进行匹配,匹配的得分与横路上的得分相同,不同的是横坐标不变,纵坐标改变情况下的结果,白子类似分数为黑子的负分。在左斜路上搜索,主要的代码及解释如下:For(5=j15;j+) For(0=ij-4;i+)if(situij-i=0)&(situi+1j-i-1=-1)&(situi+2j-i-2=-1)&(situi+3j-i-3=-1)&(situi+4j-i-4=-1)&(situi+5j-i-5=0) / 对黑子进行匹配的情况4320分 同样的道理对其他的黑子进行匹配,匹配的得分与横路上的得分相同,不同的是横坐标不变,纵坐标改变情况下的结果,白子类似分数为黑子的负分。在右斜路上搜索,主要的代码及解释如下: for(5=j15;j+) for(0=ij-4;i+)if(situ14-ij-i=0)&(situ14-i-1j-i-1=-1)&(situ14-i-2j-i-2=-1)&(situ14-i-3j-i-3=-1)&(situ14-i-4j-i-4=-1)&(situ14-i-5j-i-5=0) /对黑子进行匹配的情况4320分 同样的道理对其他的黑子进行匹配,匹配的得分与横路上的得分相同,不同的是横坐标不变,纵坐标改变情况下的结果,白子类似分数为黑子的负分。评价函数就是对每一种可能出现的棋局给出不同等级的得分,最后我要根据对棋盘的全面搜索得出来的这个得分,选出得分最高的下棋位置,所以我们要返回这个重要的值Score,也是这个函数最重要的一行代码:Renturn score;/返回得分;至此评价函数就设计完了。3.2 极大极小搜索及alpha-beta剪枝我们用MixMaxSearchCut()函数来进行极大极小搜索和alpha-beta剪枝,程序的主要代码及解释如下:Int score=0;设score初始值为0; If(depth=0)已经到达底层 直接返回静态估值结果 生成下一阶段可能的棋局: For(0=i15;i+) For(0=jtype)*-1; root-type用来记录当前位置是极大点还是极小点char searchAreaFlag1515;定义数组记录某点是否在搜索范围内(0为不在范围内,1为在范围内)for (i-SearchArea=m= i+SearchArea;m+)for (j- SearchArea=n=j+ SearchArea;n+) If(0=n=14并且0=mtype)*-1);root-nextSituationList.push_back(tempNode); 进行递归及alpha-beta剪枝:If( 当前为极大点) for(list:iteratorit1=root-nextSituationList.begin();it1!=root-nextSituationList.end();+it1) /进行递归,深度每次减一; score=MixMaxSearchCut(*it1,depth-1,alpha,beta);为了在搜索过程中进行剪枝,优化搜索效率,在递归过程中要向下传递两个参数。第1个参数是alpha,它表示当前搜索节点走棋的一方搜索到的最好值,任何比它小的值都没有意义。第2个值是beta,表示对手目前的劣势,这是对手所能承受的最坏的结果,比它大的值都会被舍弃。剪枝的主要代码如下:If(scorealpha)/搜索比alpha大的值,比它小的值都没有意义 If(scorebeta)/搜索比beta大的值,比它大的值做舍弃处理 Root-score=score; Return score; Else Alpha=score; Root-score=alpha;/返回alpha的值;考虑完极大点的情况要考虑极小点的情况,做法与极大点的情况相反。3.3 本章总结人们都说算法是程序的灵魂,通过对五子棋算法的研究,能更好地掌握博弈论知识,理解深度搜索中的极大极小搜索的方法,剪枝方面比较有难度,不过用心研究发现算法还是很有趣。4 基于OpenGL五子棋系统设计基于OpenGL五子棋的系统设计暴扣操作设计和界面设计,这一章将详细地描述游戏的设计过程。4.1 操作设计通过资料查询以及前三章的分析,可以清晰地搭建出我们此次设计的结构框架来。这是一个基于OpenGL的五子棋游戏,采用Visual studio 2008提供的面向对象的Windows编程接口MFC来制作一个主界面,主界面分别可连接到人机对战和人人对战的窗口。如图1描述的是系统框架;图1 系统结构框架图4.1.1 人机对战所谓的人机对战顾名思义,就是我们和电脑系统下棋。这里就涉及到了五子棋的人工智能算法。在此系统中我们采用的是最大最小搜索与alpha-beta剪枝的算法来实现,前面我们已经将算法介绍了。我们采用一个15*15的棋盘下棋;在棋盘上面对应位置通过点击鼠标下子,棋盘上将在相应的位置上显示棋子,棋子显示在棋盘的格子中。由电脑掌握的黑子先下棋,在棋盘的正中央格子中下黑子;由玩家控制鼠标下白子,白子每下一步,电脑都会计算出黑子的最佳走棋位置并下黑子,这个计算采用的就是第三章所介绍的算法,会下五子棋的人都知道,当你走一步棋的时候未必是最佳的走法,因为棋局的每一步都要为下一步考虑,这样才能获得最后的胜利,极大极小搜索算法就是搜索出一条深度为depth(搜索接下来几步)的最佳路径,当然这个路径会有很多情况,因为我们不知道对手会走什么样的位置,所以假设对手每一步都走最好的路径,搜索出最利于我方的一条路径,此系统设置depth的值为2,通过改变depth的值可以改变人机对战单机版的游戏难易程度。如上所述游戏,直到一方先达到5子相连(在横路,纵路,左斜路,右斜路上)的情况结束游戏,判断相连的五个棋子的颜色,如果为黑色则为电脑获胜,为白色则为玩家获胜,系统会给出提示信息提示哪方获胜并提示重新开始游戏方法,棋盘中会有直线标出五子连珠的五个棋子,此时无法再在棋盘上下子;如果棋盘下满还未分出胜负即为平局,游戏结束和平局都会有消息对话框弹出提示;点击r键重新开始游戏,点击q键退出游戏。4.1.2 人人对战双人对战的实现比人机对战实现得容易得多,两人交替操作鼠标来执黑白两子进行游戏,直到一方获胜游戏结束,或者棋盘下满还未分出胜负则为平局。双人对战的核心代码是判断哪一方获胜,要分别对黑白两方进行判定,以下是我的判断方法,与人机对战的判断方法类似: bool isWin(int x,int y) int dir2=0,1,1,0,1,1,1,-1; for(int i=0;i=5) return 1; return 0;另外,我在人人对战中设计了悔棋的功能,点击鼠标右键,选择“go back”可以实现悔棋功能,返回下棋的上一步。4.1.3 鼠标与键盘的操作一个好的游戏要有一个很好地交互性,而交互性的体现就在游戏的可操作性上面,本次系统的操作性体现在:鼠标操作,键盘操作,实现重新开始游戏,退出游戏,悔棋等功能的实现。我们用myGlutMouseFunc()函数来处理用户从鼠标输入的一些信号;首先我们要判断鼠标点击的方法:鼠标左键点击且放开;If(button=GLUT_LEFT_BUTTON)&(state=GLUT_UP)判断当前棋盘是否显示正确;if (WindowWidthWindowHeight)显示不正确直接返回;判断落子的位置,根据横纵坐标来判断,如果点击的是横纵棋盘线的交界点,我们判断交界点右上角为落子的位置;Int xPos=(int)(x-(WindowWidth-WindowHeight)/2.0f)/(WindowHeight/15.0f);Int yPos=(int)(y/(WindowHeight/15.0f);判断落子的位置是否有效,如果超出棋盘或者落子的位置已经有棋子都为无效位置;if(xPos0)|(yPos14)|(yPos14)|(curSituationxPosyPos

温馨提示

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

评论

0/150

提交评论