已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 20152015 届毕业设计论文届毕业设计论文 基于 OpenGL 的小型游戏开发及实践 院 部 计算机与信息科学学院 学生姓名 杜磊 指导教师 方小勇 职称 副教授 专 业 计算机科学与技术 班 级 1103 完成时间 2015 6 2 摘 要 信息时代的到来使得电脑越来越普及 人们对电脑游戏的需求也越来越高 游戏的界面美观性 可操作性无疑是人们考虑的关键因素 OpenGL 是一种主流 的图形处理工具 基于 OpenGL 开发的小游戏有更好的观赏性 本次论文论述的 是基于 OpenGL 开发的五子棋小游戏 五子棋 起源于中国古代传统的黑白棋游戏 简单易懂又不缺乏趣味性 其中的对弈较量 不仅增强人的思维能力 开发人的智力 而且简单的游戏规 则中蕴含着深奥的棋技 是修身养性 陶冶情操的一款经典游戏 本次论文是基于 OpenGL 和 C 语言在 Visual Studio 2008 环境下编程 设计了一款人机对战 人人对战功能的五子棋游戏 采用极大极小搜索算法及 alpha beta 剪枝算法 采取优先级策略来判别棋局 实现了单机游戏的人工智 能 运用了 OpenGL 的 alpha 混合及深度测试等一系列的特性 将计算机图形学 与算法相结合 旨在设计出一款界面客观性强 游戏可操作性强的一款小游戏 软件 通过学习 基本掌握 OpenGL 函数库的使用 能够制作简单的平台界面 实 现人机交互功能 探讨和研究了博弈论的相关知识 学会将算法与日常事务的 结合 运用算法去解决问题 由于时间原因 界面的美观性有待改进 游戏的 多样性以及难易程度的合理性并不是做的很好 希望在今后的学习中更加完善 不足的功能 关键词 OpenGL 五子棋 小游戏 博弈论 3 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 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 4 Key words OpenGL Gobang game game theory 5 目 录 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 的特点 5 2 3 Visual Studio 2008 5 2 4 本章总结 6 3 基于 OpenGL 五子棋算法的实现 7 3 1 极大极小搜索中的评价函数 7 3 2 极大极小搜索及 alpha beta 剪枝 12 3 3 本章总结 13 4 基于 OpenGL 五子棋系统设计 14 4 1 操作设计 14 4 1 1 人机对战 14 4 1 2 人人对战 15 4 1 3 鼠标与键盘的操作 16 4 3 界面设计 18 4 3 1 OpenGL 的图形生成 18 4 3 2 基本图形的绘制方法 19 4 3 3 主界面窗口设计 20 4 3 4 棋盘界面设计 22 4 1 本章总结 23 5 系统实现 24 6 总结 29 参考文献 30 6 致 谢 32 附 录 33 1 1 1 绪论绪论 本章节研究课题的背景及意义 明确做次课题的目的 通过查阅资料更好 地熟悉课题 1 11 1 课题研究的背景及意义课题研究的背景及意义 人类之所以不断在进步 是因为我们人类一直不断的在思考 在学习完计 算机图形学这门课程之后 我对图形学的研究很感兴趣 我在思考能不能用所 学的知识来做一些实践 恰巧我平时喜欢棋类游戏 我就想基于 OpenGL 来开发 一款游戏 而五子棋游戏程序的开发符合人类进步也是促进人类进步的一大动 力之一 五子棋游戏程序让人们方便快捷的可以下五子棋 让人们在何时都能 通过下棋来提高逻辑思维能力 同时也培养儿童的兴趣以及爱好 让孩子更加 聪明 同时 五子棋游戏程序的开发也使得五子棋这个游戏得到了广泛的推广 让世界各地的人们知道五子棋 玩上五子棋 这已经不是局限 五子棋游戏程 序使得越来越多的人喜欢上了五子棋 热爱下五子棋 它是具有很好的带动性 的 于是我收集了国内外有关计算机图形学的资料 我发现国内外最近几年计 算机图形学发展迅速 使得三维表现技术得以形成 这些三维表现技术使单调 的二维界面逐步转变为丰富立体的三围界面 我们能够再现三维世界中的物体 能够用三维形体来表示复杂的信息 这种技术就是可视化 Visualization 技 术 可视化技术把数据转化为图形 使人能够在三维图形世界中直接对具有形 体的信息进行操作 和计算机直接交流 这都归功于计算机图形学 计算机可 视化技术的发展 人们对计算机可视化技术的研究已经历了一个很长的历程 而且形成了许多可视化工具 其中 SGI 公司推出的 GL 三维图形库表现突出 易 于使用而且功能强大 进而发展为 OpenGL OpenGL 作为一个图形硬件接口 很 好地为程序员提供一个功能强大 低层次的渲染库 能够运用于任何软件平台 也得到了广泛的硬件支持 OpenGL 也为游戏开发提供强大的图形界面平台 使 得游戏画面感丰富 提高可观赏性 可见基于 OpenGL 的游戏开发将会成为主流市场 会给游戏行业带来新一番 的收获和体验 所以我想基于 OpenGL 来制作一款五子棋小游戏 对此课题的研 究也将让我更近一步熟悉 OpenGL 通过动手实践更好地学习新知识 巩固旧知 识 2 1 21 2 五子棋的发展与现状五子棋的发展与现状 充分的准备是成功的第一步 在确定了这一论文课题后 我收集了大量的 有关于五子棋的资料 五子棋这一棋类运动已迅速在国际上发展起来 外国人 都十分看好这一不起眼的智力游戏 并认为五子棋不仅能提高思维 开发智力 手脑并用 修身养性而且富含哲理 具有东方的神秘和西方的直观 是中西文 化的交汇点 许多国家的人对五子棋都有不同的爱称 例如韩国人把五子棋称 之为 情侣棋 因为五子棋可以两个人下 别有一番趣味 所以此次设计中 我将设计人人对战功能 供双人玩这个游戏 言下之意 我希望设计一款情人 之间可以下的五子棋 这样有利于增加情感的交流 欧洲人称之为 中老年棋 表示五子棋适合中老年人的生理特点和思维方式 所以我这一次设计中希望 设计人机对战的功能 这样老年人就可以跟电脑下棋 为老年人提供一个休闲 娱乐的工具 由此可见 尽管国度不同 语言各异 但人们都可以借助五子棋 这一简单而又深奥的棋艺进行交流 比赛 增进友谊 这也是我从五子棋的现 状中得到启发想要设计的一款软件 五子棋的流行令人瞠目结舌 目前有几十个国家都在下五子棋 也引申出 各种级别和规模的比赛 自 1989 年起 每两年都有五子棋世界锦标赛举行 从 第一届在日本东京都到俄罗斯联邦的莫斯科 瑞典以及爱沙尼亚的塔林 一届 比赛比一届精彩 日本人在这个比赛中一直都占据了领先的位置 除第三届的 冠军是爱沙尼亚人之外 其余三届的冠军都是日本人 日本目前对连珠 五子 棋 技术的研究也相当普遍和全面 并且日本五子棋职业棋手是令人敬畏的 他们的水平是世界级的 并且在日益增长 同时五子棋的理论研究与探索也呈 现蓬勃发展的势头 从 1858 年第一部五子棋专著问世以来 目前 全世界有 2000 多种五子棋的书籍及期刊 且用各种语言发行 五子棋在我国的各省市地 区都有很大的发展 收到人们的喜爱 最具有代表性的就属北京 举办了各种 规模的赛事 其他省市也举办了大大小小的赛事 所以我觉得做一个五子棋系 统肯定有很多人喜爱 1 31 3 OpenGLOpenGL 国内外研究现状国内外研究现状 OpenGL 作为一个性能优越的图形应用程序设计界面 API 适合于广泛的 计算机环境 从个人计算机 工作站到超级计算机 OpenGL 都能实现高性能的 图形功能 由于许多在计算机界具有领导地位的计算机公司纷纷采用 OpenGL 作为图形应用程序设计界面 OpenGL 应用程序具有广泛的移植性 OpenGL 已 成为目前的图形开发标准 OpenGL OpenGL Graphics Library 开发性图形库 是目前用于开发 2D 图形应 3 用程序的首选环境 具有可移植性 可交换性等优点 是行业领域中最为广泛 接纳的 2D 图形 API 也是目前应用最为广泛的计算机图形标准 其自诞生至今 已催生了各种计算机平台及设备上的数千优秀应用程序 通过对 OpenGL 的特 点 功能 工作流程和绘图流程的学习 我们将会对 OpenGL 有一个初步的了 解 建立起基本的概念 在国外 OpenGL 是具有一定的生命力的 唯一能够取代微软对图形技术的完 全控制的 API 但是由于 Silicon Graphics 公司已经不再以任何让微软不悦的 方式推广 OpenGL 所以采用 OpenGL 开发游戏还是具有一定风险 鉴于 OpenGL 的特点 还是有许多非常重要的开发人员仍然在使用 OpenGL 进行游戏的开发与 创作 因此 硬件开发商目前正在想法设法地加强硬件对 OpenGL 的技术支持 1 41 4 本章总结本章总结 通过查阅资料和阅读文献 我了解到 OpenGL 小游戏制作的研究现状 了 解一些商业上对 OpenGL 的运用 通过对五子棋的调研发现 喜欢这一游戏的 人居多 所以我明确了本次课题的对象 基于 OpenGL 设计出一款五子棋游戏 4 2 2 基于基于 OpenGLOpenGL 五子棋开发使用工具五子棋开发使用工具 2 12 1 C C C 是在 C 语言的基础上开发的一种通用编程语言 应用广泛 C 支持多 种编程范式 面向对象编程 泛型编程和过程化编程 C 语言灵活 运算符的数据结构丰富 具有结构化控制语句 程序执行效 率高 而且同时具有高级语言与汇编语言的优点 与其它语言相比 可以直接 访问物理地址 与汇编语言相比又具有良好的可读性和可移植性 C 引入了面向对象的概念 使得开发人机交互类型的应用程序更为简单 快捷 2 22 2 OpenGLOpenGL 2 2 1 什么是什么是 OpenGL OpenGL 是一种图形与硬件的接口 它包括了上百个图形函数 开发者可以 用这些函数来建立三维模型和进行三维实时交互 与其他图形程序设计接口不 同 OpenGL 提供了十分清晰明了的图形函数 因此初学的程序设计员也能利用 OpenGL 的图形处理能力和 1670 万种色彩的调色板很快地设计出三维图形以及 三维交互软件 OpenGL 强有力的图形函数不要求开发者把三维物体模型的数据写成固定的 数据格式 这样开发者不但可以直接使用自己的数据 而且可以利用其他不同 格式的数据源 这种灵活性极大地节省了开发者的时间 提高了软件开发效益 长期以来 从事三维图形开发的技术人员都不得不在自己的程序中编写矩 阵变换 外部设备访问等函数 这样为调制这些与自己的软件开发目标关系并 不十分密切的函数费脑筋 而 OpenGL 正是提供一种直观的编程环境 它提供的 一系列函数大大地简化了三维图形程序 1 OpenGL 提供一系列的三维图形单元供开发者调用 2 OpenGL 提供一系列的图形变换函数 3 OpenGL 提供一系列的外部设备访问函数 使开发者可以方便地访问 鼠标 键盘 空间球 数据手套等这种直观的三维图形开发环境体现了 OpenGL 的技术优势 这也是许多三维图形开发者热衷于 OpenGL 的缘由所在 2 2 22 2 2 OpenGLOpenGL 的特点的特点 OpenGL 具有标准化 它是唯一真正开放的 独立于供应商的 跨平台的图 5 形标准 稳定性 OpenGL 用时间证明它在各个平台上运用良好 它具有明确而控制良 好的规范 并具有向后兼容性 使现有的应用程序不会失效 扩展性 许多开发商利用这一特性通过对 API 进行扩展来对 OpenGL 的功能 进行升级 可缩放性 基于 OpenGL 的应用程序可以在各种系统上运行 其范围从家用电 脑到 PC 机 从工作站到超级计算机 可以说 OpenGL 应用程序可以适应开发人员 选择的各种目标平台 易用性 OpenGL 具有良好的结构 直观的设计和逻辑命令 与其他的图形程 序包相比 OpenGL 应用程序的代码行数少 此外 OpenGL 封装了有关基本硬件 信息 使开发人员无须针对具体的硬件进行专门的设计 可靠性和可移植性 在 OpenGL 兼容的任何硬件上 不管使用什么操作系统 同一个应用程序的显示结果均相同 与其它图形程序包相比 OpenGL 应用程序 的代码行数少 此外 OpenGL 封装了有关基本硬件的信息 使开发人员无需针对 具体的硬件进行专门的设计 在 CAD CAM CAE 医学图像处理 虚拟现实 娱 乐 广告等不同领域中 开发人员可以利用 OpenGL 的这些能力自由发挥自己的 创造性 2 32 3 VisualVisual StudioStudio 20082008 Visual studio 2008 是微软自行研发的一款开发系统 支持 Windows 平台 下各类应用软件和应用服务的开发 作为 C 与 OpenGL 的开发平台 能很好地 进行代码编写和调试 具有良好的运用性和友好性 Visual studio 2008 为程序员提供了一个面向对象的 Windows 编程接口 MFC Microsoft Foundation Class 它大大地简化了 Windows 编程工作 此 次小游戏开发中我也使用了编程接口 MFC MFC 提供了一个标准化的结构 这样 开发人员不必从头设计创建和管理一个标准 Windows 应用程序所需的程序 而 是 站在巨人肩膀上 从一个比较高的起点编程 故节省了大量的时间 其 次 它提供了大量的代码 指导用户编程时实现某些技术和功能 对用户来说 用 MFC 开发的最终应用程序具有标准的 熟悉的 Windows 界 面 这样的应用程序易学易用 2 42 4 本章总结本章总结 作为一名计算机专业的学生 利用网络资源学习是一项基本的技能 我通 过网络进一步学习了本次设计所用到的开发工具 很大的提高了我编程水平 6 3 3 基于基于 OpenGLOpenGL 五子棋算法的实现五子棋算法的实现 此章节中将介绍基于 OpenGL 五子棋所涉及到的一些算法 采用解析代码的 方法 阐述博弈论中的深度搜索策略 3 13 1 极大极小搜索中的评价函数极大极小搜索中的评价函数 极大极小搜索策略一般都是使用在一些博弈类的游戏之中 例如本次课题 的五子棋游戏 要讨论极大极小搜索算法 首先要明白什么是搜索 最基本的搜索方法是 暴力搜索 所谓暴力搜索就是采用循环语句将所有可能的情况搜索一遍 这个 搜索方法在本例中不适用 因为如果采用暴力搜索 把最终的结果得到的话 搜索树的深度太大了 机器不能满足 所以我们考虑另一个搜索策略 即深度 搜索 规定一个搜索的深度 在这个深度范围内进行深度优先搜索 极大极小 搜索算法的本质就是深度搜索 在搜索过程中 对本方有利的搜索点上应该取 极大值 而对本方不利的搜索点上应该取极小值 这里的极大极小值是相对而 言的 在设计人与机器对弈的情况下 我应该站在机器的角度考虑 为机器设计 出最佳的走棋策略 机器和人对弈 轮到机器走棋了 那么我们会遍历机器的 每一个可能走棋方法 然后对于前面机器的每一个走棋方法 遍历人的每一个 走棋方法 然后接着遍历机器的每一个走棋方法 如此下去 直到得到确定的 结果或者达到了搜索深度的限制 当达到了搜索深度限制 此时无法判断结局 如何 一般都是根据当前局面的形式 给出一个得分 计算得分的方法被称为 评价函数 不同游戏的评价函数差别很大 需要很好的设计 本课题中 我设计的评价函数如下 函数名为 EvaluateSituation char situation 在这个五子棋游戏中 定义棋盘的大小为 15 15 的方格举矩阵 也就是 225 小格的正方形棋盘 用数组 char situ 15 15 来表示 五子棋的规则是 有五个同颜色的子相连成一条直线 在横向 纵向 左斜路 右斜路上 即为 获胜 我们用 0 来表示我方的棋子 用 来表示敌方的棋子 则我们用 两种情况来分析得分 用一个 Int 型变量 score 来记录分数 首先我们来寻找 的 情况 以下用主要的代码以及我对代码的解释 在横路上搜索 核心的代码如下 For i 0 i 10 i 横向只需搜索十个格子 有五个格子是被棋子占用 因为我们 7 搜索的是连续 5 个棋子的情况 搜索十个格子就会达到目的 For j 0 j 15 j if situ i j 1 对黑子进行匹配的情况 分 else if situ i j 1 对黑子进行匹配的情况 720 分 else if situ i j 0 对黑子进行匹配的情况 720 分 score 720 else if situ i 4 j 0 对黑子进行匹配的情况 720 分 score 720 else if situ i 2 j 0 对黑子进行匹配的情况 720 分 score 720 else if situ i 3 j 0 对黑子进行匹配的情况 720 分 score 720 同样的道理 对白子进行匹配 else if situ i j 1 对白子进行匹配的情况 else if situ i j 1 对白子进行匹配的情况 720 分 else if situ i j 0 对白子进行匹配的情况 720 分 score 720 else if situ i 4 j 0 对白子进行匹配的情况 720 分 score 720 else if situ i 2 j 0 对白子进行匹配的情况 720 分 score 720 else if situ i 3 j 0 对白子进行匹配的情况 720 分 score 720 在纵路上搜索 核心的代码及解释如下 8 For 0 i 15 For 0 j 11 与横路上同理 i 的值不变 j 的值依次 1 寻找符合标准的情况 例如匹配黑子 的情况 If situ i j 1 i if situ i j i 1 同理对黑子的其他情况进行匹配 对白子也进行同样匹配得分为负数 在右斜路上搜索 主要的代码及解释如下 For 1 i j i 3 j If situ i 14 j j 1 同理对黑子的其他情况进行匹配 对白子也进行同样匹配得分为负数 寻找完以上情况之后 我们还要对一些得分较少的情况进行搜索 我们对 等几种情况进行搜索 在横路上搜索 主要的代码及解释如下 For 0 i 10 i For 0 j 15 j If situ i j 0 If situ i j 0 If situ i j 0 If situ i j 0 If situ i j 0 If situ i j 0 If situ i j 0 If situ i j 0 If situ i j 0 If situ i j 0 同理白棋也用这样的方式搜索 分数为负数 在纵路上搜索 主要的代码及解释 For 0 i 15 i For 0 j 10 j if situ i j 0 同样的道理对其他的黑子进行匹配 匹配的得分与横路上的得分相同 不 同的是横坐标不变 纵坐标改变情况下的结果 白子类似分数为黑子的负分 在左斜路上搜索 主要的代码及解释如下 For 5 j 15 j For 0 i j 4 i if situ i j i 0 j for 0 i j 4 i if situ 14 i j i 0 设 score 初始值为 0 If depth 0 已经到达底层 直接返回静态估值结果 生成下一阶段可能的棋局 For 0 i 15 i For 0 jtype 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 mtype 1 root nextSituationList push back tempNode 进行递归及 alpha beta 剪枝 If 当前为极大点 12 for list iteratorit1 root nextSituationList begin it1 root nextSituationList end it1 进行递归 深度每次减一 score MixMaxSearchCut it1 depth 1 alpha beta 为了在搜索过程中进行剪枝 优化搜索效率 在递归过程中要向下传递两 个参数 第 1 个参数是 alpha 它表示当前搜索节点走棋的一方搜索到的最好 值 任何比它小的值都没有意义 第 2 个值是 beta 表示对手目前的劣势 这 是对手所能承受的最坏的结果 比它大的值都会被舍弃 剪枝的主要代码如下 If score alpha 搜索比 alpha 大的值 比它小的值都没有意义 If score beta 搜索比 beta 大的值 比它大的值做舍弃处理 Root score score Return score Else Alpha score Root score alpha 返回 alpha 的值 考虑完极大点的情况要考虑极小点的情况 做法与极大点的情况相反 3 33 3 本章总结本章总结 人们都说算法是程序的灵魂 通过对五子棋算法的研究 能更好地掌握博 弈论知识 理解深度搜索中的极大极小搜索的方法 剪枝方面比较有难度 不 过用心研究发现算法还是很有趣 13 4 4 基于基于 OpenGLOpenGL 五子棋系统设计五子棋系统设计 基于 OpenGL 五子棋的系统设计暴扣操作设计和界面设计 这一章将详细 地描述游戏的设计过程 4 14 1 操作设计操作设计 通过资料查询以及前三章的分析 可以清晰地搭建出我们此次设计的结构 框架来 这是一个基于 OpenGL 的五子棋游戏 采用 Visual studio 2008 提供的面 向对象的 Windows 编程接口 MFC 来制作一个主界面 主界面分别可连接到人 机对战和人人对战的窗口 如图 1 描述的是系统框架 图 1 系统结构框架图 4 1 14 1 1 人机对战人机对战 所谓的人机对战顾名思义 就是我们和电脑系统下棋 这里就涉及到了五 子棋的人工智能算法 在此系统中我们采用的是最大最小搜索与 alpha beta 剪 枝的算法来实现 前面我们已经将算法介绍了 我们采用一个 15 15 的棋盘下棋 在棋盘上面对应位置通过点击鼠标下子 棋盘上将在相应的位置上显示棋子 棋子显示在棋盘的格子中 由电脑掌握的黑子先下棋 在棋盘的正中央格子中下黑子 由玩家控制鼠 基于 OpenGL 五子棋游 戏 主界面 人机对战人人对战 鼠标实现重 新开始 鼠标实现悔棋 功能 键盘实现重新 开始 键盘实现退出 功能 14 标下白子 白子每下一步 电脑都会计算出黑子的最佳走棋位置并下黑子 这 个计算采用的就是第三章所介绍的算法 会下五子棋的人都知道 当你走一步 棋的时候未必是最佳的走法 因为棋局的每一步都要为下一步考虑 这样才能 获得最后的胜利 极大极小搜索算法就是搜索出一条深度为 depth 搜索接下来 几步 的最佳路径 当然这个路径会有很多情况 因为我们不知道对手会走什么 样的位置 所以假设对手每一步都走最好的路径 搜索出最利于我方的一条路 径 此系统设置 depth 的值为 2 通过改变 depth 的值可以改变人机对战单机 版的游戏难易程度 如上所述游戏 直到一方先达到 5 子相连 在横路 纵路 左斜路 右斜 路上 的情况结束游戏 判断相连的五个棋子的颜色 如果为黑色则为电脑获 胜 为白色则为玩家获胜 系统会给出提示信息提示哪方获胜并提示重新开始 游戏方法 棋盘中会有直线标出五子连珠的五个棋子 此时无法再在棋盘上下 子 如果棋盘下满还未分出胜负即为平局 游戏结束和平局都会有消息对话框 弹出提示 点击 r 键重新开始游戏 点击 q 键退出游戏 4 1 24 1 2 人人对战人人对战 双人对战的实现比人机对战实现得容易得多 两人交替操作鼠标来执黑白 两子进行游戏 直到一方获胜游戏结束 或者棋盘下满还未分出胜负则为平局 双人对战的核心代码是判断哪一方获胜 要分别对黑白两方进行判定 以下是 我的判断方法 与人机对战的判断方法类似 bool isWin int x int y int dir 2 0 1 1 0 1 1 1 1 for int i 0 i 5 return 1 15 return 0 另外 我在人人对战中设计了悔棋的功能 点击鼠标右键 选择 go back 可以实现悔棋功能 返回下棋的上一步 4 1 34 1 3 鼠标与键盘的操作鼠标与键盘的操作 一个好的游戏要有一个很好地交互性 而交互性的体现就在游戏的可操作 性上面 本次系统的操作性体现在 鼠标操作 键盘操作 实现重新开始游戏 退出游戏 悔棋等功能的实现 我们用 myGlutMouseFunc 函数来处理用户从鼠标输入的一些信号 首先我们要判断鼠标点击的方法 鼠标左键点击且放开 If button GLUT LEFT BUTTON Int yPos int y WindowHeight 15 0f 判断落子的位置是否有效 如果超出棋盘或者落子的位置已经有棋子都为 无效位置 if xPos 0 yPos14 yPos 14 curSituation xPos yPos 0 超出这些条件的落子都为无效的 给出提示信息 并且返回 否则落子有效的情况下我们要更新棋盘 curSituation xPos yPos 1 for int i xPos SearchArea i xPos SearchArea i for int j yPos SearchArea j 0 isBlack isBlack break 然后我们再把 processMenu 加到鼠标点击事件中来 int newGameMenu glutCreateMenu processMenu glutAddMenuEntry start a new game 1 glutAddMenuEntry go back 2 glutAttachMenu GLUT RIGHT BUTTON 在人机对战中 使用了键盘事件实现重新开始和退出游戏的功能 我们用 myGlutKeyboardFunc unsigned char key int x int y 实现键盘 输入操作 这个函数传入一个 key 值 这个值用来接收按键信息 主要代码及 17 解释如下 If key q 用一个消息提示框询问是否退出 if MessageBoxA NULL 确实要退出吗 信息 MB YESNO MB ICONQUESTION MB APPLMODAL IDYES return 设置不再接收输入的标记 acceptInputFlag false exit 0 退出程序 if key r 重置棋盘 ResetSituation 4 34 3 界面设计界面设计 4 3 14 3 1 OpenGLOpenGL 的图形生成的图形生成 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 HDC wglGetCurrentDC void BOOL wglMakeCurrent HDC hdc HGLRC hglrc BOOL wglUseFontBitmaps HDC hdc DWORD dwFirst DWORD dwCount DWORD dwBase 如图 2 为 OpenGL 图形处理系统层次结构图 18 图 2 OpenGL 图形处理系统层次结构 4 3 24 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 基本图形点的生成 窗口系统 OpenGL 的图形环境 操作系统 图形硬件 算法实现 交互界面 19 线的生成 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 34 3 3 主界面窗口设计主界面窗口设计 此次系统中的窗口设计采用的是 MFC 微软基础类库 MFC 是 C 图形化 界面语言 专门用来设计图形化界面 一个 MFC 窗口对象是一个 C CWnd 类 或派生类 的实例 是程序直接创建的 在程序执行中它随着窗口类构造函 数的调用而生成 随着析构函数的调用而消失 此系统中用 MFC 创建一个对话框窗口 在对话框窗口中放入两个按钮 通 过注册按钮的点击事件链接游戏窗口平台 这个功能的实现提高了系统的可交 互性 操作简单方便用户使用 首先我们需要创建一个对话框类 class CAboutDlg public CDialog 20 public CAboutDlg 对话框数据 enum IDD IDD ABOUTBOX protected virtual void DoDataExchange CDataExchange pDX DDX DDV 支持 实现 protected DECLARE MESSAGE MAP 建立对话框对象 创建构造函数和虚构函数 CtestDlg CtestDlg CWnd pParent NULL CDialog CtestDlg IDD pParent m hIcon AfxGetApp LoadIcon IDR MAINFRAME CtestDlg CtestDlg printf test void CtestDlg DoDataExchange CDataExchange pDX CDialog DoDataExchange pDX BEGIN MESSAGE MAP CtestDlg CDialog ON WM SYSCOMMAND ON WM PAINT ON WM QUERYDRAGICON AFX MSG MAP ON BN CLICKED IDC BUTTON1 启动信息 memset StartInfo cb sizeof STARTUPINFO 设定结构的大小 PROCESS INFORMATION pinfo BOOL bRet CreateProcess T gobang exe NULL NULL NULL FALSE NORMAL PRIORITY CLASS NULL NULL 4 3 44 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 描绘棋子的时候 棋子分为黑白两色 所以要先对黑白两色进行判断 标记 22 后再绘制 采用堆栈的方式将棋子绘制 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 14 1 本章总结本章总结 通过对五子棋系统设计的详细分析 理清了制作的思路 对主要的功能进 行了全面的分析 使得实现起来达到了事半功倍的效果 正所谓磨刀不误砍柴 工 23 5 5 系统实现系统实现 打开系统首先我们会进入一个由 MFC 制作的欢迎界面 界面有两个按钮分 别为人人对战和人机对战 可以对界面进行移动和关闭 如图 4 图 6 主界面窗口 两个界面分别连接着两个游戏界面 我们点人机对战按钮进入人机对战界 面 首先会弹出一个游戏说明的提示框 提示用户电脑走黑子 用户走白子 用户可以通过键盘操作 实现重新开始游戏和退出游戏的功能 如图 5 图 7 游戏提示界面 点击确定进入游戏界面如图 6 进入游戏界面 此界面是人机对战的窗口 我们可以对窗口进行移动 最 小化 最大化 和关闭等操作 一进入界面 首先我们会看到棋盘中央会有一 个黑色棋子显示 并且高亮显示 电脑执黑子下棋 玩家操作白子通过点击鼠 标在棋盘中下棋 直到一方取胜或者平局游戏结束 若玩家点击棋盘交界处将 会在右上角的格子中落子 若点击棋盘中有棋子的地方则会提示此处无法落子 游戏结束时会弹出一个消息提示框 如图 7 24 图 8 人机对战界面 图 9 人机对战结束界面 提示框会提示用户是输了还是赢了还是平局的消息 用户可以按 r 键重新 开始游戏 点击关闭窗口退出人机对战 点击人人对战进入人人对战界面 如 图 8 25 图 10 双人对战界面 图为人人对战的游戏窗口 点击棋盘可以下次 黑棋先走 白棋黑子依次 交替走棋 直到一方胜出或棋盘下满 点击鼠标右键可以选择重新开始和悔棋 的功能 如图 9 图 11 双人对战选项菜单 点击 go back 按钮实现悔棋的功能 点击 start a new game 开始新一轮的 游戏 26 6 6 总结总结 三个月的学习很快就过去了 通过查找资料 实践调查 动手制作终于完 成本次的论文 好的总结是为了更好地提升自我能力 对此次设计我的总结如 下 本次设计的游戏实现了人机对战和人人对战两大功能 在人机对战中 涉 及到了五子棋的人工智能算法 本系统中采用的是最大最小搜索和 alpha beta 剪枝算法 此算法是博弈论的常用算法 用递归搜索的方法找出最佳下棋子的 位置 通过 alpha beta 剪枝来节省搜索的时间 对搜索进行优化 通过本次的 学习 我更加理解算法在日常生活中的运用 初步学会了将数学模型转换成日 常生活中的图像模型 同样也学会怎么把日常生活中问题用程序语言来表示 提高了我的逻辑思维能力和问题的解决能力 本次设计是基于 OpenGL 开发的 通过此次设计我更好地学习了 OpenGL 的 绘图流程 更好地掌握并学会运用 OpenGL 图形库函数 使用 OpenGL 的鼠标触 发函数和键盘触发函数来对鼠标及键盘进行操作 更近一步学习计算机图形学 的知识 能从简单的二维空间进一步向三维空间思考问题 当然还有很多不足的地方 在界面的设计中缺乏可交互性的思考 界面中 按钮较少 对用户来说不是特别好操作 游戏的音效和游戏动画在里面都没有 实现 游戏的难易程度没有体现 在深度搜索中应该考虑到不同的深度对游戏 的难易程度来说会有影响 由于时间匆促没有实现这一个功能 当然在本次设计中我也学到了许多以后有用的东西 锻炼了快速查阅各种 资料和收集 整理资料的能力 这对以后参加工作学习和接受新知识是一种很 好的锻炼 平时学习的都是一些理论知识 并没有真正的去应用和动手实践 通过这次毕业设计 锻炼了动手能力 毕业设计培养了严肃认真和实事求是的 科学态度 而且培养了吃苦耐劳的精神及相应的工程意识 同学间友谊互助也 充分在毕业设计中体现出来 27 参考文献参考文献 1 王兰美 赵继成 秦华东 OpenGL 及其在 VC 下的开发应用 J 武汉大学 学报
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中中医社团课程设计
- 彩色斑马画画课程设计
- 健康手环蓝牙模块设计课程设计
- 2026年初级经济师《金融专业知识和实务》全真模拟试卷答案(共十二套)
- 2025年山西省临汾市古县素养测评数学四年级下学期期末统考试题(含答案解析)
- 2025年教师水平能力测试题及答案
- 2025年辅警笔试考试试题库题库答案解析
- 2025年山东省德州市宁津县育新小学数学三年级第二学期期末试题含答案解析
- 2026以色列农业节水灌溉系统行业技术与市场应用现状评估报告
- 2026中国土地转让行业市场风险预警与应对策略分析报告
- 2026年秋季护理学专业开学第一课 行业前沿与趋势洞察
- 2026 年校园防诈骗安全教育课堂
- “化危为安”线上讲堂第153期-用好重大隐患判定准则 准确排查整治风险隐患-程长进
- 2026年秋新教科版五年级上册科学全册教案+教学计划
- 回复供应商询价的回复函3篇范文
- 高空作业平台倾覆现场处置方案
- 口腔颌面部感染诊疗临床应用专家共识(2025版)
- 2026年芯片设计DFT工程师高频面试题包含详细解答
- 网络传播概论(第5版)全套教学课件(完整版)
- 三宝四口五临边安全防护施工方案
- 临床肝紫癜病影像学表现
评论
0/150
提交评论