基于Qt的黑白棋游戏开发毕业论文_第1页
基于Qt的黑白棋游戏开发毕业论文_第2页
基于Qt的黑白棋游戏开发毕业论文_第3页
基于Qt的黑白棋游戏开发毕业论文_第4页
基于Qt的黑白棋游戏开发毕业论文_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、 PAGE29 / NUMPAGES38 毕业设计(论文)课题:基于QT的黑白棋游戏开发学生:戴福林 学院:计算机学院 班级:硬件1102班 学号:2011130632 指导教师:佘明洪 装订交卷日期:2014.4.20目 录 HYPERLINK l _引言 引言1 HYPERLINK l _11系统开发背景 1.1 系统开发背景1 HYPERLINK l _1.2_黑白棋简介 1.2 黑白棋简介2 HYPERLINK l _1.2.1_黑白棋游戏规则 1.2.1 黑白棋游戏规则2 HYPERLINK l _1.2.2_黑白棋游戏简介 1.2.2 黑白棋游戏简介2 HYPERLINK l _1

2、.3_相关实现环境 1.3 相关实现环境3 HYPERLINK l _1.3.1_开发环境 1.3.1 开发环境3 HYPERLINK l _1.3.2_运行环境 1.3.2 运行环境3 HYPERLINK l _1.4_主要研究内容 1.4 主要研究容3 HYPERLINK l _1.5_系统开发的现实意义 1.5 系统开发的现实意义3 HYPERLINK l _第二章_开发工具 2 开发工具Qt4 HYPERLINK l _21_QT简介 21 QT简介4 HYPERLINK l _22信号与槽 22信号与槽4 HYPERLINK l _第三章_黑白棋需求分析 3. 黑白棋需求分析7 HY

3、PERLINK l _31_黑白棋程序界面的需求 31 黑白棋程序界面的需求7 HYPERLINK l _3._2黑白棋游戏规则的需求 3. 2黑白棋游戏规则的需求7 HYPERLINK l _第4章_黑白棋总体设计 第4章 黑白棋总体设计8 HYPERLINK l _4.1_程序流程图 4.1 程序流程图8 HYPERLINK l _4.2_主要模块简介 4.2 主要模块简介8 HYPERLINK l _第五章_程序实现 5. 程序实现10 HYPERLINK l _5.1_界面实现 5.1 界面实现10 HYPERLINK l _5.2_功能按钮的实现 5.2 功能按钮的实现11 HYPE

4、RLINK l _5.3主要函数 5.3主要函数12 HYPERLINK l _5.3主要函数 5.4 电脑战术分析14 HYPERLINK l _5.4.1_棋盘扫描 5.4.1 棋盘扫描14 HYPERLINK l _5.4.2判断行动力 5.4.2判断行动力14 HYPERLINK l _5.4.3选择最佳位置落子 5.4.3选择最佳位置落子15 HYPERLINK l _第六章_系统测试 6.系统测试16 HYPERLINK l _6.1双人模式下的测试 6.1双人模式下的测试16 HYPERLINK l _6.1.1_悔棋和悔棋恢复测试 6.1.1 悔棋和悔棋恢复测试16 HYPER

5、LINK l _6.1.2_PASS情况下的悔棋恢复 6.1.2 PASS情况下的悔棋恢复16 HYPERLINK l _6.2_单人模式下的测试 6.2 单人模式下的测试16 HYPERLINK l _6.2.1_PASS情况的测试 6.2.1 PASS情况的测试16 HYPERLINK l _6.2.2_游戏正常测试 6.2.2 游戏正常测试17 HYPERLINK l _6.2.3_悔棋测试 6.2.3 悔棋测试17 HYPERLINK l _6.3_综合测试报告 6.3 综合测试报告17 HYPERLINK l _第七章_总结和展望 7. 总结和展望18 HYPERLINK l _7.

6、1_总结 7.1 总结18 HYPERLINK l _7.2展望 7.2展望18 HYPERLINK l _致谢 致19 HYPERLINK l _参考文献 参考文献20基于Qt的黑白棋游戏开发容提要 本程序使用的是面向对象的QT库的C+语言开发,可以同时运行于Linux和Windows环境下的游戏程序。有双人对弈,人机对弈,无限悔棋等功能,其中人机对弈包含难度选择和先后手选择。本论文首先指出了黑白棋游戏、Linux桌面环境、QT开发环境的发展现状,然后重点介绍了QT开发工具的使用、黑白棋的常见战术、黑白棋程序的界面设计、规则设计、算法设计(包含搜索算法、局面估值、-减枝、散列表、MTD等当今

7、主流算法)、终局搜索、以与作为一款游戏的其他必须功能,最后介绍了Linux桌面环境 GUI的发展趋势。 本设计通过一个棋类游戏的开发,阐述了棋类游戏的开发过程,包括软件开发的逻辑分析,程序设计,软件实现和软件测试几个步骤。关键词:黑白棋, Linux,人工智能,QT引言概述了黑白棋游戏开发,对黑白棋的基本知识和相关开发环境做了一个简介第一章 背景11系统开发背景随着网络技术的日新月异和计算机的普与,当今的计算机技术也走上了平民化和娱乐化的时代,计算机技术再也不是只能由少数人掌握的深不可测的学问;同时个人计算机也由原来单纯的数值计算和工业应用逐渐转变成像电视机一样的家庭娱乐中心,伴随着这种巨大的

8、转变计算机软件的发展也走向了娱乐化。尤其是游戏产业的发展已经成为信息产业中发展势头最猛烈最具前景的一个分支,而游戏厅也渐渐被网吧挤出了正常的营业市场,游戏除了单纯的个人娱乐功能之外,也逐渐向互动的方向发展。游戏的功能不断按照玩家的需求和爱好扩展延伸进化,如今运行在各种平台上不同名称,不同容,不同形式的游戏不仅仅为广大游戏爱好者提供了丰富的选择,而且为游戏开发商带来了丰厚的回报,游戏产业吸引着许多程序员去开发更多更新的游戏。基于游戏发展的历史和前景,我决定用C+语言开发一款小游戏,游戏容来自网络上日渐流行的一种智力游戏黑白棋。我希望把平时界面简单、选项复杂的游戏,在Linux里面做成漂亮的、简单

9、的游戏程序,以给Linux玩家一个新的选择。随着计算机处理速度的飞速提高,人们很早就提出了疑问:计算机是否会超越人类?世界国际象棋棋王卡斯帕罗夫与美国IBM公司的RS6000(深蓝)计算机系统于1997年5月11日进行了六局“人机大战”,结果“深蓝”以3.5比2.5的总比分获胜。比赛结束了给人们留下了深刻的思考;下棋要获胜要求选手要有很强的思维能力、记忆能力、丰富的下棋经验,还得与时做出反应,迅速进行有效的处理,否则一着出错满盘皆输,这显然是个“智能”问题。尽管开发“深蓝”计算机的IBM专家也认为它离智能计算机还相差甚远,但它以高速的并行的计算能力(20108步每秒棋的计算速度)。实现了人类智

10、力的计算机上的部分模拟。那么计算机已经超过了人类吗?本文着重介绍了黑白棋的设计与开发,让您对计算机棋手的智能有更深入的了解。1.2 黑白棋简介黑白棋,又名反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋。黑白棋起源中世纪的英国,18世纪传入日本,并在日本得到了发展。现在,黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。它的游戏规则简单,因此上手很容易,但是它的变化又非常复杂。有一种说法是:只需要几分钟学会它,却需要一生的时间去精通它。黑白棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。黑白棋既有现代休闲的明显特征“短、平、

11、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。1.2.1 黑白棋游戏规则(1)两人对弈,以轮流方式持黑子与白子。(2)开辟新局者持白子,加入者持黑子, 之后以轮流方式将棋子置于棋盘格子中。若无地方可下子,则跳过一回,由对方下子。(3)在提示的格子中,选择一个格子下子, 当下子的位置与离最近的同色旗子中, 若有其他棋子则中间的棋子变为与我方一样颜色。(4)当下满64个棋子,棋子多者为胜。1.2.2 黑白

12、棋游戏简介黑白棋规则规定对局结束时子多的一方为胜方,于是初学者通常会一开始使劲吃子,这实际上是犯了短视的错误。每一步都尽可能吃更多的子,我们把这种下法叫做大食策略(MAXIMUM DISC STRATEGY)。除了大食策略以外,还有其它几种常用的策略以与重要位置和术语,它们是:稳定子 - 位置策略(STABLE DISCS - POSITIONAL STRATEGY)楔入(WEDGES)行动力策略(MOBILITY)余裕手(TEMPO,WAITING MOVES)爬边(CREEPING ALONG EDGES) 奇偶性(PARITY) 非平衡边(UNBALANCED EDGES)四通陷阱(ST

13、ONER TRAPS)从黑白棋的游戏规则上看,应该尽量使自己的棋子多于对手的,很容易就得到了一个战术,就是每步棋都落在能吃掉对手棋子最多的位置,但是经过几局后,你就会发现这并不是一个好的方法。1.3 相关实现环境本程序采用QT库与其开发环境,使用C+语言开发运行于Linux系统KDE桌面环境下的黑白棋游戏。经过实际检测,QT强大的跨平台性,已经保证了同样的代码在Windows XP下、Linux GNOME下、Linux KDE下,几乎不用修改就能正常运行。1.3.1 开发环境Qt 4.7.4 (4.7.4)MinGW编译器1.3.2 运行环境Microsoft Windows XPPenti

14、um(R) Dual-Core CPU 250G硬盘1.4 主要研究容本文将对计算机棋手下黑白棋做一个全面综述,介绍计算机对黑白棋战术分析的全过程,包括对图形和动画的处理、对棋盘搜索的算法、对棋局做出正确的估计、并生成最佳走法,并将介绍其中各个流程的研究状况与实用技术。本文的重点放在计算机对当前棋局的分析,并做出最佳的选择。介绍搜索算法,棋类游戏不可能一步就决出胜负,象棋中不可能第一步就将对方将死;而对某个棋局的判断也不可能完全精确,在黑白棋中,初局时棋子多并不一定最终取得胜利,因为对手可能在后面的博弈过程中将局面扭转。想想人类下棋时,一般会假设我走这步,那么对手会怎,样回应,如果对手回应了某

15、一步,我再走哪一步,如果对手回应了另外某一步,我又该怎么走;然后再假设我走另外的某一步,如此反复下去。这个过程叫做搜索。1.5 系统开发的现实意义利用这次毕业设计的机会可以熟悉C+语言的各种特性,锻炼程序设计的实践能力,熟悉c+语言Linux下的开发环境,熟悉前沿的Linux图形用户界面的开发,以与巩固数据结构和算法等课程的学习成果,并深入理解数据结构和算法在程序设计中的核心地位。同时,借助开发本游戏的过程,可以熟悉人工智能的程序实现,有助于掌握棋类所需人工智能的常见算法,随着游戏产业的日益壮大,人工智能在游戏中的突出表现,人工智能越来越得到世人的重视。在这次的人机对战算法中,通过一定的算法,

16、实现电脑的下棋与走棋运作,加深了对人工智能工作原理的了解。 综上所述,通过每次黑白棋的开发,可以深入了解Linux编程方法、加深了解算法。第二章 开发工具21 QT简介Qt是一个跨平台的C+图形用户界面库,由挪威TrollTech公司出品,目前包括Qt, 基于Framebuffer的Qt Embedded,快速开发工具Qt Designer,国际化工具 Qt Linguist等部分Qt支持所有Unix系统,当然也包括 Linux,还支持 WinNT/Win2k,Win95/98 平台。1Qt是一个多平台的C+图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能

17、。Qt是完全面向对象的很容易扩展,并且允许真正地组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界围数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE 的基础,KDE是所有主要的Linux发行版的一个标准组件。基本上,Qt同X Window上的Motif、Openwin、GTK等图形界面库和Windows 平台上的MFC、OWL、VCL、ATL是同类型的东西,但是Qt具有下列优点:优良的跨平台特性:Qt支持下列操作系统: Microsoft Windows 95/98、 Microsoft Windows NT、 linux、Solaris、SunOS、HP-

18、UX、Digital UNIX (OSF/1、Tru64)、Irix、FreeBSD, BSD/OS、SCO、AIX、OS390、QNX 等等。面向对象:Qt 的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。Qt提供了一种称为signals/slots的安全类型来替代 callback,这使得各个元件之间的协同工作变得十分简单。丰富的API:Qt 包括多达250个以上的C+类,还提供基于模板的collections、 serialization、file、I/O device、Directory management、date/time 类。甚至还包括正则

19、表达式的处理功能。支持2D/3D图形渲染,支持OpenGL。22信号与槽QT不同于其他开发工具的一个重要特点,就是信号与槽。信号和槽用于对象间的通讯。信号/槽机制是Qt的一个中心特征并且也许是Qt与其它工具包的最不一样的部分。在图形用户界面编程中,我们经常希望一个窗口部件的一个变化被通知给另一个窗口部件。更一般地,我们希望任何一类的对象可以和其它对象进行通讯。例如,如果我们正在解析一个XML文件,当我们遇到一个新的标签时,我们也许希望通知列表视图我们正在用来表达XML文件的结构。图 2-1 一个关于一些信号和槽连接的摘要图在Qt中我们有一种可以替代回调的技术。我们使用信号和槽。当一个特定事件发

20、生的时候,一个信号被发射。Qt的窗口部件有很多预定义的信号,但是我们总是可以通过继承来加入我们自己的信号。槽就是一个可以被调用处理特定信号的函数。Qt的窗口部件又很多预定义的槽,但是通常的习惯是你可以加入自己的槽,这样你就可以处理你所感兴趣的信号。 信号和槽的机制是类型安全的:一个信号的签名必须与它的接收槽的签名相匹配。(实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的签名。)因为签名是一致的,编译器就可以帮助我们检测类型不匹配。信号和槽是宽松地联系在一起的:一个发射信号的类不用知道也不用注意哪个槽要接收这个信号。Qt的信号和槽的机制可以保证如果你把一个信号和一个槽连接起来,

21、槽会在正确的时间使用信号的参数而被调用。信号和槽可以使用任何数量、任何类型的参数。它们是完全类型安全的:不会再有回调核心转储(core dump)。图 2-2 一个信号和槽连接的例子信号与槽机制是一个函数,原型如下:QObject:connect( &a, SIGNAL(funtionA(), &b, SLOT(funtionB() )这一行在两个Qt对象(直接或间接继承QObject对象的对象)中建立了一种单向的连接。每一个Qt对象都有signals(发送消息)和slots(接收消息)。所有窗口部件都是Qt对象。它们继承QWidget,而QWidget继承QObject。该函数意思是a部件发

22、出 funtionA()消息,b部件执行funtionB()函数。第三章 黑白棋需求分析为了开发出真正满足用户需求的程序,尤其是游戏程序,首先必须知道用户的需求。把用户需求作为前提条件,来指导程序的开发31 黑白棋程序界面的需求通过上述网上常见的一些具有代表性的黑白棋程序的对比分析,现在一个基于界面上的用户需求已经基本确立。该需求包含以下几点:1. 作为按钮出现在主界面上的:先后手选择、单人双人模式、悔棋和悔棋恢复、难度选择、开始新游戏。2. 能够直观显示在游戏界面上的:棋子数目显示、显示上步棋位置、提示下棋点、动画翻转棋子。3. 2黑白棋游戏规则的需求第二章中已经介绍了黑白棋游戏的规则,主要

23、有如下规则:1两人对弈,以轮流方式持黑子与白子。2开辟新局者持黑子,加入者持白子, 之后以轮流方式将棋子置于棋盘格子中。若无地方可下子,则跳过一回,由对方下子。3在提示的格子中,选择一个格子下子, 当下子的位置与离最近的同色旗子中, 若有其他棋子则中间的棋子变为与我方一样颜色。4当下满64个棋子,棋子多者为胜。5双方都无棋可走的其他局面,游戏结束,以子多者为胜。黑白棋游戏规则,是程序设计是需要考虑的部需求,该部分需求,和前面的游戏界面需求,以与下小节的其他需求,功能构成了黑白棋程序的基本需求。第4章 黑白棋总体设计本模块建立在第3章需求分析基础之上,把用户的需求转换为程序的蓝图,作为后面编码过

24、程中的依据。4.1 程序流程图程序所需执行的流程见图4-1,该图表示出了程序执行的流程,也基本表示出了程序的各个模块和相互关系,后面的详细设计和代码实现,就是基于本图设计的。图4-1 黑白棋流程图4.2 主要模块简介为了实现黑白棋游戏的开发,通过流程图的分析,计划采用以下几大模块:绘图模块本模块用来负责主界面的绘制,包括棋盘、棋子、个数统计、时间显示、以与其它需要显示的部分的绘图。绘图模块的实现,主要通过重载QT库中自带的绘图函数来实现。初始化模块初始化模块是一个函数,用来负责开局时的棋盘初始化,主要负责把程序代码中各变量值初始化。初始化函数再程序首次执行时自动调用,中途通过点击新游戏按键调用

25、。双人模块双人模块是本程序得以运行的基础,本模块通过判断用户鼠标点击位置,判断出该坐标所处棋盘中响应位置,并通过后面的规则模块决定能否下子,如果能下子就下己方棋子,并交换为对手走棋。单人模块单人模块是基于双人模块的,当玩家点击棋盘并成功走棋后,把交换对手部分,变为交换至电脑走棋,电脑则通过算法模块走出电脑认为最佳位置,并等待玩家继续走棋。因此,本黑白棋开发过程中,把单人模块看成是双人模块的一部分来处理。规则模块走棋模块是黑白棋的基础,它负责判断哪些位置能走棋,并在成功走棋后,翻转所需棋子后,并再次负责判断出对方可走棋位置。 本模块包括翻转函数、以与判断可下子位置函数。悔棋和悔棋恢复模块本模块通

26、过每次走棋记录棋谱,以便用户能够全局悔棋,并全局恢复,但是当悔棋过程中,用户再次走棋,则后继步数不能恢复。第五章 程序实现通过第3章和第4章的描述,黑白棋设计思路已经确定,现在要做的就是把设计结果翻译成专用的程序设计语言所书写的程序。编码是对设计的进一步具体化,本部分的质量取决于前期设计的质量,但是,所选设计语言的特点与编码风格也会对程序的可靠性、可读性、可测试性和可维护性产生影响。5.1 界面实现为了增加游戏的美观,界面采用专业绘图工具制作出来的漂亮图片作为程序背景和棋盘背景。本程序利用FireWorks对网络上的一些图片做了修改,并作为程序背景使用。界面的显示,是把上述背景图作为资源文件,

27、通过重载QT库自带的paintEvent(QPaintEvent *e)函数,来绘制背景棋盘。 叶子状的是程序背景,红色底纹的是棋盘背景。之所以不作为一个图片保存背景,是为了便于以后棋盘改变布局位置。在左边有总用时和本步用时两个小模块,这是用QTDesigner自带的控件绘制的,计划用于上方走棋时间统计。为了使这两个小模块好看些,也加上了背景,同时背景的上半部分,用来标示黑白双方,以与显示双方当前局面棋子个数,并用高亮方式,表示出当前该哪一方走棋。背景界面设计好了,再加上常用功能键、其它选择按钮等,一个程序打开的初始界面就确定了,见图5-1图5-1 黑白棋主界面重载QT库自带的paintEve

28、nt(QPaintEvent *e)函数的方法如下,首先定义用来统计黑白两色棋子个数,初始值为0,接着生成绘图对象,并加载需要绘制的各个元素,然后并绘制出来,以与绘制其他相关元素。5.2 功能按钮的实现用QT开发GUI程序,不如MFC容易,但只要掌握了QT的方法,还是很轻松的。如图5-1的上方部分的按钮,可以用QTDesigner里面的控件直接绘制出来。然而这是显性的绘制,点击该按钮并不能直接执行相应的函数。而是通过信号与槽机制响应相关函数。信号与槽的机制在2.3节中有介绍。再次我们要给新游戏按钮与初始化函数建立联系,即:QObject:connect(pushButton_new, SIGN

29、AL(clicked(), Form, SLOT(initialize();pushButton_new为新游戏部件名称,本句话意思是点击新游戏按钮,程序执行初始化(initialize())函数。其他按钮已通过信号与槽机制和相关功能的函数连接起来,具体连接请参照附录一主要代码部分。本程序使用到的信号与槽。结合着相关函数介绍实现代码:本部分主要是把信号和槽进行部件之间的连接,这部分在Designer里面会自动生成。但是自定义的槽函数,要声明称public slots形式。本程序用到的信号槽代码和功能如下:QObject:connect(pushButton_new, SIGNAL(clicke

30、d(), Form, SLOT(initialize(),点击开始按钮,程序初始化。QObject:connect(pushButton_backward, SIGNAL(clicked(), Form, SLOT(backward(),点击后退按钮,执行后退相关函数。QObject:connect(pushButton_forward, SIGNAL(clicked(), Form, SLOT(forward(),点击前进按钮执行前进函数QObject:connect(checkBox_tip, SIGNAL(clicked(), Form, SLOT(update(),点击tip按钮,执行

31、刷新函数,刷新过程中,根据该组件是否被选中,决定时候绘制提示点。QObject:connect(radio_single, SIGNAL(clicked(bool), checkBox_2, SLOT(setEnabled(bool),点击单人游戏按钮,改变该组件状态为选中模式,从而决定在mousePressEvent(QMouseEvent *e)里面执行单人模式。QObject:connect(radio_double, SIGNAL(clicked(bool), checkBox_2, SLOT(setDisabled(bool) ,点击单人游戏按钮,改变该组件状态为选中模式,从而决定在

32、mousePressEvent(QMouseEvent *e)里面执行双人模式。QObject:connect(radio_single, SIGNAL(clicked(bool), radioButton_lv1, SLOT(setEnabled(bool),点击单人游戏按钮,如果该按钮被选中,则难度选择按钮为可更改状态,下面两个一样。QObject:connect(radio_single, SIGNAL(clicked(bool), radioButton_lv2, SLOT(setEnabled(bool)。QObject:connect(radio_single, SIGNAL(cl

33、icked(bool), radioButton_lv3, SLOT(setEnabled(bool)。QObject:connect(radio_double, SIGNAL(clicked(bool), radioButton_lv1, SLOT(setDisabled(bool) 点击双人游戏按钮,如果该按钮被选中,则难度选择按钮为不可更改状态,下面两个一样。QObject:connect(radio_double, SIGNAL(clicked(bool), radioButton_lv2, SLOT(setDisabled(bool)。QObject:connect(radio_do

34、uble, SIGNAL(clicked(bool), radioButton_lv3, SLOT(setDisabled(bool)。QObject:connect(checkBox_2, SIGNAL(clicked(), Form, SLOT(update(),该处选中,执行动画效果。QObject:connect(radio_single, SIGNAL(clicked(), Form, SLOT(doubletosingle(),该处选中,执行双人到单人模式切换函数doubletosingle(),判断如果该电脑走棋,则电脑走一步棋。5.3主要函数从程序看,这是一个二维平面图,所以数

35、据用二维数组类来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格上的状态,共有五种情况,分别是0代表可下子格,1代表黑棋,-1代表黑棋,-2代表绝对不能下的位置,2代表需要判断才知道能否下的位置。程序首次打开,执行initialize()函数初始化棋局,用户可以直接走棋或者选择单人模式等一些功能,当用户点击棋盘某一位置时,响应mousePressEvent(QMouseEvent *e)函数,判断鼠标点击位置,如果能下棋则执行onestep(int x,int y)函数在该方格走一步棋。并交由对方(可能是另一名玩家,或者电脑走棋。)mousePressEvent(QMouseEve

36、nt *e)函数的执行过程如下:首先通过点击鼠标位置获取点击坐标,并判断该处是否能下子,不能下子退出该函数。该位置能下子,执行onestep(judgepos(x),judgepos(y)走一步棋。玩家走一步棋之后,如果是单人模式执行,则交由电脑走棋。电脑走棋首先进行难度判断,并结合着棋局步数判断,选择不同的函数进行搜索,搜索结束,电脑执行onestep(judgepos(x),judgepos(y)走一步棋,退出该函数。在调用onestep(int x,int y)函数时,程序首先通过mousePressEvent(QMouseEvent *e)函数获得的(x,y)坐标,在棋盘(x,y)位置

37、放置一枚该方棋子,然后检测周围能翻转的棋子并翻转(reverse(int x,int y,int whom))、之后判断出对方可走棋位置(canbedrop(int x,int y,int whom)),并交由对方走棋。reverse(int x,int y,int whom)翻转函数会对该位置的八个方向做出判断,选择能翻转的棋子,并进行翻转,为了节省篇幅,再次举出12点钟方向的翻转过程,其他方向类似。if (y1 & weizhixy-1.state = (-1)*whom) / for (int k=2;k=y;k+) if (weizhixy-k.state = 0 | weizhixy

38、-k.state = -2 |weizhixy-k.state = 2) break; if (weizhixy-k.state = whom) for (int i = 1; ik;i+) weizhixy-i.state = whom; break; 而判断可下子位置函数canbedrop(int x,int y,int whom)的思路和翻转函数类似,也是进行8方向的判断。为了使判断可走棋位置的循环减少,在此增加了一个cube(int x,int y)函数的处理,黑白棋只能在有子位置的相邻位置才可能放置棋子,开局时棋子周围的8个相邻格子为cube状态(2),然后每走一步棋,把该步棋周围的

39、8个子,和之前标记为2和0的位置,全部标记为2,然后进行canbedrop(int x,int y,int whom)搜索时,就只需要在标记为2的格子进行8方向判断,并把该处位置标记为0,等待对方下棋。走棋行进过程中,可随时通过点击棋盘上方的功能控制菜单,进行悔棋(backward())、悔棋回复(forward())、单人双人模式切换(doubletosingle())、难度选择、显示提示位置等功能。悔棋和悔棋回复函数,实质上建立一个数组,记录每步棋全盘棋子的各个位置的状态值,并进行悔棋和恢复。每走一步棋,自动调用绘图函数(paintEvent(QPaintEvent *e))进行界面重绘。

40、如果是单人模式,前面的mousePressEvent(QMouseEvent *e)有介绍,玩家走完会判断,如果轮到电脑走棋,则执行响应的AI算法,选择最佳走棋位置,并在该处走一步棋,交由玩家继续走棋。AI算法分为startserch(),负责开局1-10步,middleserch()负责11-50步,50步以后直至终局由endserch()负责。startserch()函数主要通过对程序中搜集的棋谱进行比较,如果有该开局模式,则按棋谱走棋,没有则自动调用middleserch()的方法进行搜索。在这些算法中还会用到如下一些子函数:count(int x)统计标记为x的一方棋子个数;middl

41、emain(int x)中期搜索函数的主要搜索过程;endmain()终局搜索函数的主要搜索过程;valuemiddle()中期搜索的综合估值函数;mobility()行动力函数;danger()危险位置函数。实际游戏开发中,高质量的AI程序,都会再加有一些其他子函数来更好的实现AI算法,在我的程序中,缺少这些高级算法。游戏结束时,直观显示双方棋子个数,由于黑白棋是靠子数多少决定胜负,因此为了美观我没有加入对话框提示输赢。此时可以点击新游戏重新开局,或选择退出。5.4 电脑战术分析在这一节中将介绍计算机是如何对棋盘进行分析,然后选择一个合理的位置进行下棋的。5.4.1 棋盘扫描想要计算机能够与

42、人对弈黑白棋,对棋盘的扫描是最基本的操作。前面已经介绍了通过cube(int x,int y)和canbedrop(int x,int y,int whom)进行扫描的方法,对棋盘的扫描工作就比较简单了,这里就不再累述。5.4.2判断行动力在前面的章节分析中已经提到,黑白棋的正确战术应该是尽量削弱对手的行动力,让对手全无好棋可下,同时增加自己的行动力。那么如何能让计算机懂得这个道理呢?这就要求计算机具有“思考”的能力。首先计算机调用检测行动力的函数mobility(),检测自己的行动力,也就是将当前棋盘所有能落子的位置找出来,然后在对这些位置逐步进行分析。分析的过程就是先假设计算机在某个位置上

43、落子,然后马上再次调用检测行动力函数,不过这次是检测对手的行动力。意思就是如果计算机在这里落子,看看对手的行动力如何,如果对手的行动力太大,对手有很多位置可以选择,那么就不应该在这里落子。如此对所有能落子的位置进行检测,找出一个能让对手行动力变得最小的位置落子,该函数mobility()原理为对棋盘进行搜索,找出所有标志为0的格子的个数,即为该处行动力。该函数原型如下:int MyForm:mobility() int move = 0; for (int i=0;i8;i+) for (int j=0;j8;j+) if (weizhiij.state=0) move+; return mo

44、ve;5.4.3选择最佳位置落子使用了一些战术,使计算机能够了解当前棋局的情况,最终的目的让计算机能够选择一个合理的位置落子。在本程序里在棋局的不同时期,所采用的选择方法也是不同的,在程序开局时,优先选择棋谱库中的固定套路。而在中期时则以多种估值通过赋予权值,统计出综合估值,选取最大估值位置落棋。到了后期,局面已经完全可以穷举,采用最大食子法,以能吃掉对手最多棋子为准。第六章 系统测试系统测试的目的主要在于发现错误,找出软件的缺陷和隐患,是确保软件质量的重要方法。在完成黑白棋游戏之后,分别对游戏中各个进行了测试,主要是检验该游戏在各种情况下中的功能能否实现,是否满足黑白棋游戏规则的走棋,从而验

45、证该系统确实符合预订的需求, 软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码的最终复查,是软件质量保证的关键步骤。早在1973年, W.Hetael曾经指出,测试是对程序或系统能否完成特定任务建立信心的过程。系统在开发过程中采用了多种措施保证软件质量,但是实际开发过程中还是不可避免地会产生差错。系统常可能隐藏着错误和缺陷,若将未经周密测试的系统投入运行,将会造成难以想象的后果。因此系统测试是管理系统开发过程中为保证软件质量必须进行的工作。大量统计资料表明,系统测试的工作量往往占管理系统开发总工作量的40%以上。因此必须重视测试工作。6.1双人模式下的测试双人模式是游戏进行的基

46、础,因此此部分的测试较多,且具有代表性。6.1.1 悔棋和悔棋恢复测试正常情况下,黑白棋双人模式中悔棋可以悔棋至初始棋局,并能恢复至玩家最后一次落子的棋局。在悔棋中途,如果玩家改变落子,则只能恢复至该处,不能也不应该继续回复原本没有恢复的棋步。6.1.2 PASS情况下的悔棋恢复PASS情况下的悔棋恢复,就要先设计出一个有pass情况的棋局出来,然后选择悔棋,看是否正常悔棋。6.2 单人模式下的测试单人模式是双人模式的一个特殊情况,因此有些测试和双人模式一样,不用反复测试,只需测试对方走棋是否符合规则就行。备注,单人模式测试由于是电脑配合走棋,因此某些环境不容易还原,在程序开发中进行过测试,并

47、将测试结果统计如下,在此就另外不附图说明。6.2.1 PASS情况的测试由于单人模式需要进行思考,所以中途可能会造成遇到PASS情况,致使该步走棋方发生错误,比如本来该白棋走的结果却是黑棋走。经过测试,测试失败。查找原因,每次电脑思考都是固定套用每次落子切换走棋方的方法,致使一方PASS,本不该切换走棋方的,仍然切换的错误情况,后经改进为每步棋由哪方走棋的数组记录,错误得以解决。6.2.2 游戏正常测试本测试,测试电脑AI是否能选择正确位置走棋,结果发现在某些未知情况下,电脑会在本不能下子处下子。测试失败。查找原因,暂时为查明,但该BUG位于AI算法函数中,这点是确定的,因此程序AI算法部分,有待改进。6.2.3 悔棋测试由于单人模式每次需要同时悔棋两步,因此也要单独测试,经过测试,符合要求,测试成功!6.3 综合测试报告从以上的测试方法和测试结果可以看出,该游戏的在双人模式下能完全正确的运行,与当初的预想一致。基本上实现了需求分析和系统设计中所提到的所有功能(计时功能暂未开发)。单人模式下存在一处bug,但影响到程序的可执行性,应该得到修正。第七章 总结和展望7.1 总结本程序能以友好的界面运行于Windows系统、Linux系统的两大桌面环境(Gnome和KDE)、以与Mac系统(Mac

温馨提示

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

评论

0/150

提交评论