毕业设计--Qt黑白棋_第1页
毕业设计--Qt黑白棋_第2页
毕业设计--Qt黑白棋_第3页
毕业设计--Qt黑白棋_第4页
毕业设计--Qt黑白棋_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、毕业设计论文(潘登).doc(1)原创本文转自同名word的无格式文档,复制到此,无法保持原有格式,在此给大家阅读造成不便,敬请包涵! 封面中原工学院信息商务学院毕业设计(论文)此封面系里统一发题 目:专 业:班 级:学 号:学生姓名:指导教师:年 月 日 Linux下基于QT的黑白棋游戏软件设计与实现Black & white chess game software based on QT under Linux design and implementation专 业:计算机科学技术系班 级:网络051学 号:200580124114学生姓名:潘登指导教师:王璐2009 年 5 月 5 日

2、摘 要本程序使用面向对象的QT库的C+语言,开发于可以同时运行于Linux和Windows环境下的游戏程序。有双人对弈,人机对弈,无限悔棋等功能,其中人机对弈包含难度选择和先后手选择。本论文首先指出了黑白棋游戏、Linux桌面环境、QT开发环境的发展现状,然后重点介绍了QT开发工具的使用、黑白棋的常见战术、黑白棋程序的界面设计、规则设计、算法设计(包含搜索算法、局面估值、-减枝、散列表、MTD等当今主流算法)、终局搜索、以及作为一款游戏的其他必须功能,最后介绍了Linux桌面环境 GUI的发展趋势。本设计通过一个棋类游戏的开发,阐述了棋类游戏的开发过程,包括软件开发的逻辑分析,程序设计,软件实

3、现和软件测试几个步骤。关键词: 黑白棋;Linux;人工智能;QTAbstractThis programme used QT Object-Oriented Database C+ language, develops the game which can be run on Linux and Windows environments. has doubles plays , man-machine plays, retract a false move in a chess game boundlessly waiting for a function. Single mode cont

4、ains degree of difficulty choosing and choosing successively personally.The thesis has pointed out first the Othello, the Linux desktop environment, the development status of QT develop. Then, focuses on the use of QT development tools, Othello common tactical, Othello program interface design, desi

5、gn of rules, algorithm design (including search algorithms, the valuation of the situation, - by sticks, Hash table, MTD algorithm, such as todays mainstream), final search, and as well as other games functions. Finally, introduce the GUI desktop environment for Linux development trends.This design

6、through the development of a chess game, described the development of chess games, including logic analyzer of software development, programming, software achieve and Software Testing, and so on.Key words : black & white chess; Linux; AI; QT目 录摘 要 IAbstract II目 录 III第1章 绪 论 11.1黑白棋开发背景 11.2黑白棋游戏简介 2

7、1.2.1黑白棋规则 21.2.2黑白棋战术分析 21.3相关实现环境 31.3.1 开发环境 41.3.2 运行环境 41.3.3 硬件环境 41.4 主要研究内容 41.5 系统开发的现实意义 5第2章 开发工具QT 62.1 QT简介 62.2 QT的使用 62.3 信号与槽 8第3章 黑白棋需求分析 113.1 黑白棋程序界面的需求 113.1.1 调查对比同类软件 113.1.2 确定需求 143.2 黑白棋游戏规则的需求 143.3 黑白棋程序的其它需求 15第4章 黑白棋程序设计 164.1 程序流程图 164.2 主要模块简介 17第5章 程序实现 195.1 界面实现 195

8、.2 功能按钮的实现 215.3 程序主要函数 235.4 电脑战术分析 265.4.1 棋盘扫描 265.4.2判断行动力 265.4.3 四角优先战术 275.4.4 选择最佳位置落子 27第6章 系统测试 286.1双人模式下的测试 286.1.1 悔棋和悔棋恢复测试 286.1.2 PASS情况下的悔棋恢复 306.1.3 游戏规则测试 316.1.4 终局测试 316.2 单人模式下的测试 326.2.1 PASS情况的测试 326.2.2 游戏正常测试 326.2.3 悔棋测试 326.3 综合测试报告 32第7章 总结和展望 337.1 总结 337.2展望 337.2.1 人工

9、智能展望 337.2.2 Linux GUI展望 34致 谢 35参考文献 36附 录 37附录A: 主要源程序 37第1章 绪 论本章概述了黑白棋游戏开发的意义,以及对黑白棋的基本知识和相关开发环境做了一个简介。1.1黑白棋开发背景随着网络技术的日新月异和计算机的普及,当今的计算机技术也走上了平民化和娱乐化的时代,计算机技术再也不是只能由少数人掌握的深不可测的学问;同时个人计算机也由原来单纯的数值计算和工业应用逐渐转变成像电视机一样的家庭娱乐中心,伴随着这种巨大的转变计算机软件的发展也走向了娱乐化。尤其是游戏产业的发展已经成为信息产业中发展势头最猛烈最具前景的一个分支,而游戏厅也渐渐被网吧挤

10、出了正常的营业市场,游戏除了单纯的个人娱乐功能之外,也逐渐向互动的方向发展。游戏的功能不断按照玩家的需求和爱好扩展延伸进化,如今运行在各种平台上不同名称,不同内容,不同形式的游戏不仅仅为广大游戏爱好者提供了丰富的选择,而且为游戏开发商带来了丰厚的回报,游戏产业吸引着许多程序员去开发更多更新的游戏。基于游戏发展的历史和前景,我决定用C+语言开发一款小游戏,游戏内容来自网络上日渐流行的一种智力游戏黑白棋。我希望把平时界面简单、选项复杂的游戏,在Linux里面做成漂亮的、简单的游戏程序,以给Linux玩家一个新的选择。人工智能是一门极富挑战性的科学,包括十分广泛的科学,它由不同的领域组成,如机器学习

11、,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。例如繁重的科学和工程计算本来是要人脑来承担的, 现在计算机不但能完成这种计算, 而且能够比人脑做得更快、更准确, 因而当代人已不再把这种计算看作是“需要人类智能才能完成的复杂任务”, 可见复杂工作的定义是随着时代的发展和技术的进步而变化的, 人工智能这门科学的具体目标也自然随着时代的变化而发展。它一方面不断获得新的进展, 一方面又转向更有意义、更加困难的目标。目前能够用来研究人工智能的主要物质手段以及能够实现人工智能技术的机器就是

12、计算机, 人工智能的发展历史是和计算机科学与技术的发展史联系在一起的。除了计算机科学以外, 人工智能还涉及信息论、控制论、自动化、仿生学、生物学、心理学、数理逻辑、语言学、医学和哲学等多门学科。随着计算机处理速度的飞速提高,人们很早就提出了疑问:计算机是否会超越人类?世界国际象棋棋王卡斯帕罗夫与美国IBM公司的RS6000(深蓝)计算机系统于1997年5月11日进行了六局“人机大战”,结果“深蓝”以3.5比2.5的总比分获胜。比赛结束了给人们留下了深刻的思考;下棋要获胜要求选手要有很强的思维能力、记忆能力、丰富的下棋经验,还得及时做出反应,迅速进行有效的处理,否则一着出错满盘皆输,这显然是个“

13、智能”问题。尽管开发“深蓝”计算机的IBM专家也认为它离智能计算机还相差甚远,但它以高速的并行的计算能力(2r108步秒棋的计算速度)。实现了人类智力的计算机上的部分模拟。那么计算机已经超过了人类吗?看完本文,相信你会对计算机棋手的智能有所了解。1.2黑白棋游戏简介黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋。黑白棋起源中世纪的英国,18世纪传入日本,并在日本得到了发展。现在,黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。它的游戏规则简单,因此上手很容易,但是它的变化又非常复杂。有一种说法是:只需要几分钟学会它,却需要

14、一生的时间去精通它。黑白棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。黑白棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。1.2.1黑白棋规则1两人对弈,以轮流方式持黑子与白子。2开辟新局者持白子,加入者持黑子, 之后以轮流方式将棋子置于棋盘格子中。若无地方可下子,则跳过一回,由对方下子。3在提示的格子中,选择一个格子下子, 当下子的位置与离最近的同

15、色旗子中, 若有其他棋子则中间的棋子变为与我方一样颜色。4当下满64个棋子,棋子多者为胜。1.2.2黑白棋战术分析黑白棋规则规定对局结束时子多的一方为胜方,于是初学者通常会一开始使劲吃子,这实际上是犯了短视的错误。每一步都尽可能吃更多的子,我们把这种下法叫做大食策略(MAXIMUM DISC STRATEGY)。除了大食策略以外,还有其它几种常用的策略以及重要位置和术语,它们是:稳定子 - 位置策略(STABLE DISCS - POSITIONAL STRATEGY)楔入(WEDGES)行动力策略(MOBILITY)余裕手(TEMPO,WAITING MOVES)爬边(CREEPING AL

16、ONG EDGES) 奇偶性(PARITY) 非平衡边(UNBALANCED EDGES)四通陷阱(STONER TRAPS)从黑白棋的游戏规则上看,应该尽量使自己的棋子多于对手的,很容易就得到了一个战术,就是每步棋都落在能吃掉对手棋子最多的位置,但是经过几局后,你就会发现这并不是一个好的方法。那么黑白棋的正确战术应该是怎样的呢?一般说来,下棋过程中,你必须尽量削减对手的行动力,同时增加自己的行动力,这种策略我们称之为行动力原则(或行动力战术)。当一方达到或接近这个目标时,我们就称该棋手控制了棋局。另外,这个战术的目的是迫使对方下坏棋,如果对方虽然可选位置很少,但每一步却总有好棋,那战术目的就

17、没有达成。记住,你必须让对方完全无好棋可下。 黑白棋规则规定只能在对方棋子相邻的空位下棋,这就可以推出另一个原则。对方棋子边上的空位越多,你下棋的选择也就越多,换句话说,你的行动力就越强;相反,如果你棋子边上的空位越少,对方可下的位置也就越少。我们把相邻位置上有空位的子称为外子,反之称为内子,连在一起的外子称为前线或墙。下棋时要尽量减少自己的外子。1.3相关实现环境本程序采用QT库及其开发环境,使用C+语言开发运行于Linux系统KDE桌面环境下的黑白棋游戏。经过实际检测,QT强大的跨平台性,已经保证了同样的代码在Windows XP下、Linux GNOME下、Linux KDE下,几乎不用

18、修改就能正常运行。1.3.1 开发环境qt-sdk-linux-x86-opensource-2009.01 (QT4.5)MinGW编译器1.3.2 运行环境1. Linux环境Fedora 10 Linux with KDEFedora 10 Linux with Gnome2. Windows环境Microsoft Windows XP sp21.3.3 硬件环境AMD Sempron 2600+,1024M内存,160G硬盘1.4 主要研究内容本文将对计算机棋手下黑白棋做一个全面综述,介绍计算机对黑白棋战术分析的全过程,包括对图形和动画的处理、对棋盘搜索的算法、对棋局做出正确的估计、并

19、生成最佳走法,并将介绍其中各个流程的研究状况及实用技术。本文的重点放在计算机对当前棋局的分析,并做出最佳的选择。介绍搜索算法,棋类游戏不可能一步就决出胜负,象棋中不可能第一步就将对方将死;而对某个棋局的判断也不可能完全精确,在黑白棋中,初局时棋子多并不一定最终取得胜利,因为对手可能在后面的博弈过程中将局面扭转。想想人类下棋时,一般会假设我走这步,那么对手会怎样回应,如果对手回应了某一步,我再走哪一步,如果对手回应了另外某一步,我又该怎么走;然后再假设我走另外的某一步,如此反复下去。这个过程叫做搜索。1.5 系统开发的现实意义利用这次毕业设计的机会可以熟悉c+语言的各种特性,锻炼程序设计的实践能

20、力,熟悉c+语言Linux下的开发环境,熟悉前沿的Linux图形用户界面的开发,以及巩固数据结构和算法等课程的学习成果,并深入理解数据结构和算法在程序设计中的核心地位。同时,借助开发本游戏的过程,可以熟悉人工智能的程序实现,有助于掌握棋类所需人工智能的常见算法,随着游戏产业的日益壮大,人工智能在游戏中的突出表现,人工智能越来越得到世人的重视。在这次的人机对战算法中,通过一定的算法,实现电脑的下棋及走棋运作,加深了对人工智能工作原理的了解。 综上所述,通过每次黑白棋的开发,可以深入了解Linux编程方法、加深了解AI算法。第2章 开发工具QT2.1 QT简介Qt是一个跨平台的C+图形用户界面库,

21、由挪威TrollTech公司出品,目前包括Qt, 基于Framebuffer的Qt Embedded,快速开发工具Qt Designer,国际化工具 Qt Linguist等部分Qt支持所有Unix系统,当然也包括 Linux,还支持 WinNT/Win2k,Win95/98 平台。1Qt是一个多平台的C+图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展,并且允许真正地组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE 的基础,KDE是

22、所有主要的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-UX、Digital UNIX (OSF/1、Tru64)、Irix、FreeBSD, BSD/OS、SCO、AIX、OS390、QNX 等等。面向对象:Qt 的良好封装机制使得Qt的模块化程度非常高,

23、可重用性较好,对于用户开发来说是非常方便的。Qt提供了一种称为signals/slots的安全类型来替代 callback,这使得各个元件之间的协同工作变得十分简单。丰富的API:Qt 包括多达250个以上的C+类,还提供基于模板的collections、 serialization、file、I/O device、Directory management、date/time 类。甚至还包括正则表达式的处理功能。支持2D/3D图形渲染,支持OpenGL。2.2 QT的使用本文以一个最常用的例子HelloWorld的开发过程,作为QT编程的入门。2需要的代码如下:#include #includ

24、e Int main( int argc, char *argv ) QApplication a( argc, argv ); QPushButton hello( Hello world!, 0 ); hello.resize( 300, 100 ); a.setMainWidget( &hello ); hello.show(); return a.exec(); #include 代码解释:这一行包含了QApplication类的定义。在每一个使用Qt的应用程序中都必须使用一个QApplication对象。QApplication管理了各种各样的应用程序的广泛资源,比如默认的字体和光标

25、。 #include 这一行包含了QPushButton类的定义。参考文档的文件的最上部分提到了使用哪个类就必须包含哪个头文件的说明。 QPushButton是一个经典的图形用户界面按钮,用户可以按下去,也可以放开。它管理自己的观感,就像其它每一个QWidget。一个窗口部件就是一个可以处理用户输入和绘制图形的用户界面对象。程序员可以改变它的全部观感和它的许多主要的属性(比如颜色),还有这个窗口部件的内容。一个QPushButton可以显示一段文本或者一个QPixmap。 int main( int argc, char *argv )main()函数是程序的入口。几乎在使用Qt的所有情况下,

26、main()只需要在把控制转交给Qt库之前执行一些初始化,然后Qt库通过事件来向程序告知用户的行为。argc是命令行变量的数量,argv是命令行变量的数组。这是一个C/C+特征。它不是Qt专有的,无论如何Qt需要处理这些变量。 QApplication a( argc, argv )a是这个程序的QApplication。它在这里被创建并且处理这些命令行变量(比如在X窗口下的-display)。请注意,所有被Qt识别的命令行参数都会从argv中被移除(并且argc也因此而减少)。接下来是编译:编译一个C+应用程序,你需要创建一个makefile。创建一个Qt的makefile的最容易的方法是使

27、用Qt提供的连编工具qmake。如果你已经把main.cpp保存到它自己的目录了,你所要做的就是这些: qmake *.promake 第一个命令调用qmake来生成一个.pro(项目)文件。第二个命令根据这个项目文件来生成一个(系统相关的)makefile。你现在可以输入make,然后运行你的第一个Qt应用程序! 运行后效果如图2-1所示图2-1 QT开发的Hello World2.3 信号与槽QT不同于其他开发工具的一个重要特点,就是信号与槽。信号和槽用于对象间的通讯。信号/槽机制是Qt的一个中心特征并且也许是Qt与其它工具包的最不相同的部分。3在图形用户界面编程中,我们经常希望一个窗口部

28、件的一个变化被通知给另一个窗口部件。更一般地,我们希望任何一类的对象可以和其它对象进行通讯。例如,如果我们正在解析一个XML文件,当我们遇到一个新的标签时,我们也许希望通知列表视图我们正在用来表达XML文件的结构。图 2-2 一个关于一些信号和槽连接的摘要图在Qt中我们有一种可以替代回调的技术。我们使用信号和槽。当一个特定事件发生的时候,一个信号被发射。Qt的窗口部件有很多预定义的信号,但是我们总是可以通过继承来加入我们自己的信号。槽就是一个可以被调用处理特定信号的函数。Qt的窗口部件又很多预定义的槽,但是通常的习惯是你可以加入自己的槽,这样你就可以处理你所感兴趣的信号。 信号和槽的机制是类型

29、安全的:一个信号的签名必须与它的接收槽的签名相匹配。(实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的签名。)因为签名是一致的,编译器就可以帮助我们检测类型不匹配。信号和槽是宽松地联系在一起的:一个发射信号的类不用知道也不用注意哪个槽要接收这个信号。Qt的信号和槽的机制可以保证如果你把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。信号和槽可以使用任何数量、任何类型的参数。它们是完全类型安全的:不会再有回调核心转储(core dump)。图 2-3 一个信号和槽连接的例子 信号与槽机制是一个函数,原型如下:QObject:connect( &a, SIGNA

30、L(funtionA(), &b, SLOT(funtionB() )这一行在两个Qt对象(直接或间接继承QObject对象的对象)中建立了一种单向的连接。每一个Qt对象都有signals(发送消息)和slots(接收消息)。所有窗口部件都是Qt对象。它们继承QWidget,而QWidget继承QObject。该函数意思是a部件发出 funtionA()消息,b部件执行funtionB()函数。第3章 黑白棋需求分析为了开发出真正满足用户需求的程序,尤其是游戏程序,首先必须知道用户的需求。把用户需求作为前提条件,来指导程序的开发。3.1 黑白棋程序界面的需求3.1.1 调查对比同类软件为了获取

31、一款黑白棋程序需要满足的功能,我在网上查阅了大量前人做好的黑白棋程序。具有可比性的黑白棋程序有如下几款,伤心黑白棋(见图3-1)、亿唯黑白棋1.35(见图3-2)、Monkey黑白棋1.0(见图3-3)、以及大名鼎鼎的WZebra(见图3-4)。图3-1 伤心黑白棋图3-2 亿唯黑白棋1.35图3-3 Monkey黑白棋1.0图3.4 WZebra这四款游戏程序都能满足玩家游戏的基本需求,但是使用起来还是带给用户以不同的体验。伤心黑白棋:界面简洁、游戏棋力强,具有棋子数目显示、显示上步棋位置、先后手选择、单人双人模式、悔棋和悔棋恢复、难度选择、提示下棋点、声音提示、棋盘翻转、棋局保存及读取等功

32、能。不足之处:悔棋、开局等常用设置主界面不显示,使用过程中要在菜单栏寻找。作为一款游戏,没有考虑到程序的便捷性。作为一款游戏,界面不够美观。亿唯黑白棋1.35:界面较为简洁、游戏棋力较强,具有棋子数目显示、显示上步棋位置、先后手选择、单人双人模式、悔棋和悔棋恢复、难度选择、提示下棋点、声音提示、棋盘翻转、棋局保存及读取、动画翻转棋子、本局棋谱显示等功能。并在主界面上放置了常用功能按钮,为用户操作提供便捷性。不足之处:常用快捷键有点多,降低游戏开发简单为好的原则。作为一款游戏,界面不够美观。Monkey黑白棋1.0:界面另类,给人以耳目一新的感觉,人机对战中会给玩家提示电脑认为较好的位置。程序功

33、能直观。没有菜单栏等的干扰。具有棋子数目显示、显示上步棋位置、先后手选择、悔棋和悔棋恢复、难度选择、提示下棋点、声音提示等功能。不足之处:作为一款游戏,大胆使用透明界面,无形中就增加了游戏的乐趣,但布局有些乱,背景透明和其他背景融合一起,长时间游戏会对该界面产生反感。实际调查中,本点已被程序作者接受,在Monkey黑白棋2.0中,已经取消透明背景。WZebra:WZebra功能齐全、算法优异、棋力深厚、电脑思考速度快,在黑白棋中处于老大的地位。其他黑白棋中有的功能本游戏中都有。不足之处:作为一款程序,他当之无愧很成功,但作为一款游戏,它主界面上丰富的按钮,并不会带给玩家良好的用户体验。3.1.

34、2 确定需求通过上述网上常见的一些具有代表性的黑白棋程序的对比分析,现在一个基于界面上的用户需求已经基本确立。该需求包含以下几点:作为按钮出现在主界面上的:先后手选择、单人双人模式、悔棋和悔棋恢复、难度选择、开始新游戏。能够直观显示在游戏界面上的:棋子数目显示、显示上步棋位置、提示下棋点、动画翻转棋子。3.2 黑白棋游戏规则的需求第二章中已经介绍了黑白棋游戏的规则,主要有如下规则:1两人对弈,以轮流方式持黑子与白子。2开辟新局者持黑子,加入者持白子, 之后以轮流方式将棋子置于棋盘格子中。若无地方可下子,则跳过一回,由对方下子。3在提示的格子中,选择一个格子下子, 当下子的位置与离最近的同色旗子

35、中, 若有其他棋子则中间的棋子变为与我方一样颜色。4当下满64个棋子,棋子多者为胜。5双方都无棋可走的其他局面,游戏结束,以子多者为胜。黑白棋游戏规则,是程序设计是需要考虑的内部需求,该部分需求,和前面的游戏界面需求,以及下小节的其他需求,功能构成了黑白棋程序的基本需求。3.3 黑白棋程序的其它需求一个良好的游戏不仅要有一个好的界面来吸引用户兴趣,还需要把凡是不是必须有用户做出选择的地方都去掉。比如,在双方下棋中,一方无棋可走,切换到另一方,这时只需要在界面上给出提示即可,不需要弹出一个对话框的形式,告诉本步棋要pass,并提示玩家点击该对话框来继续游戏,这样会降低游戏的可玩性。同样的问题也出

36、现在用户点击退出时,不少程序会弹出图3-5的对话框来要求用户确认。这是见仁见智的选择,本文认为不符合用户的需求,因此也去掉了。图3-5 退出对话框第4章 黑白棋程序设计本模块建立在第3章需求分析基础之上,把用户的需求转换为程序的蓝图,作为后面编码过程中的依据。4.1 程序流程图程序所需执行的流程见图4-1,该图表示出了程序执行的流程,也基本表示出了程序的各个模块和相互关系,后面的详细设计和代码实现,就是基于本图设计的。图4-1 黑白棋流程图4.2 主要模块简介为了实现黑白棋游戏的开发,通过流程图的分析,计划采用以下几大模块:绘图模块本模块用来负责主界面的绘制,包括棋盘、棋子、个数统计、时间显示

37、、以及其它需要显示的部分的绘图。绘图模块的实现,主要通过重载QT库中自带的绘图函数来实现。初始化模块初始化模块是一个函数,用来负责开局时的棋盘初始化,主要负责把程序代码中各变量值初始化。初始化函数再程序首次执行时自动调用,中途通过点击新游戏按键调用。双人模块双人模块是本程序得以运行的基础,本模块通过判断用户鼠标点击位置,判断出该坐标所处棋盘中响应位置,并通过后面的规则模块决定能否下子,如果能下子就下己方棋子,并交换为对手走棋。单人模块单人模块是基于双人模块的,当玩家点击棋盘并成功走棋后,把交换对手部分,变为交换至电脑走棋,电脑则通过算法模块走出电脑认为最佳位置,并等待玩家继续走棋。因此,本黑白

38、棋开发过程中,把单人模块看成是双人模块的一部分来处理。规则模块走棋模块是黑白棋的基础,它负责判断哪些位置能走棋,并在成功走棋后,翻转所需棋子后,并再次负责判断出对方可走棋位置本模块包括翻转函数、以及判断可下子位置函数。悔棋和悔棋恢复模块本模块通过每次走棋记录棋谱,以便用户能够全局悔棋,并全局恢复,但是当悔棋过程中,用户再次走棋,则后继步数不能恢复。人机对弈模式下,只允许玩家悔当前的两步棋(计算机一步,玩家一步)。双人网络对弈模式下,悔棋的过程为:首先由玩家向对方发送悔棋请求(悔棋消息),然后由对方决定是否允许玩家悔棋,在玩家得到对方的响应消息(允许或者拒绝)之后,才进行悔棋与否的操作。这是应该

39、做到的,但实际编码中,没有开发网络对弈,因此双人悔棋无需确认,但每次只悔一步棋。算法模块算法模块是人机对战的关键,是AI函数的具体设计部分。考虑到黑白棋的实际情况,决定把算法分成三大部分:开局算法、中局算法和终局算法。开局算法首先通过棋谱库调用已有棋谱,如果棋谱库中没有该棋谱,则自动调用中局算法。开局算法由于采用棋谱库,程序执行较快。中局算法采用减枝和棋盘位置估值以及其他黑白棋常用估值方法,并给每种不同估值赋一权值,进行估值合并,选择出估值最高的位置,并在该处下棋。中局算法由于棋局中期可走位置较多,致使中局算法执行较慢。终局算法,终局算法是穷举某一步到棋局结束的所有可能走法,选出对自己最有利的

40、位置,并走棋。由于临近终局,最后位置较少,因此程序执行较快。第5章 程序实现通过第3章和第4章的描述,黑白棋设计思路已经确定,现在要做的就是把设计结果翻译成专用的程序设计语言所书写的程序。编码是对设计的进一步具体化,本部分的质量取决于前期设计的质量,但是,所选设计语言的特点及编码风格也会对程序的可靠性、可读性、可测试性和可维护性产生影响。5.1 界面实现为了增加游戏的美观,界面采用专业绘图工具制作出来的漂亮图片作为程序背景和棋盘背景。本程序利用FireWorks对网络上的一些图片做了修改,并作为程序背景使用。界面的显示,是把上述背景图作为资源文件,通过重载QT库自带的paintEvent(QP

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

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

43、licked(), Form, SLOT(initialize();pushButton_new为新游戏部件名称,本句话意思是点击新游戏按钮,程序执行初始化(initialize())函数。其他按钮已通过信号与槽机制和相关功能的函数连接起来,具体连接请参照附录一主要代码部分。本程序使用到的信号与槽,见图5-3所示。同时,图5-3也标识出了QTDesigner在本程序开发中所能发挥的全部作用。图5-3 QTDesigner完成的作用Designer不能显示白色的文本内容(见图5-3左下角数字2),但为了标示白棋的颜色,需要在代码部分借助QPalette类的setColor函数来改变本控件的文本颜

44、色,相关实现代码见附录一 主要代码部分。结合着相关函数介绍实现代码:本部分主要是把信号和槽进行部件之间的连接,这部分在Designer里面会自动生成。但是自定义的槽函数,要声明称public slots形式。对应图5-3,本程序用到的信号槽代码和功能如下:QObject:connect(pushButton_new, SIGNAL(clicked(), Form, SLOT(initialize(),点击开始按钮,程序初始化。QObject:connect(pushButton_backward, SIGNAL(clicked(), Form, SLOT(backward(),点击后退按钮,执

45、行后退相关函数。QObject:connect(pushButton_forward, SIGNAL(clicked(), Form, SLOT(forward(),点击前进按钮执行前进函数QObject:connect(checkBox_tip, SIGNAL(clicked(), Form, SLOT(update(),点击tip按钮,执行刷新函数,刷新过程中,根据该组件是否被选中,决定时候绘制提示点。QObject:connect(radio_single, SIGNAL(clicked(bool), checkBox_2, SLOT(setEnabled(bool),点击单人游戏按钮,

46、改变该组件状态为选中模式,从而决定在mousePressEvent(QMouseEvent *e)里面执行单人模式。QObject:connect(radio_double, SIGNAL(clicked(bool), checkBox_2, SLOT(setDisabled(bool) ,点击单人游戏按钮,改变该组件状态为选中模式,从而决定在mousePressEvent(QMouseEvent *e)里面执行双人模式。QObject:connect(radio_single, SIGNAL(clicked(bool), radioButton_lv1, SLOT(setEnabled(bo

47、ol),点击单人游戏按钮,如果该按钮被选中,则难度选择按钮为可更改状态,下面两个相同。QObject:connect(radio_single, SIGNAL(clicked(bool), radioButton_lv2, SLOT(setEnabled(bool)。QObject:connect(radio_single, SIGNAL(clicked(bool), radioButton_lv3, SLOT(setEnabled(bool)。QObject:connect(radio_double, SIGNAL(clicked(bool), radioButton_lv1, SLOT(s

48、etDisabled(bool) 点击双人游戏按钮,如果该按钮被选中,则难度选择按钮为不可更改状态,下面两个相同。QObject:connect(radio_double, SIGNAL(clicked(bool), radioButton_lv2, SLOT(setDisabled(bool)。QObject:connect(radio_double, SIGNAL(clicked(bool), radioButton_lv3, SLOT(setDisabled(bool)。QObject:connect(checkBox_2, SIGNAL(clicked(), Form, SLOT(up

49、date(),该处选中,执行动画效果。QObject:connect(radio_single, SIGNAL(clicked(), Form, SLOT(doubletosingle(),该处选中,执行双人到单人模式切换函数doubletosingle(),判断如果该电脑走棋,则电脑走一步棋。5.3 程序主要函数从程序表面看,这是一个二维平面图,所以数据用二维数组类来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格上的状态,共有五种情况,分别是0代表可下子格,1代表黑棋,-1代表黑棋,-2代表绝对不能下的位置,2代表需要判断才知道能否下的位置。程序首次打开,执行initializ

50、e()函数初始化棋局,用户可以直接走棋或者选择单人模式等一些功能,当用户点击棋盘某一位置时,响应mousePressEvent(QMouseEvent *e)函数,判断鼠标点击位置,如果能下棋则执行onestep(int x,int y)函数在该方格内走一步棋。并交由对方(可能是另一名玩家,或者电脑走棋。)mousePressEvent(QMouseEvent *e)函数的执行过程如下:首先通过点击鼠标位置获取点击坐标,并判断该处是否能下子,不能下子退出该函数。该位置能下子,执行onestep(judgepos(x),judgepos(y)走一步棋。玩家走一步棋之后,如果是单人模式执行,则交由

51、电脑走棋。电脑走棋首先进行难度判断,并结合着棋局步数判断,选择不同的函数进行搜索,搜索结束,电脑执行onestep(judgepos(x),judgepos(y)走一步棋,退出该函数。 在调用onestep(int x,int y)函数时,程序首先通过mousePressEvent(QMouseEvent *e)函数获得的(x,y)坐标,在棋盘(x,y)位置放置一枚该方棋子,然后检测周围能翻转的棋子并翻转(reverse(int x,int y,int whom))、之后判断出对方可走棋位置(canbedrop(int x,int y,int whom)),并交由对方走棋。reverse(in

52、t 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-k.state = -2 |weizhixy-k.state = 2) break; if (weizhixy-k.state = whom) for (int i = 1; ik;i+) weizhixy-i.state = whom;

53、 break; 而判断可下子位置函数canbedrop(int x,int y,int whom)的思路和翻转函数类似,也是进行8方向的判断。为了使判断可走棋位置的循环减少,在此增加了一个cube(int x,int y)函数的处理,黑白棋只能在有子位置的相邻位置才可能放置棋子,开局时棋子周围的8个相邻格子为cube状态(2),然后每走一步棋,把该步棋周围的8个子,和之前标记为2和0的位置,全部标记为2,然后进行canbedrop(int x,int y,int whom)搜索时,就只需要在标记为2的格子内进行8方向判断,并把该处位置标记为0,等待对方下棋。走棋行进过程中,可随时通过点击棋盘上

54、方的功能控制菜单,进行悔棋(backward())、悔棋回复(forward())、单人双人模式切换(doubletosingle())、难度选择、显示提示位置等功能。悔棋和悔棋回复函数,实质上建立一个数组,记录每步棋全盘棋子的各个位置的状态值,并进行悔棋和恢复。每走一步棋,自动调用绘图函数(paintEvent(QPaintEvent *e))进行界面重绘。如果是单人模式,前面的mousePressEvent(QMouseEvent *e)有介绍,玩家走完会判断,如果轮到电脑走棋,则执行响应的AI算法,选择最佳走棋位置,并在该处走一步棋,交由玩家继续走棋。AI算法分为startserch()

55、,负责开局1-10步,middleserch()负责11-50步,50步以后直至终局由endserch()负责。startserch()函数主要通过对程序中搜集的棋谱进行比较,如果有该开局模式,则按棋谱走棋,没有则自动调用middleserch()的方法进行搜索。在这些算法中还会用到如下一些子函数:count(int x)统计标记为x的一方棋子个数;middlemain(int x)中期搜索函数的主要搜索过程;endmain()终局搜索函数的主要搜索过程;valuemiddle()中期搜索的综合估值函数;mobility()行动力函数;danger()危险位置函数。实际游戏开发中,高质量的AI程序,都会再加有一些其他子函数来更好的实现AI算法,在我的程序中,缺少这些高级算法。游戏结束时,直观显示双方棋子个数,由于黑白棋是靠子数多少决定胜负,因此为了美观我没有加入对话框提示输赢。此时可以点击新游戏重新开局,或选择退出。5.4 电脑战术分析在这一节中将介绍计算机是如何对棋盘进行分析,然后选择一个合理的位置进行下棋的。5.4.1 棋盘扫描想要计算机能够与人对弈黑白棋,对棋盘的扫描是最基本的操作。前面已经介绍了通过cube(int x,int y)和canbedrop(int x,int y,int who

温馨提示

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

评论

0/150

提交评论