欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    基于Qt的黑白棋游戏计算机毕业设计论文.doc

    • 资源ID:3921566       资源大小:682KB        全文页数:56页
    • 资源格式: DOC        下载积分:8
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要8
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于Qt的黑白棋游戏计算机毕业设计论文.doc

    找毕业设计、项目源码、编程视频,就上码农网manong365基于Qt的黑白棋游戏摘 要本文主要介绍黑白棋游戏的设计与开发流程,同时讨论黑白棋设计中不同搜索算法的原理以及特点,从博弈树搜索算法的进步来反映人工智能的发展。本程序是在Linux(Ubuntu12.04LTS)环境下使用面向对象的C+语言开发。有人人对弈,人机对弈,悔棋等功能。本论文首先指出了黑白棋游戏,Qt以及计算机博弈的发展现状,然后重点介绍了Qt开发工具的使用,黑白棋程序的设计流程(包含类图、用例图、时序图的设计),规则设计,算法设计。最后介绍了Linux桌面环境GUI和计算机博弈的发展趋势。本设计通过一个棋类游戏的开发,阐述了棋类游戏的开发过程,包括软件开发的逻辑分析,程序设计,软件实现和软件测试的几个步骤。关键词:黑白棋;人工智能;搜索算法;QtReversi game based on QtAbstractThis paper describes the Othello game design and development process and discussed different design principles and features of the search algorithm. From the advancement of game tree search algorithm to reflect advances in the development of artificial intelligence. This program is the use of object-oriented C + + language development under Linux (Ubuntu12.04LTS) environment. Implements the following functions, man-machine to war, multiplayer, undo, etc. In this thesis points out the development status of Reversi game, Qt and computer game. Then focuses on the usage of Qt development tools, Othello program design process (including class diagrams, case diagram, sequence diagram design with), rules design, algorithm design. Finally, the development trend of Linux desktop environment GUI and computer game.By developing a chess game, describes the development process of board games. Several steps including logical analysis of software development, program design, software implementation and software testing.Key words: Othello; Artificial Intelligence; Search Algorithm; Qt目录摘 要IAbstractII1 绪论11.1 前言11.2 黑白棋的发展11.2.1 黑白棋程式的发展21.2.2 游戏规则21.2.3 开局策略21.3 机器博弈与人工智能的发展概况31.3.1 机器博弈的基本思想31.3.2 机器博弈系统41.3.3 博弈搜索41.3.4 Min-Max搜索41.3.5 -剪枝搜索41.3.6 alpha-beta的增强算法介绍51.3.7 人工智能的发展状况71.4 主要研究内容81.5 相关实验环境82 工具及算法介绍92.1 Qt简介92.2 信号与槽92.3 Qt和MFC的比较92.4 核心算法介绍103 系统分析与设计123.1 黑白棋的需求分析123.1.1 用例图123.1.2 程序流程图133.2 模块设计133.2.1 主要模块简介133.2.2 类图143.2.3 棋盘数据结构设计153.3 设计系统的现实意义174 详细设计184.1 界面设计184.2 核心算法代码及注释205 系统测试295.1 白盒测试295.2 黑盒测试305.3 总结325.4 展望33参考文献34致谢351 绪论 1.1 前言计算机博弈(Computer Games),也称之为机器博弈,就是让计算机可以像人脑一样进行思维活动,最终可以下棋,下国际象棋、西洋跳棋、黑白棋、中国象棋、围棋等等。 早在计算机诞生的前夜,著名的数学家和计算机学家阿伦·图灵(Alan Turing)便设计了一个能够下国际象棋的纸上程序,并经过一步步的人为推演,实现了第一个国际象棋的程序化博弈。那些世界上最著名的科学家,如计算机创始人冯.诺依曼(John von Neumann),信息论创始人科劳德.香农(Claude E. Shannon) ,人工智能的创始人麦卡锡(John McCarthy)等人都曾涉足计算机博弈领域,并做出过非常重要的贡献。 从上世纪 40年代计算机诞生,计算机博弈经过一代又一代学者的艰苦奋斗和坎坷历程,终于在上世纪的八、九十年代,以计算机程序战胜棋类领域的天才而享誉世界。其中最为著名的则是 1997 年5 月 IBM“深蓝”战胜世界棋王卡斯帕罗夫,成为计算机科学史上一个不朽的丰碑。在这之后,计算机博弈一天也没有停息过拼搏。由Science杂志评选的 2007年十大科技突破中,就还包括了加拿大阿尔波特大学的科研成果解决了西洋跳棋(Checker)博弈问题,也就是说,在西洋跳棋的博弈中计算机将永远“立于不败之地”。计算机博弈原理与方法学既涉及到博弈论(对策论)、搜索原理等理论内容,又更多地涉及到数据结构、软件工程、程序设计方法学等方面的知识。计算机博弈属于计算机科学与应用学科的研究方向之一,又是人工智能领域的重要研究方向,应该属于智能科学与技术学科的一个分支。本文着重介绍了黑白棋的设计与开发,通过介绍博弈算法与程序设计的基本流程让您对计算机博弈原理与方法以及程序设计有更深入的了解。1.2 黑白棋的发展黑白棋是起源于英国19世纪末的一种棋盘类游戏,又叫反棋(Reversi)、奥塞罗棋(Othello)、苹果棋或翻转棋。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。为什么以奥塞罗棋来命名黑白棋呢?上世纪70年代日本人Goro Hasegawa借用莎士比亚名剧“奥塞罗”为黑白棋重新命名。在莎士比亚笔下的主角奥塞罗,是一位黑肤色的摩那人将军,他的妻子是一位白人贵族的女儿苔丝狄蒙娜(Desdemon),因为受到小人伊阿古(Iago)的挑拨离间,怀疑自己的妻子不忠而亲手杀死了自己的妻子。真相大白后,由于内心充满后悔和愧疚而自杀身亡。就如同奥塞罗据中男女主角之间的爱恨纠葛一样,黑白棋在游戏的过程中黑子与白子必须不断翻动对手棋子,因此黑白棋就以Othello来命名。1.2.1 黑白棋程式的发展上世纪90年代初,由于计算深度和尾局的准确性,黑白棋程式的棋力已经很强。这个时期的程式由人工加入行动力、位置策略等因素,所以程式的棋力依赖于程式员本身的棋力,导致程式中存在人类棋手的弱点。这一情况在1995年左右得到了突破性的发展,程式员Michael Buro写出了能自我学习的黑白棋游戏Logistello。自此,程式员不在把人工策略写死在程式里,而是由程式自我学习,程式会纪录形状,自动调整下棋策略。具有先进算法,高效率和准确的编程,使黑白棋程式的棋力远远超过人类棋手。黑白棋算法的不断改进,体现了人工智能(AI)的发展。1.2.2 游戏规则游戏开始时棋盘正中有交叉放置的四个棋子,两黑两白,黑棋总是先手。双方交替下棋。新落下的棋子与棋盘上已有同色棋子之间,被夹住得所有对方棋子都要翻转过来。且夹住位置上必须全部是对手的棋子,不能有空格。一步棋可以在数个方向上翻棋,任何被夹住得棋子必须被翻转过来。如果一方在棋盘上没有地方可以落子,则对手可以连续落子。双方都没有棋子可落时,棋局结束,棋子数目多的一方获胜。在棋盘还没有下满是,如果一方棋盘上没有棋子,则棋局结束。将对手棋子吃光的一方获胜。1.2.3 开局策略黑白棋最常见的开局策略有以下几种:最多子策略(The Maximum Disc Strategy)位置权重策略(The Weighted Square Strategy)行动能力策略(The Mobility Consideration Strategy)稳定子策略(The Stability Disc Strategy)这四种开局策略各有优缺点,以下会对其简单介绍:(1)最多子策略(The Maximum Disc Strategy)此策略采用贪心算法,是最直接简单的一种策略。此策略在落子时,会判断在哪个位置落子可以造成己方棋子数目最多,即可以翻转对手棋子最多的位置,从而取得胜利。虽然使用此策略会在初期占据大量棋子并取得优势,但是占据的棋子并非不会再被对手所占据的稳定子,且让对手有更多落子的位置的选择。因此很容易被对方逆转局面,失去领先地位。(2)位置权重策略(The Weighted Square Strategy)棋盘上每个位置都有各自对整个盘面变化产生的价值,因此将每个位置不同的价值作为落子时考虑的权重,如图1-1所示在角落位置(*)因为对盘面有较大的影响力,因此也就拥有比其他位置较高的权重,一旦占领角落后,不仅此位置不会被对手再占领,且将可以此位置为锚,进而占领盘面上其他的位置,所以在位置权重策略上对角落位置给予较高权重。而在盘面上C与X被赋予较低的权重,因为落子在这些位置时有可能对盘面发展状况造成不利的影响,落子在C、X会让对手有机会占领角落,而让自己处于不利局面。此外在A、D位置会给予次高的权重,落子在这些位置时,将有可能让对手被迫落子在C、X位置,而陷于困境,因此A、D位置有次高权重。(3)行动能力策略(The Mobility Consideration Strategy)以合法步的数量来决定其行动能力的状态,如果是对手可下的合法步数量少得话,将会使对手无合法步可以落子发生pass,或是被迫下在不利位置(如图1-1 C、X位置)。(4)稳定子策略(The Stability Disc Strategy)落子时考虑落子的位置将会造成多少稳定子来决定该下在哪里,稳定子即无法再被对手所翻动的棋子。在上述的策略中,每一种策略都有其应用的情况,也有其不足之处,所以在一盘棋局中不能只采用一种策略,最好的方式应该是在面对不同的棋局情况时采用对应的策略。 图1-1位置权重策略示意图1.3 机器博弈与人工智能的发展概况1.3.1 机器博弈的基本思想机器博弈的核心思想并不复杂,实际上就是对博弈树节点的估值过程和对博弈树搜索过程的结合。在博弈的任何一个中间阶段,站在博弈双方其中一方的立场上,可以构想一个博弈树。这个博弈树的根节点是当前时刻的棋局,它的儿子节点是假设再行棋一步以后的各种棋局,孙子节点是从儿子节点的棋局再行棋一步的各种棋局,以此类推,构造整棵博弈树,直到可以分出胜负的棋局。整棵的博弈树非常庞大,且不同的棋类有所不同,分支因子大的如围棋的博弈树显然要比分支因子小的如国际象棋的博弈树要大得多。博弈程序的任务就是对博弈树进行搜索找出当前最优的一步行棋。对博弈树进行极大极小搜索,可以达到这一目的。极大极小搜索,是因为博弈双方所要达到的目的相反,一方要寻找的利益恰是一方失去的利益,所以博弈的一方总是希望下一走是儿子节点中取值最大者,而另一方恰恰相反。这便形成了极大极小过程。当然,程序不能也没有必要做到搜索整棵博弈树的所有节点,对于一些已经确定为不佳的走步可以将以它为根节点的子树剪掉。而且,搜索也不必真地进行到分出胜负的棋局,只需要在一定深度范围内对局面进行评价即可。只有搜索空间缩小到一定程度,搜索才可以真正的进行。当搜索进行到一定深度,用局面评价机制来评价棋局,按照极大极小的原则选出最优,向上回溯,给出这一局面的父亲节点的价值评价,然后再继续向上回溯,一直到根节点,最优走步就是这样搜索出来的。在这个过程中,最为重要的是搜索算法,高效的搜索算法可以保证用尽量少的时间和空间损耗来达到寻找高价值的走步。但是真的想要博弈程序棋力提高,还必须有一个好的局面评价机制,即估值算法作后盾。就是说,用这个估值算法评价的局面价值必须是客观的、正确的,可以确凿的评价局面的优劣以及优劣的程度。1.3.2 机器博弈系统根据机器博弈的基本思想,可以确定一个机器博弈系统的一般构成6。首先是知识表示的问题,选用一种合适的方法记录棋局。这时需要考虑在这种知识表示的数据结构之上将要进行的各种操作,知识表示应该使最经常进行的操作花费的时间和空间代价最小。其次,根据不同的棋类的不同规则集,要有一个相应的走法产生机制。它的作用是用来产生整棵博弈树,即处于博弈树的任何一个节点位置上,应该能够运用该机制产生这个节点的所有儿子节点,也就是接下来的所有合法走步。除了以上两个模块以外,就是博弈核心的搜索技术和与之配合的估值技术了。这四个部分相互配合运转起来,就可以实现机器博弈。1.3.3 博弈搜索博弈搜索的基本思想已经提出半个多世纪,目前广泛研究的是确定的、二人、零和、完备信息的博弈搜索。也就是说,没有随机因素的博弈在两个人之间进行,在任何一个时刻,一方失去的利益即为另一方得到的利益,不会出现“双赢”的局面,而且在任何时刻,博弈的双方都明确的知道每一个棋子是否存在和存在于哪里。二人、零和、完备信息的博弈搜索理论已经很系统。极大极小算法是所有搜索算法的基础。在这个基础上,目前在这一领域的算法主要有两类,一类是作为主流的深度优先的alpha-beta搜索及其系列增强算法,另一类是最佳优先的系列算法。博弈搜索从搜索方向上可以分为宽度优先搜索(Breadth-first search)和深度优先搜索(Depth-first search)。前者能够保证在搜索树中找到一条通向目标节点的最短途径。但是巨大的时间和空间开销使得它在计算机博弈中很少采用。深度优先搜索的最大特点就是可以节省大量的节点存储空间。因为它通常是采用递归过程来遍历搜索树,即后序遍历,得到一个节点值,就对其子节点做递归,然后根据他们的俄返回值来决定自身的返回值,搜索过的底层节点也随即撤销,因此它所占用的动态空间十分有限。1.3.4 Min-Max搜索在机器与人对弈的过程中,机器事先并不知道人的水平如何,因而机器只能假设人走的每一步都会为自己带来最小的收益,而机器走的每一步都要为自己争取最大的利益,这就是极大极小原理。如果我们把机器和人连接走的每一步画成树状结构(即博弈树),对于每一个节点,其子节点是下一步所有可能走的位置(有可能是对方走,也有可能是自己走),对于叶子节点我们运用一次估值函数得到叶子的权值,之后便一直向上反推,直到得到根节点的权值。我们把每一次机器要走的节点叫做Max节点,因为这个节点的值是其子节点所有值中的最大值,而把每一个人要走的节点叫做Min节点,因为这个节点的值是其子节点所有值中的最小值。这样得到的根节点的值,就是机器走这一步期望的最大收益。1.3.5 -剪枝搜索-搜索实际上就是运用-剪枝优化后的Min-Max搜索,其基本的极大极小思想是不变的。首先引入两个变量、,表示当前节点在前面的搜索过程中,依据子节点的返回值来估计出的当前节点最后的结果的下限和上限。下面给出剪枝和剪枝的定义:1.如果当前节点是Min节点,当前节点的父节点是Max节点,那么当当前节点的一个子节点的值小于当前节点的值时,那么当前节点的其余子节点就不用搜索了,这个过程称为剪枝过程。2.如果当前节点是Max节点,当前节点的父节点是Min节点,那么当当前节点的一个子节点的值大于当前节点的值时,那么当前节点的其余子节点就不用搜索了,这个过程称为剪枝过程。图1-2 Alpha剪枝示意图图1-3 Beta剪枝示意图1.3.6 alpha-beta的增强算法介绍1渴望搜索(Aspiration Search)在alpha-beta剪枝过程中,初始的的搜索窗口往往是从-(即初始的alpha值)到+(初始的beta值),在搜索进行中再不断缩小窗口,加大剪枝效果。渴望搜索就是渴望从一开始就使用小的窗口,从而在搜索初起,就可以进行大量的剪枝。这个初始窗口的选定很重要,如果选择准确,即所要寻找的走步就在这个窗口内,搜索便可以继续进行。如果第一步搜索的返回值证明最佳走步大于beta值,就需要重新确定窗口。以原来的beta值为alpha值,以+为新的beta值重新搜索。相反如果第一步的返回值证明最佳走步小于alpha值,重新确定的窗口就是以-为alpha值,原来的alpha值为beta值了。可见第一次搜索猜测的窗口非常重要,如果猜测准确,搜索时间可以大大缩短,如果不准确,这一优势就不明显了。由于渴望搜索是一种基本的搜索方法,它在和后面叙述的遍历深化结合使用的时候,就可以借助前一次深度为depth的搜索的结果来猜测当前深度为depth+1搜索的窗口了。2极小窗口搜索(Minimal Window Search)极小窗口搜索,也被称为是主变量导向搜索(Principal Variation Search),常常简称为PVS算法或者NegaScout算法。这个算法应用非常广泛。它的出发点是和渴望搜索大致相同的,即用极小的窗口来限制剪枝范围。它的过程是这样的:在根节点处,假定第一个儿子节点为主变量,也就是假定它为最佳走步,对它进行完整窗口(a,b)的搜索并得到一个返回值v,对后面的儿子节点依次用极小窗口(也被称为是零窗口)(v,v+1)来进行搜索,如果搜索返回值大于零窗口,则证明这一分支亦为主变量,对它进行窗口为(v+1,b)的搜索,可是如果返回值小于零窗口,这一分支就可以忽略,因为它的最佳走步还不如已有的走步。极小窗口搜索采用了极小的窗口,剪枝效率最高,并且只对主变量进行大窗口的搜索,所以大部分搜索动作是有效的,搜索产生的博弈树也很小。3置换表(Transposition Table)在搜索进行中,查询所有的走步,经常会在相同的或者不同的路径上遇到相同的棋局,这样的子树就没有必要重复搜索,把子树根节点的估值、子树的最好走步和取得这个值的深度信息保存在一个称为置换表的数据结构中,下次遇到时直接运用即可。但是,对不同的情况要区别对待。对于固定深度的搜索,如果前一次保存的子树深度小于新节点要搜索的深度,还是要进行重新的搜索以保证所取得数据的准确程度。反之,如果置换表中保存的子树信息表明,子树的深度大于或者等于当前的新节点要求的搜索深度,它的信息就可以直接运用了。置换表增强如果和有效的alpha-beta搜索结合使用,结果就会使实际搜索的博弈树小于最小树。博弈树搜索的问题实际上是一个有向图的搜索。那些在置换表中被命中的节点,就是有向图中若干路径的交叉点。只有避免这些交点被重复搜索,搜索过程中生成的搜索树才有可能小于最小树。这也是后来证明深度优先的算法并不比最佳优先的算法差的原因之一。这个算法存在的问题是,置换表的构造,必须使对置换表的查找和插入操作不成为整个搜索的负担,才能提高效率。一般使用散列表来实现。4遍历深化(Iterative Deepening)遍历深化是因对博弈树进行多次遍历,又不断加深其深度而得名,有人还把它称为蛮力搜索。算法利用了alpha-beta算法对子节点排序敏感的特点。它希望通过浅层的遍历给出节点的大致排序,把这个排序作为深层遍历的启发式信息。另外,算法用时间控制遍历次数,时间一到,搜索立即停止,这也符合人类棋手的下棋特点。在关键的开局和残局,由于分支较少,也可以进行较深层次的搜索。算法的过程是,对以当前棋局为根节点的博弈树进行深度为二的遍历,得出其儿子节点的优劣排序,接着再从根节点进行深度为三的遍历,这一次优先搜索上次遍历中得出的最优者,从而加大剪枝效果,以此类推,在进行第三次、第四次的遍历,一直达到限定时间为止。由于这个算法的每次遍历都从根节点开始,所以有人称其为蛮力搜索,但实际上由于每次都可以优先搜索相对好的节点,导致剪枝效率增大,其实算法效率是很高的,目前这一算法也得到了广泛的认可。5历史启发搜索(History Heuristic)历史启发也是迎合alpha-beta搜索对节点排列顺序敏感的特点来提高剪枝效率的,即对节点排序,从而优先搜索好的走法。所谓好的走法即可以引发剪枝的走法或者是其兄弟节点中最好的走法。一个这样的走法,一经遇到,就给其历史得分一个相应的增量,使其具有更高的优先被搜索的权利。6杀手启发搜索(Killer Heuristic)杀手启发实际上是历史启发的特例。它是把同一层中,引发剪枝最多的节点称为杀手,当下次搜索时,搜索到同一层次,如果杀手走步是合法的话,就优先搜索杀手。7MTD(f)算法MTD(f)搜索的全称是Memory enhanced Test Driver with f and n。它是一个较新的算法,在1995左右年由Aske Plaat等人提出。它不是单一的alpha-beta算法的增强,但也是alpha-beta算法的改进。在算法进行中多次调用了零窗口的alpha-beta搜索过程。在算法初起,要给定一个初始值f,一个上界和一个下界。初始值要尽可能的靠近最后要找到的最优走步值,上界和下界要保证能把这个最优走步包含在内。算法实际上就是不断的应用零窗口的alpha-beta搜索,缩小上界和下界,并移动初始值使其接近最优走步。以下使这个算法的伪代码。function MTD(n, ¦) ¦g := ¦¦+ := + ; ¦ := ;repeatif g = ¦ then := g + 1 else := g;g := alphabeta(n,-1,)if g < then ¦+ := g else ¦ := g;until ¦ ¦+;return g;在这个伪代码中,可以看出算法名称中的f为初始值,而n为搜索深度,这里g为最后要找的最佳走步,为零窗口的上界。由于算法运用了多次alpha-beta搜索,所以需要配合置换表,这样才能使速度足够的快,从而达到提高效率的目的。MTD(f)算法简单并且比前述各种算法都高效。有不少实践者的实验证明,在国际象棋、西洋跳棋等博弈程序里,MTD(f)的平均表现要比PVS好,当今最强大的国际象棋程序之一,麻省理工学院的Cilkchess就使用了并行的MTD(f)代替了其初始版本的NegaScout作为搜索算法。1.3.7 人工智能的发展状况人工智能也称机器智能,它是计算机科学、控制论、信息论、神经生理学、心理学、语言学等多种学科互相渗透而发展起来的一门综合性学科。从计算机应用系统的角度出发,人工智能是研究如何制造出人造的智能机器或智能系统,来模拟人类智能活动的能力,以延伸人类智能的科学。科学家早在计算机出现之前就已经希望能够制造出可能模拟人类思维的机器了,杰出的数学家布尔通过对人类思维进行数学化精确的刻画,奠定了智慧机器的思维结构与方法。当计算机出现后,人类开始真正有了一个可以模拟人类思维的工具。1936年,24岁的英国数学家图灵(Turing)提出了"自动机" 理论,把研究会思维的机器和计算机的工作大大向前推进了一步,他也因此被称为"人工智能之父"。1956年在达特茅斯大学召开的会议上正式使用了"人工智能" (Artificial Intelli-genee,AI)术语;1957年,香农和另一些人又开发了General Problem Solver(GPS)程序,它对Wiener的反馈理论有所扩展,并能够解决一些比较普遍的问题。在1963年,美国政府为了在冷战中保持与苏联的均衡,支持麻省理工学院进行人工智能的研究,使人工智能得到了巨大的发展。随后的几十年中,人们从问题求解、逻辑推理与定理证明、自然语言理解、博弈、自动程序设计、专家系统、学习以及机器人学等多个角度展开研究,已经建立了一些具有不同程度人工智能的计算机系统。此后随着硬件和软件的发展,计算机的运算能力以指数级增长,网络技术蓬勃兴起,汁算机越来越具备了足够的条件来运行一些要求更高的AI软件,促使人工智能研究出现新的高潮。1.4 主要研究内容本论文的主要研究内容为在Qt编程中QtDesigner的应用,信号与槽的应用以及熟悉C+语言的各种特性,锻炼程序设计的能力,同时也是编程基本功的一个训练,能够将分支、循环、数组、指针、函数、堆栈综合应用。熟悉C+程序开发的具体流程。独立完成黑白棋游戏的需求分析,总体设计,详细设计,编码实现,黑盒测试,白盒测试。同时,由于黑白棋规则简单,搜索规模较小等特点,特别适合于研究和测试算法使用。本轮文将介绍Qt开发工具的使用、黑白棋常见的战术(开局策略)、游戏规则设计、算法设计(包含优化搜索、博弈搜索、-剪枝、Min-Max搜索等原理)。1.5 相关实验环境本程序采用Qt开发环境,使用C+语言开发运行于Linux系统Ubuntu(GNOME)桌面环境下的黑白棋游戏。开发环境 Qt Creator 2.4.1基于Qt 4.8.0(32bit)运行环境 Ubuntu 12.04 LTS Intel(R) Core(TM) i5 CPU 500G硬盘2 工具及算法介绍2.1 Qt简介Qt是一个跨平台应用程序和UI开发框架。使用Qt只须一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。Qt Software的前身为创始于1994年的Trolltech(奇趣科技),Trolltech于2008年6月被Nokia收购,加速了其跨平台开发战略。Qt Creator是全新的跨平台Qt IDE,可单独使用,也可与Qt库和开发工具组成一套完整的SDK。其中包括了高级C+代码编辑器、项目和生成管理工具、集成的上下文相关的帮助系统、图形化调试器、代码管理和浏览工具等。Qt Quick是在Qt4.7中被引进的一种高级用户界面技术,开发人员和设计人员可以用它协同创建动画触摸式用户界面和应用程序。2.2 信号与槽信号和槽用于两个对象之间的通信,信号和槽机制是Qt的核心特征,也是Qt不同于其他开发框架的最突出特征。在GUI编程中,当改变了一个部件时,总希望其他部件也能了解到该变化。更一般来说,我们希望任何对象都可以和其他对象进行通信。例如,如果用户单击了关闭按钮,则希望可以执行窗口的close()函数来关闭窗口。为了实现对象间的通信。当一个特殊的事情发生时便可以发射一个信号,比如按钮被单击;而槽就是一个函数,它在信号发射后被调用来响应这个信号。Qt的部件类中已经定义了一些信号和槽,但是更多的做法是子类化这个部件,然后添加自己的信号和槽来实现想要的功能。回调就是指向函数的指针,把这个回调函数指针传递给要被处理的函数,那么就可以在这个函数被处理时在适当的地方调用这个回调函数。回调机制主要有两个缺陷:第一,不是类型安全的(type-safe),不能保证在调用回调函数时可以使用正确的参数;第二,是强耦合的。处理函数必须知道调用哪个回调函数。一个信号可以关联到多个槽上,多个信号也可以关联到同一个槽上,甚至,一个信号还可以关联到另一个信号上。信号和槽机制的特色和优越性:信号和槽机制是类型安全的,相关联的信号和槽的参数必须匹配;信号和槽是松耦合的,信号发送者不知道也不需要知道接受者的信息;信号和槽可以使用任意类型的任意数量的参数。虽然信号和槽机制提供了高度的灵活性,但就其性能而言,还是慢于回调机制的。当然,这点性能差异通常在一个应用程序中很难体现出来。2.3 Qt和MFC的比较QT使用的编译器是MinGW,即Linux下的GCC移植到windows的版本。MFC使用的编译器是Visual C+。 QT的应用主要在Linux下,但是它本身是跨平台的,也支持其他操作系统,是现在比较著名的界面库,著名的KDE就是使用QT开发的。 MFC是提供给VC的,但是它主要是代码库,不像VCL和编译器挂钩很多,但是MFC主要是对windows API的封装,所以只能用于windows平台。从库本身来说QT集成的功能较MFC庞大,而且使用的封装技术信号和槽也是比较受到赞许的,比如QT Script为QT提供嵌入式脚本,QT界面库支持C。因为MFC是浅层封装windows SDK,以降低使用windows SDK引起的开发效率的降低,和开发难度的增加。所以QT库是比MFC优秀的,两个库都经受了时间的考验,稳定性都很高,Bug几乎没有。MFC由于其浅层封装的特点,所以运行效率是比较高的,加上vc对windows的针对性优化,整体性能是比较高的,但是如果加入第三方库就不敢保证了 QT因为库比较庞大,封装层次较深,所以运行效率较MFC为低。现在windows的普及范围谁能比过,所以MFC的客户量比较多,QT主要是Linux下的开发人员在使用,但MFC也只是得益于windows。MFC不支持嵌入式开发(主要指手机平台),但是QT有对应的模块。 QT的封装哲学比较明晰,和系统隔离的比较好,门槛不高。MFC较难精通,因为深入开发之后需要了解SDK。 2.4 核心算法介绍 黑白棋的游戏规则是,一方在上下,左右,左上,左下,右上,右下八个方向上,每个方向有两枚棋子中间夹着的对方棋子都可变为己方棋子,己方两棋子之间必须要有对方棋子,否则不可下子。最后看谁的棋子多,则判谁赢。棋盘绘制:1>先获取当前窗口的高和宽,height()和width(),必须在painterEvent事件中,因为在窗口发生变化时,重绘工作要重新获取宽和高的数值,才能准确画出棋盘;3>for循环9次画线;3>将棋盘中间的四个位置画上相应的棋子。其他位置绘制棋子就事先在此类的构造函数中将棋盘模拟成一个三维数组,用不同的枚举状态代表不同的颜色。然后这里进行数组遍历,根据不同颜色,在计算出四个棋子的相对坐标上将棋子(圆)画上去。双方棋子数目的显示:在另一模块中定义两个QLCDNumber对象,将其初始化后,用QHBoxLayout放入QWidget 框架中。然后在用connect()棋子的数目变化与display()槽连接。当棋子数目发生变化时,发送信号使其显示棋子数。当点击开始按钮(QPushButton)时发射信号给自定义槽Init(),槽的功能则是将棋盘(数组)重新初始化为新一局棋盘,包括主要标志位,然后进行重绘。核心算法(人机对战):此算法由事件mousepressEvent(QMouseEvent *e)函数来响应鼠标事件。当点击鼠标后进入该事件,首先获取鼠标点击出坐标x=e->x,()y=e->y(),计算x,y坐标对应的数组位置,即QPoint point。当获取到棋盘坐标后,将其传入另一函数do_pressPoint(QPoint point)中进行进一步处理。参数color代表当前方棋子的颜色,在此分析函数将完成棋盘点击处八个方向的棋子是否可落子判断,八个方向则由i、j加减一来决定,这里只分析一个方向,其他方向雷同。如果坐标的下一格为空或着是与color值相同,则进入下一个方向判断。若上述条件不满足,进入while (-i>0),若遇到color则记录坐标处到clor处的格数(count),退出循环。然后用for循环将刚才color间夹得子变成color。跳过:当人对人时,可随意跳过,人对机时要等到某方确实无法下子时,跳过才生效。主要是通过发射信号的方式来显示一个提示框,同时,已经改变同步标志位。胜负提示:当棋盘棋子总数为64或者单方棋子位0时显示提示框。3 系统分析与设计在软件工程中,需求分析指的是在创建一个新的或改变一个现存的系统或产品时,确定新系统的目的、范围、定义和功能时所要做的所有工作。需求分析是软件工程中的一个关键过程。在这个过程中,系统分析员和软件工程师确定顾客的需要。只有在确定了这些需要后他们才能够分析和寻求新系统的解决方法。概要设计的主要任务是把需求分析得到的系统扩展用例图转换为软件结构和数据结构。设计软件结构的具体任务是:将一个复杂系统按功能进行模块划分、建立模块的层次结构及调用关系、确定模块间的接口及人机界面等。数据结构设计包括数据特征的描述、确定数据的结构特性、以及数据库的设计。3.1 黑白棋的需求分析首先要界面简洁,具有黑、白棋子数目显示、倒数计时显示、功能键显示等。其次要界面友好,背景、组件大小等要协调,给用户一种和谐的感官。再次要实现游戏开始、暂停、退出、模式选择、悔棋、跳过等基本功能。最后要选择合适的算法来实现黑白棋的下棋规则功能和计算机自动下棋功能。3.1.1 用例图图3-1用例图由参与者(Actor)、用例(Use Case)以及它们之间的关系构成的用于描述系统功能的静态视图称为用例图。用例图是被称为参与者的外部用户所能观察到的系统功能的模型图,呈现了一些参与者和一些用例,以及它们之间的关系,主要用于对系统、子系统或类的功能行为进行建模。用例图用于对系统、子系统或类的行为进行可视化,使用户能够理解如何使用这些元素,并使开发者能够实现这些元素。用例图定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现。3.1.2 程序流程图图3-2程序流程图3.2 模块设计3.2.1 主要模块简介通过对程序流程图的分析,将采用以下模块来实现黑白棋游戏的开发与设计。(1)游戏界面模块本模块是用来绘制游戏主界面,包括黑白棋记数,时间显示,棋盘,以及实现各种子功能的按钮。该模块是由Qt设计师界面类实现,通过QtDesigner拖拽控件设计主界面。(2)绘制棋盘模块绘制棋盘模块用来绘制8x8正方形棋盘以及黑、白色棋子。通过paintEvent(QPaintEvent *e)函数来实现绘图模块。(3)初始化棋盘模块根据黑白棋的游戏规则,每轮开局前,首先在8*8的棋盘上的中心位置,先放入4枚棋子,黑、白各两枚。初始化模块的作用就是开局以及游戏结束开始新游戏时复位棋盘。(4)黑白棋子记数

    注意事项

    本文(基于Qt的黑白棋游戏计算机毕业设计论文.doc)为本站会员(来看看)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开