基于OpenGL小游戏开发及实践
更新时间:2024-01-17 01:26:01 阅读量: 教育文库 文档下载
2015 届毕业设计论文
基于OpenGL的小型游戏开发及实践
院、部:计算机与信息科学学院 学生姓名:杜磊
指导教师:方小勇职称副教授 专业:计算机科学与技术 班级:1103 完成时间:2015-6
1
摘要
信息时代的到来使得电脑越来越普及,人们对电脑游戏的需求也越来越高。游戏的界面美观性,可操作性无疑是人们考虑的关键因素。OpenGL是一种主流的图形处理工具,基于OpenGL开发的小游戏有更好的观赏性,本次论文论述的是基于OpenGL开发的五子棋小游戏。
五子棋,起源于中国古代传统的黑白棋游戏,简单易懂又不缺乏趣味性。其中的对弈较量,不仅增强人的思维能力,开发人的智力,而且简单的游戏规则中蕴含着深奥的棋技,是修身养性,陶冶情操的一款经典游戏。
本次论文是基于OpenGL和C++语言在Visual Studio 2008环境下编程,设计了一款人机对战、人人对战功能的五子棋游戏。采用极大极小搜索算法及alpha-beta剪枝算法,采取优先级策略来判别棋局,实现了单机游戏的人工智能。运用了OpenGL的alpha混合及深度测试等一系列的特性,将计算机图形学与算法相结合,旨在设计出一款界面客观性强,游戏可操作性强的一款小游戏软件。
通过学习,基本掌握OpenGL函数库的使用,能够制作简单的平台界面,实现人机交互功能,探讨和研究了博弈论的相关知识,学会将算法与日常事务的结合,运用算法去解决问题。由于时间原因,界面的美观性有待改进,游戏的多样性以及难易程度的合理性并不是做的很好,希望在今后的学习中更加完善不足的功能。
关键词:OpenGL;五子棋;小游戏;博弈论
2
ABSTRACT
The 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 person's thinking ability, developers of intelligence, and the simple rules of the game contains profound Chess skills, cultivate one's 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. Usinga 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
3
目录
1 绪论.............................................................. 1 1.1 课题研究的背景及意义 .......................................... 1 1.2 五子棋的发展与现状 ............................................ 2 1.3 OpenGL国内外研究现状 ......................................... 2 1.4 本章总结 ...................................................... 3 2 基于OpenGL五子棋开发使用工具..................................... 4 2.1 C++ ........................................................... 4 2.2 OpenGL ........................................................ 4 2.2.1 什么是OpenGL ............................................. 4 2.2.2 OpenGL的特点 ............................................. 4 2.3 Visual Studio 2008 ............................................ 5 2.4 本章总结 ...................................................... 5 3 基于OpenGL五子棋算法的实现....................................... 6 3.1 极大极小搜索中的评价函数 ...................................... 6 3.2 极大极小搜索及alpha-beta剪枝 ................................ 11 3.3 本章总结 ..................................................... 12 4 基于OpenGL五子棋系统设计........................................ 13 4.1 操作设计 ..................................................... 13 4.1.1 人机对战 ................................................. 13 4.1.2 人人对战 ................................................. 14 4.1.3 鼠标与键盘的操作 ......................................... 15 4.3 界面设计 ..................................................... 17 4.3.1 OpenGL的图形生成 ........................................ 17 4.3.2 基本图形的绘制方法 ....................................... 18 4.3.3 主界面窗口设计 ........................................... 19 4.3.4 棋盘界面设计 ............................................. 21 4.1 本章总结 ..................................................... 22 5 系统实现........................................................ 23 6 总结............................................................ 26 参考文献........................................................... 27
4
致谢............................................................... 30 附录............................................................... 31
5
1 绪论
本章节研究课题的背景及意义,明确做次课题的目的,通过查阅资料更好地熟悉课题。
1.1 课题研究的背景及意义
人类之所以不断在进步,是因为我们人类一直不断的在思考,在学习完计算机图形学这门课程之后,我对图形学的研究很感兴趣,我在思考能不能用所学的知识来做一些实践,恰巧我平时喜欢棋类游戏,我就想基于OpenGL来开发一款游戏,而五子棋游戏程序的开发符合人类进步也是促进人类进步的一大动力之一。五子棋游戏程序让人们方便快捷的可以下五子棋,让人们在何时都能通过下棋来提高逻辑思维能力,同时也培养儿童的兴趣以及爱好,让孩子更加聪明。同时,五子棋游戏程序的开发也使得五子棋这个游戏得到了广泛的推广,让世界各地的人们知道五子棋,玩上五子棋,这已经不是局限。五子棋游戏程序使得越来越多的人喜欢上了五子棋,热爱下五子棋,它是具有很好的带动性的。
于是我收集了国内外有关计算机图形学的资料,我发现国内外最近几年计算机图形学发展迅速,使得三维表现技术得以形成,这些三维表现技术使单调的二维界面逐步转变为丰富立体的三围界面,我们能够再现三维世界中的物体,能够用三维形体来表示复杂的信息,这种技术就是可视化(Visualization)技术。可视化技术把数据转化为图形,使人能够在三维图形世界中直接对具有形体的信息进行操作,和计算机直接交流。这都归功于计算机图形学、计算机可视化技术的发展。人们对计算机可视化技术的研究已经历了一个很长的历程,而且形成了许多可视化工具,其中SGI公司推出的GL三维图形库表现突出,易于使用而且功能强大。进而发展为OpenGL。OpenGL作为一个图形硬件接口,很好地为程序员提供一个功能强大,低层次的渲染库,能够运用于任何软件平台,也得到了广泛的硬件支持。OpenGL也为游戏开发提供强大的图形界面平台,使得游戏画面感丰富,提高可观赏性。
可见基于OpenGL的游戏开发将会成为主流市场,会给游戏行业带来新一番的收获和体验。所以我想基于OpenGL来制作一款五子棋小游戏,对此课题的研究也将让我更近一步熟悉OpenGL,通过动手实践更好地学习新知识,巩固旧知识
1
1.2 五子棋的发展与现状
充分的准备是成功的第一步,在确定了这一论文课题后,我收集了大量的有关于五子棋的资料,五子棋这一棋类运动已迅速在国际上发展起来。外国人都十分看好这一不起眼的智力游戏,并认为五子棋不仅能提高思维、开发智力、手脑并用、修身养性而且富含哲理,具有东方的神秘和西方的直观,是中西文化的交汇点。许多国家的人对五子棋都有不同的爱称,例如韩国人把五子棋称之为“情侣棋”,因为五子棋可以两个人下,别有一番趣味,所以此次设计中,我将设计人人对战功能,供双人玩这个游戏,言下之意,我希望设计一款情人之间可以下的五子棋,这样有利于增加情感的交流;欧洲人称之为“中老年棋”,表示五子棋适合中老年人的生理特点和思维方式,所以我这一次设计中希望设计人机对战的功能,这样老年人就可以跟电脑下棋,为老年人提供一个休闲娱乐的工具,由此可见,尽管国度不同,语言各异,但人们都可以借助五子棋这一简单而又深奥的棋艺进行交流、比赛,增进友谊,这也是我从五子棋的现状中得到启发想要设计的一款软件。
五子棋的流行令人瞠目结舌,目前有几十个国家都在下五子棋,也引申出各种级别和规模的比赛。自1989年起,每两年都有五子棋世界锦标赛举行,从第一届在日本东京都到俄罗斯联邦的莫斯科、瑞典以及爱沙尼亚的塔林,一届比赛比一届精彩,日本人在这个比赛中一直都占据了领先的位置,除第三届的冠军是爱沙尼亚人之外,其余三届的冠军都是日本人。日本目前对连珠(五子棋)技术的研究也相当普遍和全面,并且日本五子棋职业棋手是令人敬畏的,他们的水平是世界级的,并且在日益增长。同时五子棋的理论研究与探索也呈现蓬勃发展的势头,从1858年第一部五子棋专著问世以来,目前,全世界有2000多种五子棋的书籍及期刊,且用各种语言发行。五子棋在我国的各省市地区都有很大的发展,收到人们的喜爱。最具有代表性的就属北京,举办了各种规模的赛事,其他省市也举办了大大小小的赛事。所以我觉得做一个五子棋系统肯定有很多人喜爱。
1.3 OpenGL国内外研究现状
OpenGL作为一个性能优越的图形应用程序设计界面(API)适合于广泛的计算机环境,从个人计算机、工作站到超级计算机,OpenGL都能实现高性能的图形功能。由于许多在计算机界具有领导地位的计算机公司纷纷采用OpenGL作为图形应用程序设计界面,OpenGL应用程序具有广泛的移植性。OpenGL已成为目前的图形开发标准。
OpenGL(OpenGL Graphics Library,开发性图形库)是目前用于开发2D图形应用程序的首选环境,具有可移植性、可交换性等优点,是行业领域中最为广泛接
2
纳的2D图形API,也是目前应用最为广泛的计算机图形标准,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。通过对OpenGL的特点、功能、工作流程和绘图流程的学习,我们将会对OpenGL有一个初步的了解,建立起基本的概念。
在国外OpenGL是具有一定的生命力的,唯一能够取代微软对图形技术的完全控制的API。但是由于Silicon Graphics公司已经不再以任何让微软不悦的方式推广OpenGL,所以采用OpenGL开发游戏还是具有一定风险。鉴于OpenGL的特点,还是有许多非常重要的开发人员仍然在使用OpenGL进行游戏的开发与创作。因此,硬件开发商目前正在想法设法地加强硬件对OpenGL的技术支持。
1.4 本章总结
通过查阅资料和阅读文献,我了解到OpenGL小游戏制作的研究现状,了解一些商业上对OpenGL的运用,通过对五子棋的调研发现,喜欢这一游戏的人居多,所以我明确了本次课题的对象:基于OpenGL设计出一款五子棋游戏。
3
2 基于OpenGL五子棋开发使用工具
2.1 C++
C++是在C语言的基础上开发的一种通用编程语言,应用广泛。C++支持多种编程范式--面向对象编程、泛型编程和过程化编程。
C++语言灵活,运算符的数据结构丰富、具有结构化控制语句、程序执行效率高,而且同时具有高级语言与汇编语言的优点,与其它语言相比,可以直接访问物理地址,与汇编语言相比又具有良好的可读性和可移植性。
C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。
2.2 OpenGL
2.2.1 什么是OpenGL
OpenGL是一种图形与硬件的接口。它包括了上百个图形函数,开发者可以用这些函数来建立三维模型和进行三维实时交互。与其他图形程序设计接口不同,OpenGL提供了十分清晰明了的图形函数,因此初学的程序设计员也能利用OpenGL的图形处理能力和1670万种色彩的调色板很快地设计出三维图形以及三维交互软件。
OpenGL强有力的图形函数不要求开发者把三维物体模型的数据写成固定的数据格式,这样开发者不但可以直接使用自己的数据,而且可以利用其他不同格式的数据源。这种灵活性极大地节省了开发者的时间,提高了软件开发效益。
长期以来,从事三维图形开发的技术人员都不得不在自己的程序中编写矩阵变换、外部设备访问等函数,这样为调制这些与自己的软件开发目标关系并不十分密切的函数费脑筋,而OpenGL正是提供一种直观的编程环境,它提供的一系列函数大大地简化了三维图形程序。
(1)OpenGL提供一系列的三维图形单元供开发者调用。 (2)OpenGL提供一系列的图形变换函数。
(3)OpenGL提供一系列的外部设备访问函数,使开发者可以方便地访问鼠标、键盘、空间球、数据手套等这种直观的三维图形开发环境体现了OpenGL的技术优势,这也是许多三维图形开发者热衷于OpenGL的缘由所在。 2.2.2 OpenGL的特点
OpenGL具有标准化:它是唯一真正开放的,独立于供应商的、跨平台的图形标准。
4
稳定性:OpenGL用时间证明它在各个平台上运用良好,它具有明确而控制良好的规范,并具有向后兼容性,使现有的应用程序不会失效。
扩展性:许多开发商利用这一特性通过对API进行扩展来对OpenGL的功能进行升级。
可缩放性:基于OpenGL的应用程序可以在各种系统上运行,其范围从家用电脑到PC机,从工作站到超级计算机,可以说,OpenGL应用程序可以适应开发人员选择的各种目标平台。
易用性:OpenGL具有良好的结构,直观的设计和逻辑命令。与其他的图形程序包相比,OpenGL应用程序的代码行数少。此外,OpenGL封装了有关基本硬件信息,使开发人员无须针对具体的硬件进行专门的设计。
可靠性和可移植性:在OpenGL兼容的任何硬件上,不管使用什么操作系统,同一个应用程序的显示结果均相同。与其它图形程序包相比,OpenGL应用程序的代码行数少。此外,OpenGL封装了有关基本硬件的信息,使开发人员无需针对具体的硬件进行专门的设计。在CAD/CAM/CAE、医学图像处理、虚拟现实、娱乐、广告等不同领域中,开发人员可以利用OpenGL的这些能力自由发挥自己的创造性。
2.3 Visual Studio 2008
Visual studio 2008是微软自行研发的一款开发系统,支持Windows平台下各类应用软件和应用服务的开发。作为C++与OpenGL的开发平台,能很好地进行代码编写和调试。具有良好的运用性和友好性。
Visual studio 2008为程序员提供了一个面向对象的Windows编程接口MFC(Microsoft Foundation Class),它大大地简化了Windows编程工作。此次小游戏开发中我也使用了编程接口MFC。MFC提供了一个标准化的结构,这样开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是“站在巨人肩膀上”,从一个比较高的起点编程,故节省了大量的时间;其次,它提供了大量的代码,指导用户编程时实现某些技术和功能。
对用户来说,用MFC开发的最终应用程序具有标准的、熟悉的Windows界面,这样的应用程序易学易用。
2.4 本章总结
作为一名计算机专业的学生,利用网络资源学习是一项基本的技能,我通过网络进一步学习了本次设计所用到的开发工具,很大的提高了我编程水平。
5
3 基于OpenGL五子棋算法的实现
此章节中将介绍基于OpenGL五子棋所涉及到的一些算法,采用解析代码的方法,阐述博弈论中的深度搜索策略。
3.1 极大极小搜索中的评价函数
极大极小搜索策略一般都是使用在一些博弈类的游戏之中,例如本次课题的五子棋游戏。
要讨论极大极小搜索算法,首先要明白什么是搜索。最基本的搜索方法是暴力搜索:所谓暴力搜索就是采用循环语句将所有可能的情况搜索一遍,这个搜索方法在本例中不适用,因为如果采用暴力搜索,把最终的结果得到的话,搜索树的深度太大了,机器不能满足。所以我们考虑另一个搜索策略,即深度搜索。规定一个搜索的深度,在这个深度范围内进行深度优先搜索。极大极小搜索算法的本质就是深度搜索,在搜索过程中,对本方有利的搜索点上应该取极大值,而对本方不利的搜索点上应该取极小值。这里的极大极小值是相对而言的。
在设计人与机器对弈的情况下,我应该站在机器的角度考虑,为机器设计出最佳的走棋策略。机器和人对弈,轮到机器走棋了,那么我们会遍历机器的每一个可能走棋方法,然后对于前面机器的每一个走棋方法,遍历人的每一个走棋方法,然后接着遍历机器的每一个走棋方法,如此下去,直到得到确定的结果或者达到了搜索深度的限制。当达到了搜索深度限制,此时无法判断结局如何,一般都是根据当前局面的形式,给出一个得分,计算得分的方法被称为评价函数,不同游戏的评价函数差别很大,需要很好的设计。
本课题中,我设计的评价函数如下(函数名为:EvaluateSituation(char* situation)):
在这个五子棋游戏中,定义棋盘的大小为15*15的方格举矩阵,也就是225小格的正方形棋盘。用数组char situ[15][15]来表示。五子棋的规则是,有五个同颜色的子相连成一条直线,在横向,纵向,左斜路,右斜路上,即为获胜。我们用“0”来表示我方的棋子,用“+”来表示敌方的棋子。则我们用两种情况来分析得分,用一个Int型变量score来记录分数。
首先我们来寻找<00000>,<+0000>,<0000+>,<00+00>,<0+000>,<000+0>的情况,以下用主要的代码以及我对代码的解释:
在横路上搜索,核心的代码如下:
For(i=0;i<10;i++)//横向只需搜索十个格子,有五个格子是被棋子占用,因为我们搜索的是连续5个棋子的情况,搜索十个格子就会达到目的; 6
For(j=0;j<15;j++) if((situ[i][j]==-1)&&(situ[i+1][j]==-1)&&(situ[i+2][j]==-1)&&(situ[i+3][j]==-1)&&(situ[i+4][j]==-1))//连续的五个格子都占有棋子; score+=500000;//对黑子进行匹配<00000>的情况(500000分) else if((situ[i][j]==-1)&&(situ[i+1][j]==-1)&&(situ[i+2][j]==0)&&(situ[i+3][j]==-1)&&(situ[i+4][j]==-1)) score+=720; //对黑子进行匹配<00+00>的情况(720分) else if((situ[i][j]==0)//对黑子进行匹配<+0000>的情况(720分)) score+=720; else if((situ[i+4][j]==0)//对黑子进行匹配<0000+>的情况(720分)) score+=720; else if((situ[i+2][j]==0)//对黑子进行匹配<0+000>的情况(720分)) score+=720; else if((situ[i+3][j]==0)//对黑子进行匹配<000+0>的情况(720分)) score+=720; //同样的道理,对白子进行匹配: else if((situ[i][j]==1)&&(situ[i+1][j]==1)&&(situ[i+2][j]==1)&&(situ[i+3][j]==1)&&(situ[i+4][j]==1) score-=500000;//对白子进行匹配<00000>的情况<-500000分> else if((situ[i][j]==1)&&(situ[i+1][j]==1)&&(situ[i+2][j]==0)&&(situ[i+3][j]==1)&&(situ[i+4][j]==1)) score+=720;//对白子进行匹配<00+00>的情况(720分) else if((situ[i][j]==0)//对白子进行匹配<+0000>的情况(720分)) score+=720; else if((situ[i+4][j]==0)//对白子进行匹配<0000+>的情况(720分)) score+=720; else if((situ[i+2][j]==0)//对白子进行匹配<0+000>的情况(720分)) score+=720; else if((situ[i+3][j]==0)//对白子进行匹配<000+0>的情况(720分)) score+=720; 在纵路上搜索,核心的代码及解释如下:
7
For(0<=i<15) For(0<=j<11) //与横路上同理,i的值不变j的值依次+1寻找符合标准的情况 例如匹配黑子<00000>的情况: If((situ[i][j]==-1)&&(situ[i][j+1]==-1)&&(situ[i][j+2]==-1)&&(situ[i][j+3]==-1)&&(situ[i][j+4]==-1)
同样地可以匹配白子情况分数为负分。 在左斜路上搜索,主要的代码及解释如下:
For(4<=j<15;j++) For(0<=i
For(1<=i<11;i++) For(14>=j>i+3;j--) If((situ[i+14-j][j]==-1)&&(situ[i+14-j+1][j-1]==-1)&&(situ[i+14-j+2][j-2]==-1)&&(situ[i+14-j+3][j-3]==-1)&&(situ[i+14-j+4][j-4]==-1) //对黑子进行匹配<00000>的情况(500000分) score+=500000;
同理对黑子的其他情况进行匹配,对白子也进行同样匹配得分为负数。 寻找完以上情况之后,我们还要对一些得分较少的情况进行搜索,我们对<+0000+>,<+000++>,<++000+>,<+00+0+>,<+0+00+>,<++00++>,<++0+0+>,<+0+0++>,<+++0++>,<++0+++>等几种情况进行搜索。
在横路上搜索,主要的代码及解释如下:
For(0<=i<10;i++) For(0<=j<15;j++) If((situ[i][j]==0)&&(situ[i+1][j]==-1)&&(situ[i+2][j]==-1)&&(situ[i+3][j]==-1)&&(situ[i+4][j]==-1)&&(situ[i+5][j]==0)) //对黑子进行匹配<+0000+>的情况(4320分) score+=4320; If((situ[i][j]==0)&&(situ[i+1][j]==-1)&&(situ[i+2][j]==-1)&&(situ[i+38
][j]==-1)&&(situ[i+4][j]==0)&&(situ[i+5][j]==0)) //对黑子进行匹配<+000++>的情况(720分) score+=720; If((situ[i][j]==0)&&(situ[i+1][j]==0)&&(situ[i+2][j]==-1)&&(situ[i+3][j]==-1)&&(situ[i+4][j]==-1)&&(situ[i+5][j]==0)) //对黑子进行匹配<++000+>的情况(720分) score+=720; If((situ[i][j]==0)&&(situ[i+1][j]==-1)&&(situ[i+2][j]==-1)&&(situ[i+3][j]==0)&&(situ[i+4][j]==-1)&&(situ[i+5][j]==0)) //对黑子进行匹配<+00+0+>的情况(720分) score+=720; If((situ[i][j]==0)&&(situ[i+1][j]==-1)&&(situ[i+2][j]==0)&&(situ[i+3][j]==-1)&&(situ[i+4][j]==-1)&&(situ[i+5][j]==0)) //对黑子进行匹配<+0+00+>的情况(720分) score+=720; If((situ[i][j]==0)&&(situ[i+1][j]==0)&&(situ[i+2][j]==-1)&&(situ[i+3][j]==-1)&&(situ[i+4][j]==0)&&(situ[i+5][j]==0)) //对黑子进行匹配<++00++>的情况(120分) score+=120; If((situ[i][j]==0)&&(situ[i+1][j]==0)&&(situ[i+2][j]==-1)&&(situ[i+3][j]==0)&&(situ[i+4][j]==-1)&&(situ[i+5][j]==0)) //对黑子进行匹配<++0+0+>的情况(120分) score+=120; If((situ[i][j]==0)&&(situ[i+1][j]==-1)&&(situ[i+2][j]==0)&&(situ[i+3][j]==-1)&&(situ[i+4][j]==0)&&(situ[i+5][j]==0)) //对黑子进行匹配<+0+0++>的情况(120分) score+=120; If((situ[i][j]==0)&&(situ[i+1][j]==0)&&(situ[i+2][j]==0)&&(situ[i+3][j]==-1)&&(situ[i+4][j]==0)&&(situ[i+5][j]==0)) //对黑子进行匹配<+++0++>的情况(20分) score+=4320; If((situ[i][j]==0)&&(situ[i+1][j]==0)&&(situ[i+2][j]==-1)&&(situ[i+3][j]==0)&&(situ[i+4][j]==0)&&(situ[i+5][j]==0)) //对黑子进行匹配<++0+++>的情况(20分) 9
score+=20; 同理白棋也用这样的方式搜索,分数为负数。
在纵路上搜索,主要的代码及解释:
For(0<=i<15;i++) For(0<=j<10;j++) if((situ[i][j]==0)&&(situ[i][j+1]==-1)&&(situ[i][j+2]==-1)&&(situ[i][j+3]==-1)&&(situ[i][j+4]==-1)&&(situ[i][j+5]==0)) { //对黑子进行匹配<+0000+>的情况(4320分) score+=4320; } 同样的道理对其他的黑子进行匹配,匹配的得分与横路上的得分相同,不同的是横坐标不变,纵坐标改变情况下的结果,白子类似分数为黑子的负分。
在左斜路上搜索,主要的代码及解释如下:
For(5<=j<15;j++) For(0<=i
在右斜路上搜索,主要的代码及解释如下:
for(5<=j<15;j++) for(0<=i
10
评价函数就是对每一种可能出现的棋局给出不同等级的得分,最后我要根据对棋盘的全面搜索得出来的这个得分,选出得分最高的下棋位置,所以我们要返回这个重要的值Score,也是这个函数最重要的一行代码:
Renturn score;//返回得分; 至此评价函数就设计完了。
3.2 极大极小搜索及alpha-beta剪枝
我们用MixMaxSearchCut()函数来进行极大极小搜索和alpha-beta剪枝,程序的主要代码及解释如下:
Int score=0;设score初始值为0; If(depth==0)已经到达底层 {直接返回静态估值结果} 生成下一阶段可能的棋局: For(0<=i<15;i++) { For(0<=j<15;j++) { If(root在搜索范围内并且为未落子) { char situ[15][15]; //定义数组记录棋局(为未落子,-1为黑子,为白子)初始化数组memcpy(); situ[i][j]=(root->type)*-1; root->type用来记录当前位置是极大点还是极小点 char searchAreaFlag[15][15];定义数组记录某点是否在搜索范围内(0为不在范围内,1为在范围内) for (i-SearchArea<=m<= i+SearchArea;m++) { for (j- SearchArea<=n<=j+ SearchArea;n++) { If(0<=n<=14并且0<=m<=14) { searchAreaFlag[m][n]=1;} } } Node*tempNode=newNode((char*)situ,(char*)searchAreaFlag,(root->type)*-1); root->nextSituationList.push_back(tempNode); } } } 进行递归及alpha-beta剪枝: If( 当前为极大点) { 11
for(list
If(score>alpha)//搜索比alpha大的值,比它小的值都没有意义 { If(score>beta)//搜索比beta大的值,比它大的值做舍弃处理 { Root->score=score; Return score; } Else { Alpha=score; } } } Root->score=alpha;//返回alpha的值; 考虑完极大点的情况要考虑极小点的情况,做法与极大点的情况相反。
3.3本章总结
人们都说算法是程序的灵魂,通过对五子棋算法的研究,能更好地掌握博弈论知识,理解深度搜索中的极大极小搜索的方法,剪枝方面比较有难度,不过用心研究发现算法还是很有趣。
12
4 基于OpenGL五子棋系统设计
基于OpenGL五子棋的系统设计暴扣操作设计和界面设计,这一章将详细地描述游戏的设计过程。
4.1 操作设计
通过资料查询以及前三章的分析,可以清晰地搭建出我们此次设计的结构框架来。这是一个基于OpenGL的五子棋游戏,采用Visual studio 2008提供的面向对象的Windows编程接口MFC来制作一个主界面,主界面分别可连接到人机对战和人人对战的窗口。
如图1描述的是系统框架;
基于OpenGL五子棋游
新 鼠开标始 实 现重功鼠能标实现悔棋开键始盘实现重新图1系统结构框架图
人机对战 人人对战 主界面
功键能盘实现退出4.1.1 人机对战
所谓的人机对战顾名思义,就是我们和电脑系统下棋。这里就涉及到了五子棋的人工智能算法。在此系统中我们采用的是最大最小搜索与alpha-beta剪枝的算法来实现,前面我们已经将算法介绍了。
我们采用一个15*15的棋盘下棋;在棋盘上面对应位置通过点击鼠标下子,棋盘上将在相应的位置上显示棋子,棋子显示在棋盘的格子中。
由电脑掌握的黑子先下棋,在棋盘的正中央格子中下黑子;由玩家控制鼠标
13
下白子,白子每下一步,电脑都会计算出黑子的最佳走棋位置并下黑子,这个计算采用的就是第三章所介绍的算法,会下五子棋的人都知道,当你走一步棋的时候未必是最佳的走法,因为棋局的每一步都要为下一步考虑,这样才能获得最后的胜利,极大极小搜索算法就是搜索出一条深度为depth(搜索接下来几步)的最佳路径,当然这个路径会有很多情况,因为我们不知道对手会走什么样的位置,所以假设对手每一步都走最好的路径,搜索出最利于我方的一条路径,此系统设置depth的值为2,通过改变depth的值可以改变人机对战单机版的游戏难易程度。
如上所述游戏,直到一方先达到5子相连(在横路,纵路,左斜路,右斜路上)的情况结束游戏,判断相连的五个棋子的颜色,如果为黑色则为电脑获胜,为白色则为玩家获胜,系统会给出提示信息提示哪方获胜并提示重新开始游戏方法,棋盘中会有直线标出五子连珠的五个棋子,此时无法再在棋盘上下子;如果棋盘下满还未分出胜负即为平局,游戏结束和平局都会有消息对话框弹出提示;点击r键重新开始游戏,点击q键退出游戏。 4.1.2 人人对战
双人对战的实现比人机对战实现得容易得多,两人交替操作鼠标来执黑白两子进行游戏,直到一方获胜游戏结束,或者棋盘下满还未分出胜负则为平局。双人对战的核心代码是判断哪一方获胜,要分别对黑白两方进行判定,以下是我的判断方法,与人机对战的判断方法类似: bool isWin(int x,int y) {
int dir[][2]={0,1,1,0,1,1,1,-1}; for(int i=0;i<4;++i) {
int len=1;
chessboard[x][y]用来标记棋盘棋子,0表示没棋子,1表示黑子,-1表示白子
for(int
++len;
j=1;chessboard[x][y]==chessboard[x+j*dir[i][0]][y+j*dir[i][1]];++j)
for(int
++len;
j=1;chessboard[x][y]==chessboard[x-j*dir[i][0]][y-j*dir[i][1]];++j)
if(len>=5) return 1;
14
}
return 0; }
另外,我在人人对战中设计了悔棋的功能,点击鼠标右键,选择“go back”
可以实现悔棋功能,返回下棋的上一步。 4.1.3 鼠标与键盘的操作
一个好的游戏要有一个很好地交互性,而交互性的体现就在游戏的可操作性上面,本次系统的操作性体现在:鼠标操作,键盘操作,实现重新开始游戏,退出游戏,悔棋等功能的实现。
我们用myGlutMouseFunc()函数来处理用户从鼠标输入的一些信号; 首先我们要判断鼠标点击的方法:鼠标左键点击且放开; If((button==GLUT_LEFT_BUTTON)&&(state==GLUT_UP)) 判断当前棋盘是否显示正确;
if (WindowWidth 判断落子的位置,根据横纵坐标来判断,如果点击的是横纵棋盘线的交界点,我们判断交界点右上角为落子的位置; IntxPos=(int)((x-(WindowWidth-WindowHeight)/2.0f) /(WindowHeight/15.0f)); Int yPos=(int)(y/(WindowHeight/15.0f)); 判断落子的位置是否有效,如果超出棋盘或者落子的位置已经有棋子都为无效位置; if((xPos<0)||(yPos<0)||(xPos>14)||(yPos>14)||(curSituation[xPos][yPos]!=0)) 超出这些条件的落子都为无效的,给出提示信息,并且返回; 否则落子有效的情况下我们要更新棋盘; curSituation[xPos][yPos]=1; for (int i=xPos-SearchArea;i for (int j=yPos-SearchArea;j if ((i>=0)&&(i<=14)&&(j>=0)&&(j<=14)) { inSearchAreaFlag[i][j]=1; } 15 } } 更新最后一步所在的位置: lastStepX=xPos; lastStepY=yPos; 到此myGlutMouseFunc()函数就基本完成实现了下棋的功能,当鼠标在棋盘上点击后,会在相信位置落下棋子,并被绘制出一个实心的白圆;为了可以得到更好地锻炼,在人机对战中将棋子下在格子里,在人人对战中将棋子下在横纵相交的点上,采用的方法就是计算棋子位置坐标时不相同。 在人人对战中,实现了鼠标右键点击事件,鼠标左键点击,会出现一个列表框,有“start a new game”和“go back”两个选项; 实现这个功能首先要写一个processMenu()函数,此函数用来定义点击列表框中的信息后执行的功能,函数的主要代码及解释如下; switch(opt) { case 1: newGame(); break; case 2: } if(steps.empty()) break; int temp=steps.top(); steps.pop(); chessboard[temp>>4][temp&15]=0; isBlack=!isBlack; break; 然后我们再把processMenu()加到鼠标点击事件中来: int newGameMenu = glutCreateMenu(processMenu); glutAddMenuEntry(\glutAddMenuEntry(\glutAttachMenu(GLUT_RIGHT_BUTTON); 在人机对战中,使用了键盘事件实现重新开始和退出游戏的功能; 我们用myGlutKeyboardFunc(unsigned char key,int x,int y)实现键盘输入操作,这个函数传入一个key值,这个值用来接收按键信息,主要代码及解释 16 如下: If(key==’q’) 用一个消息提示框询问是否退出; if (MessageBoxA(NULL,\确实要退出吗?\信息\ { return; } 设置不再接收输入的标记 acceptInputFlag=false; exit(0);退出程序; if(key==’r’) 重置棋盘: ResetSituation(); 4.3 界面设计 4.3.1 OpenGL的图形生成 OpenGL是一个与平台无关的图形接口,操作系统必须提供像素格式管理和渲染环境管理。OpenGL在Windows NT上的实现是基于Client/Server模式的,应用程序发出OpenGL命令,由动态链接库OpenGL32.DLL接收和打包后,发送到服务器端的WINSRV.DLL,所以我们事先要把这两个动态链接库放到指定的文件夹中,然后由它通过DDI层发给视频显示驱动程序。如果系统安装了硬件加速器,则由硬件DDI来处理。 OpenGL采用渲染上下文RC(Render Context,又称渲染描述表)绘图。渲染上下文主要由以下6个wgl函数来管理: HGLRC wglCreateContext(GDC hdc); BOOL wglDdleteContext(HGLRC hglrc); HGLRC wglGetCurrentContext(void); HDCwglGetCurrentDC(void); BOOLwglMakeCurrent(HDC hdc,HGLRC hglrc); BOOL wglUseFontBitmaps(HDC hdc, DWORD dwFirst, DWORD dwCount, DWORD dwBase); 如图2为OpenGL图形处理系统层次结构图: 17 交互界面 OpenGL的图形环境 窗口系统 算法实现 操作系统 图形硬件 图2 OpenGL图形处理系统层次结构 4.3.2 基本图形的绘制方法 OpenGL中所有图形都是由点glVertex3f()构成,基本图形画法形式如下: glBegin(type); //连接各顶点的方式 ?????????//图形的顶点坐标集; glEnd (); 顶点连接方式(构图类型)决定了构成图形的形式。如图3,图4,图5为我们展示了基本图形的生成,包括点、线、面的生成: 点的生成: void Point()//画点 {glBegin(GL_POINTS);//单个顶点 glVertex3f( 0.0f, 1.0f,-1.0f);//a点 glVertex3f(-1.0f,-1.0f, 0.0f);//b点 glVertex3f( 1.0f,-1.0f, 0.0f);//c 点 glEnd();} 图 3 基本图形点的生成 18 线的生成: void Line()//画线 { glBegin(GL_LINE_LOOP);//闭合折线 glVertex3f( 0.0f, 1.0f,-1.0f); //a点 glVertex3f(-1.0f,-1.0f, 0.0f); //b点 glVertex3f( 1.0f,-1.0f, 0.0f); //c点 glEnd(); } 图4 基本图形线生成 面的生成: void Triangle() //画面 { glBegin(GL_POLYGON);//填充凸多边形 glVertex3f( 0.0f, 1.0f,-1.0f);//a点 glVertex3f(-1.0f,-1.0f, 0.0f);//b点 glVertex3f( 1.0f,-1.0f, 0.0f);//c点 glEnd();} 图5基本图形面生成 4.3.3主界面窗口设计 此次系统中的窗口设计采用的是MFC(微软基础类库),MFC是C++图形化界面语言,专门用来设计图形化界面。一个MFC窗口对象是一个C++ CWnd类(或派生类)的实例,是程序直接创建的。在程序执行中它随着窗口类构造函数的调用而生成,随着析构函数的调用而消失。 此系统中用MFC创建一个对话框窗口,在对话框窗口中放入两个按钮,通过注册按钮的点击事件链接游戏窗口平台,这个功能的实现提高了系统的可交互性,操作简单方便用户使用。 首先我们需要创建一个对话框类: class CAboutDlg : public CDialog 19 { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: }; DECLARE_MESSAGE_MAP() 建立对话框对象,创建构造函数和虚构函数: CtestDlg::CtestDlg(CWnd* pParent /*=NULL*/) { } CtestDlg::~CtestDlg() { } void CtestDlg::DoDataExchange(CDataExchange* pDX) { } BEGIN_MESSAGE_MAP(CtestDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BUTTON1, &CtestDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, &CtestDlg::OnBnClickedButton2) CDialog::DoDataExchange(pDX); printf(\m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); : CDialog(CtestDlg::IDD, pParent) END_MESSAGE_MAP() 我们在对话框中设置两个按钮,分别触发人人对战与人机对战的功能,注册 20 按钮事件的方法如下,写一个OnBnClickedButton1()函数,在这个函数中写入关联的可执行程序,采用CreateProcess方法将可执行程序gobang.exe与按钮联系起来。 void CtestDlg::OnBnClickedButton1() { STARTUPINFO StartInfo;//启动信息 memset(&StartInfo,0,sizeof(STARTUPINFO)); StartInfo.cb = sizeof(STARTUPINFO);//设定结构的大小 PROCESS_INFORMATION pinfo; BOOL bRet = CreateProcess(_T(\NORMAL_PRIORITY_CLASS, NULL, NULL, &StartInfo, &pinfo); } 4.3.4棋盘界面设计 想要绘制棋盘界面,首先要了解OpenGL的绘制过程。OpenGL首先将物体转化为可描述的物体几何性质的顶点(Vertex)与描述图像的像素(Pixel)。在执行一系列操作后,最后将这些数据转化成像素数据。也就是说,OpenGL是基于顶点的。 在OpenGL中,无论何种情况,指令是被顺序执行的。由一组顶点定义的图元(Primitive)执行完绘制操作后,后继图元才能使用。 接下来介绍的是人机对战中棋盘界面的设计: 棋盘的大小为15*15方格的一个正方形矩阵,我们采用16条纵向直线和16条横向直线交汇形成网格。 glLineWidth(2.0f);指定线的宽度 glColor3f(1.0f,0.0f,0.0f);指定线的颜色 for(7.5f<=f<=7.5f;f++) glBegin(GL_LINES);描绘横线; glVertex2f(-7.5f,f); glVertex2f(7.5f,f); glEnd(); glBegin(GL_LINES);描绘竖线 glVertex2f(f,-7.5f); glVertex2f(f,7.5f); glEnd(); 描绘棋子的时候,棋子分为黑白两色,所以要先对黑白两色进行判断,标记 21 后再绘制,采用堆栈的方式将棋子绘制; For(0<=i<15;i++) For(0<=j<15;j++) curSituation[i][j]=1 //为白子,设置颜色为白色:glColor3f(1,1,1); curSituation[i][j]=-1//为黑子,设置颜色为黑色:glColor3f(0,0,0); glPushMatrix();//采用堆栈的方法将棋子放入; glTranslatef(-7.0f+i,7.0f-j,0.0f); glutSolidSphere(0.4f,15,15);//绘制棋子; glPopMatrix(); 高亮显示最后一步棋的位置,将此位置的边框加粗,改变边框颜色; 如果finishFlag==1,说明游戏结束有一方胜利,此时要画出五子连珠的直线: glLineWidth(6.0f); glColor3f(0.0f,1.0f,1.0f); glBegin(GL_LINES); glVertex3f(-7.0f+startX,7.0f-startY,4.0f); glVertex3f(-7.0f+endX,7.0f-endY,4.0f); glEnd(); 人人对战中棋盘界面的设计与人机对战中棋盘界面的设计类似,为了学习不同的构图方法,我将人人对战中的棋子放在横线与纵线的交界处,而不是像人机对战那样放在格子中央,采用的方法是将棋子的坐标位置设定在不同的方位上。 4.1 本章总结 通过对五子棋系统设计的详细分析,理清了制作的思路,对主要的功能进行了全面的分析,使得实现起来达到了事半功倍的效果,正所谓磨刀不误砍柴工。 22 5 系统实现 打开系统首先我们会进入一个由MFC制作的欢迎界面,界面有两个按钮分别为人人对战和人机对战,可以对界面进行移动和关闭,如图4: 图6主界面窗口 两个界面分别连接着两个游戏界面,我们点人机对战按钮进入人机对战界面。 首先会弹出一个游戏说明的提示框,提示用户电脑走黑子,用户走白子,用户可以通过键盘操作,实现重新开始游戏和退出游戏的功能,如图5: 图7游戏提示界面 点击确定进入游戏界面如图6: 进入游戏界面,此界面是人机对战的窗口,我们可以对窗口进行移动,最小化,最大化,和关闭等操作,一进入界面,首先我们会看到棋盘中央会有一个黑色棋子显示,并且高亮显示,电脑执黑子下棋,玩家操作白子通过点击鼠标在棋盘中下棋,直到一方取胜或者平局游戏结束,若玩家点击棋盘交界处将会在右上角的格子中落子,若点击棋盘中有棋子的地方则会提示此处无法落子,游戏结束时会弹出一个消息提示框,如图7: 23 图8人机对战界面 图9人机对战结束界面 提示框会提示用户是输了还是赢了还是平局的消息,用户可以按r键重新开始游戏,点击关闭窗口退出人机对战,点击人人对战进入人人对战界面,如图8: 24 图10双人对战界面 图为人人对战的游戏窗口,点击棋盘可以下次,黑棋先走,白棋黑子依次交替走棋,直到一方胜出或棋盘下满,点击鼠标右键可以选择重新开始和悔棋的功能,如图9: 图11双人对战选项菜单 点击go back按钮实现悔棋的功能;点击start a new game开始新一轮的游戏。 25 6 总结 三个月的学习很快就过去了,通过查找资料,实践调查,动手制作终于完成本次的论文,好的总结是为了更好地提升自我能力,对此次设计我的总结如下: 本次设计的游戏实现了人机对战和人人对战两大功能。在人机对战中,涉及到了五子棋的人工智能算法,本系统中采用的是最大最小搜索和alpha-beta剪枝算法,此算法是博弈论的常用算法,用递归搜索的方法找出最佳下棋子的位置,通过alpha-beta剪枝来节省搜索的时间,对搜索进行优化。通过本次的学习,我更加理解算法在日常生活中的运用,初步学会了将数学模型转换成日常生活中的图像模型,同样也学会怎么把日常生活中问题用程序语言来表示,提高了我的逻辑思维能力和问题的解决能力。 本次设计是基于OpenGL开发的。通过此次设计我更好地学习了OpenGL的绘图流程,更好地掌握并学会运用OpenGL图形库函数,使用OpenGL的鼠标触发函数和键盘触发函数来对鼠标及键盘进行操作。更近一步学习计算机图形学的知识,能从简单的二维空间进一步向三维空间思考问题。 当然还有很多不足的地方。在界面的设计中缺乏可交互性的思考,界面中按钮较少,对用户来说不是特别好操作,游戏的音效和游戏动画在里面都没有实现。游戏的难易程度没有体现,在深度搜索中应该考虑到不同的深度对游戏的难易程度来说会有影响,由于时间匆促没有实现这一个功能。 当然在本次设计中我也学到了许多以后有用的东西。锻炼了快速查阅各种资料和收集、整理资料的能力,这对以后参加工作学习和接受新知识是一种很好的锻炼。平时学习的都是一些理论知识,并没有真正的去应用和动手实践。通过这次毕业设计,锻炼了动手能力。毕业设计培养了严肃认真和实事求是的科学态度,而且培养了吃苦耐劳的精神及相应的工程意识,同学间友谊互助也充分在毕业设计中体现出来。 26 参考文献 [1]王兰美,赵继成,秦华东. OpenGL及其在VC++下的开发应用[J]. 武汉大学学 报(工学版),2006,04:62-65. Lan-mei wang, Zhao Jicheng hua-dong qin. OpenGL and its application under the VC++ development [J]. Journal of wuhan university (engineering science), 2006, 62:62-65( in Chinese). [2] 张皓. 基于OpenGL的3D动作游戏设计研究[D].河北大学,2010. Tim zhang. Based on OpenGL 3 D action game design research [D]. Hebei university, 2010( in Chinese). [3]王欣. 深入应用Visual C++编程[J]. 信息与电脑(理论 版),2010,07:106-107. Wang xin will be further used Visual C++ programming [J]. Journal of information and computer (theory), cutflower production potentials of 2010:106-107( in Chinese). [4] 夏俊力. 基于OpenGL和VisualC++的交互式虚拟实验系统的研究[D].华中 科技大学,2011. Xia Junli. Interactive virtual experiment system based on OpenGL and VisualC++ research [D]. Huazhong university of science and technology, 2011( in Chinese). [5] 冯伟,周云才. 基于VC++和OPENGL的3ds文件的读取与控制[J]. 科技信 息,2009,01:479+450. Feng wei, yun-cai zhou. Based on VC++ and OPENGL 3 ds file to read and control [J]. Journal of information science and technology, 2009,01:479 + 450( in Chinese). [6] 崔蕊. Microsoft的基本类库MFC简介[J]. 统计与咨询,2002,06:29-30. Cui Rui. Microsoft basic class library of introduction of the MFC [J]. Journal of statistics and consulting, 2002 practices: 29 and 30( in Chinese). [7] 雷小锋. VC++中基于MFC类库的应用程序框架机制[J]. 电脑编程技巧与维 护,2000,04:16-17( in Chinese). LeiXiaoFeng. VC++ application framework based on the MFC class library system [J]. Computer programming skills and maintenance, 2000, 2000:16-17( in Chinese). 27 [8] 贾晓亮,辛菁,朱名铨,孔宪光,张振明. 使用Visual C++开发大型应用软件 系统的体会与探讨[J]. 计算机工程与应用,2002,20:126-128. Xiao-liang jia, XinJing, zhu name makes Kong Xianguang, zhen-ming zhang. Use Visual C++ development experience of the large-scale application software system and discusses [J]. Computer engineering and application, 2002, 20:126-128( in Chinese). [9] 胡俐蕊. Visual C++6.0MFC应用程序设计的基本特征[J]. 电脑开发与应 用,2003,12:37-39. Hu Lirui. The basic characteristics of the Visual C++ 6.0 MFC application design [J]. Computer development and application, 2003, 12:37, 39( in Chinese). [10]龚安,宫法明. 用OpenGL实现交互式的三维图形显示[J]. 科学技术与工 程,2006,10:1428-1430. Gong An GongFaMing. Use OpenGL achieve interactive 3 d graphics display [J]. Science, technology and engineering, 2006, 10, 1428-1430( in Chinese). [11]刘升,王行愚,游晓明. 基于VC++的OpenGL三维动画仿真及场景漫游的实现 [J]. 计算机工程与设计,2006,17:3235-3238. Chace, xing-yu wang, xiao-ming you. Based on vc + + OpenGL 3 d animation simulation and scene roam the implementation of the [J]. Computer engineering and design, 2006:3235-3238( in Chinese). [12]尚艳玲,谷保庆. 使用MFC实现OpenGL应用程序的开发[J]. 安阳师范学院 学报,2007,05:47-50. ShangYanLing GuBaoQing. Use MFC to achieve OpenGL application development [J]. Journal of anyang normal college, 2007, 05:47-50( in Chinese). [13]Richard S.Wright,Jr. Nicholas Haemel Graham Sellers Benjamin Lipchak.OpenGL SuperBible[M].Pearson Education,2012,05:20-230. [14]Dave Astle,Kevin Hawkins .OpenGL Game[M].Chongqing University press, 2006:35-98. [15]Tony Gaddis .C++ graphics and game programming basis[M].Tsinghua University pressc,2010:37-98. [16] Dave Astle.Kevin Hawkings. Beginning OpenGL game programming[M].Premier Press,2004:35-145. 28 [17]Dave Shreiner. OpenGL reference manual[M]third edition.Machine Press,2001:53-102. 29 致谢 在学习了方老师教的“计算机图形学”这一门课程后,我就对计算机图形学很感兴趣,所以在此次论文选题我就毅然决然地选择方老师的课题。在方老师的指导下,学习了OpenGL这一图形学工具,完成了基于OpenGL开发的五子棋小游戏。 在这几个月的短暂学习里,方老师用他渊博的知识、严谨的治学态度向我提供了帮助,我要向我的导师致以衷心的感谢和崇高的敬意!同时,我也在方老师的身上学到了很多,比如他精益求精的工作作风、不厌其烦的指导和对科学的献身精神,这些都使我受益匪浅,也是我今后学习和工作中的一笔精神财富,并将成为我终身献身科学和献身事业的动力。同时,我也要感谢帮助我的同学们,他们与我讨论学习方法,探讨论文,一起解决了大大小小的很多问题,让我明白了团队的力量,在今后的学习中,我将更注重与别人合作沟通的能力,不再是孤军奋战。 书籍是陪伴我们最好的无声老师,这次论文能够顺利完成,前辈的著作给了我很大的帮助,正所谓站在巨人的肩膀上学习,达到了事半功倍的效果。也非常庆幸我们生活在互联网的时代,给我们查询资料带来了便捷。 最后也要感谢学校能够给我提供最后一次质量这么高的学习与实践机会,让我获得了巨大的成长。 30 附录 31
正在阅读:
基于OpenGL小游戏开发及实践01-17
《奇迹男孩》读书笔记范文03-23
2013年计算机三级信息安全技术考试试卷10-30
高中政治必修三随堂笔记12-23
黄梅县联社房屋按揭贷款按揭贷款业务操作手册(完整版) - 图文03-04
管教孩童七定律10-05
超星网络课数学思维与创新07-06
小肠病人的护理查房03-01
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 小游戏
- 基于
- 实践
- OpenGL
- 开发