基于qt的黑白棋游戏开发(论文)第四稿_第1页
基于qt的黑白棋游戏开发(论文)第四稿_第2页
基于qt的黑白棋游戏开发(论文)第四稿_第3页
基于qt的黑白棋游戏开发(论文)第四稿_第4页
基于qt的黑白棋游戏开发(论文)第四稿_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

学号:2008840217本 科 毕 业 论 文(设 计)基于QT的黑白棋游戏程序设计与实现作者姓名指导教师所学专业计算机科学与技术班级所属院系信息学院学习年限2008年9月至2012年7月二一二年六月目 录1 引言11.1 系统开发背景11.2 黑白棋简介21.2.1 黑白棋游戏规则21.2.2 黑白棋游戏简介21.3 相关实现环境31.3.1 开发环境31.3.2 运行环境31.4 主要研究内容31.5 系统开发的现实意义32 开发工具Qt421 QT简介422信号与槽43. 黑白棋需求分析731 黑白棋程序界面的需求73. 2黑白棋游戏规则的需求7第4章 黑白棋总体设计84.1 程序流程图84.2 主要模块简介85. 程序实现105.1 界面实现105.2 功能按钮的实现115.3主要函数125.4 电脑战术分析145.4.1 棋盘扫描145.4.2判断行动力145.4.3选择最佳位置落子156.系统测试166.1双人模式下的测试166.1.1 悔棋和悔棋恢复测试166.1.2 PASS情况下的悔棋恢复166.2 单人模式下的测试166.2.1 PASS情况的测试166.2.2 游戏正常测试176.2.3 悔棋测试176.3 综合测试报告177. 总结和展望187.1 总结187.2展望18致谢19参考文献20Othello game based on the Qt development21基于Qt的黑白棋游戏开发 学生姓名: 指导教师: 内容提要 本程序使用的是面向对象的QT库的C+语言开发,可以同时运行于Linux和Windows环境下的游戏程序。有双人对弈,人机对弈,无限悔棋等功能,其中人机对弈包含难度选择和先后手选择。本论文首先指出了黑白棋游戏、Linux桌面环境、QT开发环境的发展现状,然后重点介绍了QT开发工具的使用、黑白棋的常见战术、黑白棋程序的界面设计、规则设计、算法设计(包含搜索算法、局面估值、-减枝、散列表、MTD等当今主流算法)、终局搜索、以及作为一款游戏的其他必须功能,最后介绍了Linux桌面环境 GUI的发展趋势。 本设计通过一个棋类游戏的开发,阐述了棋类游戏的开发过程,包括软件开发的逻辑分析,程序设计,软件实现和软件测试几个步骤。关键词 黑白棋 Linux 人工智能 QTI山西大学商务学院本科毕业论文(设计)1 引言本章概述了黑白棋游戏开发,对黑白棋的基本知识和相关开发环境做了一个简介1.1 系统开发背景随着网络技术的日新月异和计算机的普及,当今的计算机技术也走上了平民化和娱乐化的时代,计算机技术再也不是只能由少数人掌握的深不可测的学问;同时个人计算机也由原来单纯的数值计算和工业应用逐渐转变成像电视机一样的家庭娱乐中心,伴随着这种巨大的转变计算机软件的发展也走向了娱乐化。 尤其是游戏产业的发展已经成为信息产业中发展势头最猛烈最具前景的一个分支,而游戏厅也渐渐被网吧挤出了正常的营业市场,游戏除了单纯的个人娱乐功能之外,也逐渐向互动的方向发展。游戏的功能不断按照玩家的需求和爱好扩展延伸进化,如今运行在各种平台上不同名称,不同内容,不同形式的游戏不仅仅为广大游戏爱好者提供了丰富的选择,而且为游戏开发商带来了丰厚的回报,游戏产业吸引着许多程序员去开发更多更新的游戏。 基于游戏发展的历史和前景,我决定用C+语言开发一款小游戏,游戏内容来自网络上日渐流行的一种智力游戏黑白棋。我希望把平时界面简单、选项复杂的游戏,在Linux里面做成漂亮的、简单的游戏程序,以给Linux玩家一个新的选择。随着计算机处理速度的飞速提高,人们很早就提出了疑问:计算机是否会超越人类?世界国际象棋棋王卡斯帕罗夫与美国IBM公司的RS6000(深蓝)计算机系统于1997年5月11日进行了六局“人机大战”,结果“深蓝”以3.5比2.5的总比分获胜。比赛结束了给人们留下了深刻的思考;下棋要获胜要求选手要有很强的思维能力、记忆能力、丰富的下棋经验,还得及时做出反应,迅速进行有效的处理,否则一着出错满盘皆输,这显然是个“智能”问题。尽管开发“深蓝”计算机的IBM专家也认为它离智能计算机还相差甚远,但它以高速的并行的计算能力(20108步秒棋的计算速度)。实现了人类智力的计算机上的部分模拟。那么计算机已经超过了人类吗?本文着重介绍了黑白棋的设计与开发,让您对计算机棋手的智能有更深入的了解。511.2 黑白棋简介黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋。黑白棋起源中世纪的英国,18世纪传入日本,并在日本得到了发展。现在,黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。它的游戏规则简单,因此上手很容易,但是它的变化又非常复杂。有一种说法是:只需要几分钟学会它,却需要一生的时间去精通它。 黑白棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。黑白棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。1.2.1 黑白棋游戏规则(1)两人对弈,以轮流方式持黑子与白子。(2)开辟新局者持白子,加入者持黑子, 之后以轮流方式将棋子置于棋盘格子中。若无地方可下子,则跳过一回,由对方下子。(3)在提示的格子中,选择一个格子下子, 当下子的位置与离最近的同色旗子中, 若有其他棋子则中间的棋子变为与我方一样颜色。(4)当下满64个棋子,棋子多者为胜。1.2.2 黑白棋游戏简介黑白棋规则规定对局结束时子多的一方为胜方,于是初学者通常会一开始使劲吃子,这实际上是犯了短视的错误。每一步都尽可能吃更多的子,我们把这种下法叫做大食策略(MAXIMUM DISC STRATEGY)。除了大食策略以外,还有其它几种常用的策略以及重要位置和术语,它们是:稳定子 - 位置策略(STABLE DISCS - POSITIONAL STRATEGY)楔入(WEDGES)行动力策略(MOBILITY)余裕手(TEMPO,WAITING MOVES)爬边(CREEPING ALONG EDGES) 奇偶性(PARITY) 非平衡边(UNBALANCED EDGES)四通陷阱(STONER 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 XPPentium(R) Dual-Core CPU 250G硬盘1.4 主要研究内容本文将对计算机棋手下黑白棋做一个全面综述,介绍计算机对黑白棋战术分析的全过程,包括对图形和动画的处理、对棋盘搜索的算法、对棋局做出正确的估计、并生成最佳走法,并将介绍其中各个流程的研究状况及实用技术。本文的重点放在计算机对当前棋局的分析,并做出最佳的选择。介绍搜索算法,棋类游戏不可能一步就决出胜负,象棋中不可能第一步就将对方将死;而对某个棋局的判断也不可能完全精确,在黑白棋中,初局时棋子多并不一定最终取得胜利,因为对手可能在后面的博弈过程中将局面扭转。想想人类下棋时,一般会假设我走这步,那么对手会怎,样回应,如果对手回应了某一步,我再走哪一步,如果对手回应了另外某一步,我又该怎么走;然后再假设我走另外的某一步,如此反复下去。这个过程叫做搜索。1.5 系统开发的现实意义利用这次毕业设计的机会可以熟悉C+语言的各种特性,锻炼程序设计的实践能力,熟悉c+语言Linux下的开发环境,熟悉前沿的Linux图形用户界面的开发,以及巩固数据结构和算法等课程的学习成果,并深入理解数据结构和算法在程序设计中的核心地位。 同时,借助开发本游戏的过程,可以熟悉人工智能的程序实现,有助于掌握棋类所需人工智能的常见算法,随着游戏产业的日益壮大,人工智能在游戏中的突出表现,人工智能越来越得到世人的重视。在这次的人机对战算法中,通过一定的算法,实现电脑的下棋及走棋运作,加深了对人工智能工作原理的了解。 综上所述,通过每次黑白棋的开发,可以深入了解Linux编程方法、加深了解算法。2 开发工具Qt21 QT简介Qt是一个跨平台的C+图形用户界面库,由挪威TrollTech公司出品,目前包括Qt, 基于Framebuffer的Qt Embedded,快速开发工具Qt Designer,国际化工具 Qt Linguist等部分Qt支持所有Unix系统,当然也包括 Linux,还支持 WinNT/Win2k,Win95/98 平台。1 Qt是一个多平台的C+图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。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-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 类。甚至还包括正则表达式的处理功能。支持2D/3D图形渲染,支持OpenGL。22信号与槽QT不同于其他开发工具的一个重要特点,就是信号与槽。信号和槽用于对象间的通讯。信号/槽机制是Qt的一个中心特征并且也许是Qt与其它工具包的最不相同的部分。 在图形用户界面编程中,我们经常希望一个窗口部件的一个变化被通知给另一个窗口部件。更一般地,我们希望任何一类的对象可以和其它对象进行通讯。例如,如果我们正在解析一个XML文件,当我们遇到一个新的标签时,我们也许希望通知列表视图我们正在用来表达XML文件的结构。图 2-1 一个关于一些信号和槽连接的摘要图 在Qt中我们有一种可以替代回调的技术。我们使用信号和槽。当一个特定事件发生的时候,一个信号被发射。Qt的窗口部件有很多预定义的信号,但是我们总是可以通过继承来加入我们自己的信号。槽就是一个可以被调用处理特定信号的函数。Qt的窗口部件又很多预定义的槽,但是通常的习惯是你可以加入自己的槽,这样你就可以处理你所感兴趣的信号。 信号和槽的机制是类型安全的:一个信号的签名必须与它的接收槽的签名相匹配。(实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的签名。)因为签名是一致的,编译器就可以帮助我们检测类型不匹配。信号和槽是宽松地联系在一起的:一个发射信号的类不用知道也不用注意哪个槽要接收这个信号。Qt的信号和槽的机制可以保证如果你把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。信号和槽可以使用任何数量、任何类型的参数。它们是完全类型安全的:不会再有回调核心转储(core dump)。 图 2-2 一个信号和槽连接的例子 信号与槽机制是一个函数,原型如下:QObject:connect( &a, SIGNAL(funtionA(), &b, SLOT(funtionB() ) 这一行在两个Qt对象(直接或间接继承QObject对象的对象)中建立了一种单向的连接。每一个Qt对象都有signals(发送消息)和slots(接收消息)。所有窗口部件都是Qt对象。它们继承QWidget,而QWidget继承QObject。该函数意思是a部件发出 funtionA()消息,b部件执行funtionB()函数。3. 黑白棋需求分析为了开发出真正满足用户需求的程序,尤其是游戏程序,首先必须知道用户的需求。把用户需求作为前提条件,来指导程序的开发31 黑白棋程序界面的需求通过上述网上常见的一些具有代表性的黑白棋程序的对比分析,现在一个基于界面上的用户需求已经基本确立。该需求包含以下几点:1. 作为按钮出现在主界面上的:先后手选择、单人双人模式、悔棋和悔棋恢复、难度选择、开始新游戏。2. 能够直观显示在游戏界面上的:棋子数目显示、显示上步棋位置、提示下棋点、动画翻转棋子。 3. 2黑白棋游戏规则的需求第二章中已经介绍了黑白棋游戏的规则,主要有如下规则:1两人对弈,以轮流方式持黑子与白子。2开辟新局者持黑子,加入者持白子, 之后以轮流方式将棋子置于棋盘格子中。若无地方可下子,则跳过一回,由对方下子。3在提示的格子中,选择一个格子下子, 当下子的位置与离最近的同色旗子中, 若有其他棋子则中间的棋子变为与我方一样颜色。4当下满64个棋子,棋子多者为胜。5双方都无棋可走的其他局面,游戏结束,以子多者为胜。黑白棋游戏规则,是程序设计是需要考虑的内部需求,该部分需求,和前面的游戏界面需求,以及下小节的其他需求,功能构成了黑白棋程序的基本需求。 第4章 黑白棋总体设计本模块建立在第3章需求分析基础之上,把用户的需求转换为程序的蓝图,作为后面编码过程中的依据。4.1 程序流程图程序所需执行的流程见图4-1,该图表示出了程序执行的流程,也基本表示出了程序的各个模块和相互关系,后面的详细设计和代码实现,就是基于本图设计的。 图4-1 黑白棋流程图4.2 主要模块简介为了实现黑白棋游戏的开发,通过流程图的分析,计划采用以下几大模块:绘图模块 本模块用来负责主界面的绘制,包括棋盘、棋子、个数统计、时间显示、以及其它需要显示的部分的绘图。绘图模块的实现,主要通过重载QT库中自带的绘图函数来实现。初始化模块 初始化模块是一个函数,用来负责开局时的棋盘初始化,主要负责把程序代码中各变量值初始化。初始化函数再程序首次执行时自动调用,中途通过点击新游戏按键调用。双人模块 双人模块是本程序得以运行的基础,本模块通过判断用户鼠标点击位置,判断出该坐标所处棋盘中响应位置,并通过后面的规则模块决定能否下子,如果能下子就下己方棋子,并交换为对手走棋。单人模块 单人模块是基于双人模块的,当玩家点击棋盘并成功走棋后,把交换对手部分,变为交换至电脑走棋,电脑则通过算法模块走出电脑认为最佳位置,并等待玩家继续走棋。因此,本黑白棋开发过程中,把单人模块看成是双人模块的一部分来处理。规则模块 走棋模块是黑白棋的基础,它负责判断哪些位置能走棋,并在成功走棋后,翻转所需棋子后,并再次负责判断出对方可走棋位置。 本模块包括翻转函数、以及判断可下子位置函数。悔棋和悔棋恢复模块 本模块通过每次走棋记录棋谱,以便用户能够全局悔棋,并全局恢复,但是当悔棋过程中,用户再次走棋,则后继步数不能恢复。 5. 程序实现通过第3章和第4章的描述,黑白棋设计思路已经确定,现在要做的就是把设计结果翻译成专用的程序设计语言所书写的程序。编码是对设计的进一步具体化,本部分的质量取决于前期设计的质量,但是,所选设计语言的特点及编码风格也会对程序的可靠性、可读性、可测试性和可维护性产生影响。5.1 界面实现为了增加游戏的美观,界面采用专业绘图工具制作出来的漂亮图片作为程序背景和棋盘背景。本程序利用FireWorks对网络上的一些图片做了修改,并作为程序背景使用。界面的显示,是把上述背景图作为资源文件,通过重载QT库自带的paintEvent(QPaintEvent *e)函数,来绘制背景棋盘。 叶子状的是程序背景,红色底纹的是棋盘背景。之所以不作为一个图片保存背景,是为了便于以后棋盘改变布局位置。 在左边有总用时和本步用时两个小模块,这是用QTDesigner自带的控件绘制的,计划用于上方走棋时间统计。 为了使这两个小模块好看些,也加上了背景,同时背景的上半部分,用来标示黑白双方,以及显示双方当前局面棋子个数,并用高亮方式,表示出当前该哪一方走棋。背景界面设计好了,再加上常用功能键、其它选择按钮等,一个程序打开的初始界面就确定了,见图5-1图5-1 黑白棋主界面 重载QT库自带的paintEvent(QPaintEvent *e)函数的方法如下,首先定义用来统计黑白两色棋子个数,初始值为0,接着生成绘图对象,并加载需要绘制的各个元素,然后并绘制出来,以及绘制其他相关元素。5.2 功能按钮的实现用QT开发GUI程序,不如MFC容易,但只要掌握了QT的方法,还是很轻松的。如图5-1的上方部分的按钮,可以用QTDesigner里面的控件直接绘制出来。 然而这是显性的绘制,点击该按钮并不能直接执行相应的函数。而是通过信号与槽机制响应相关函数。信号与槽的机制在2.3节中有介绍。再次我们要给新游戏按钮与初始化函数建立联系,即:QObject:connect(pushButton_new, SIGNAL(clicked(), Form, SLOT(initialize();pushButton_new为新游戏部件名称,本句话意思是点击新游戏按钮,程序执行初始化(initialize())函数。 其他按钮已通过信号与槽机制和相关功能的函数连接起来,具体连接请参照附录一主要代码部分。本程序使用到的信号与槽。结合着相关函数介绍实现代码: 本部分主要是把信号和槽进行部件之间的连接,这部分在Designer里面会自动生成。但是自定义的槽函数,要声明称public slots形式。本程序用到的信号槽代码和功能如下: QObject:connect(pushButton_new, SIGNAL(clicked(), 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按钮,执行刷新函数,刷新过程中,根据该组件是否被选中,决定时候绘制提示点。 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) ,点击单人游戏按钮,改变该组件状态为选中模式,从而决定在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(clicked(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_double, 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主要函数从程序看,这是一个二维平面图,所以数据用二维数组类来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格上的状态,共有五种情况,分别是0代表可下子格,1代表黑棋,-1代表黑棋,-2代表绝对不能下的位置,2代表需要判断才知道能否下的位置。 程序首次打开,执行initialize()函数初始化棋局,用户可以直接走棋或者选择单人模式等一些功能,当用户点击棋盘某一位置时,响应mousePressEvent(QMouseEvent *e)函数,判断鼠标点击位置,如果能下棋则执行onestep(int x,int y)函数在该方格内走一步棋。并交由对方(可能是另一名玩家,或者电脑走棋。) mousePressEvent(QMouseEvent *e)函数的执行过程如下:首先通过点击鼠标位置获取点击坐标,并判断该处是否能下子,不能下子退出该函数。该位置能下子,执行onestep(judgepos(x),judgepos(y)走一步棋。玩家走一步棋之后,如果是单人模式执行,则交由电脑走棋。电脑走棋首先进行难度判断,并结合着棋局步数判断,选择不同的函数进行搜索,搜索结束,电脑执行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(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-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),然后每走一步棋,把该步棋周围的8个子,和之前标记为2和0的位置,全部标记为2,然后进行canbedrop(int x,int y,int whom)搜索时,就只需要在标记为2的格子内进行8方向判断,并把该处位置标记为0,等待对方下棋。 走棋行进过程中,可随时通过点击棋盘上方的功能控制菜单,进行悔棋(backward())、悔棋回复(forward())、单人双人模式切换(doubletosingle())、难度选择、显示提示位置等功能。悔棋和悔棋回复函数,实质上建立一个数组,记录每步棋全盘棋子的各个位置的状态值,并进行悔棋和恢复。 每走一步棋,自动调用绘图函数(paintEvent(QPaintEvent *e))进行界面重绘。如果是单人模式,前面的mousePressEvent(QMouseEvent *e)有介绍,玩家走完会判断,如果轮到电脑走棋,则执行响应的AI算法,选择最佳走棋位置,并在该处走一步棋,交由玩家继续走棋。AI算法分为startserch(),负责开局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 whom)进行扫描的方法,对棋盘的扫描工作就比较简单了,这里就不再累述。5.4.2判断行动力在前面的章节分析中已经提到,黑白棋的正确战术应该是尽量削弱对手的行动力,让对手全无好棋可下,同时增加自己的行动力。那么如何能让计算机懂得这个道理呢?这就要求计算机具有“思考”的能力。首先计算机调用检测行动力的函数mobility(),检测自己的行动力,也就是将当前棋盘所有能落子的位置找出来,然后在对这些位置逐步进行分析。分析的过程就是先假设计算机在某个位置上落子,然后马上再次调用检测行动力函数,不过这次是检测对手的行动力。意思就是如果计算机在这里落子,看看对手的行动力如何,如果对手的行动力太大,对手有很多位置可以选择,那么就不应该在这里落子。如此对所有能落子的位置进行检测,找出一个能让对手行动力变得最小的位置落子,该函数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 move;5.4.3选择最佳位置落子使用了一些战术,使计算机能够了解当前棋局的情况,最终的目的让计算机能够选择一个合理的位置落子。在本程序里在棋局的不同时期,所采用的选择方法也是不同的,在程序开局时,优先选择棋谱库中的固定套路。 而在中期时则以多种估值通过赋予权值,统计出综合估值,选取最大估值位置落棋。到了后期,局面已经完全可以穷举,采用最大食子法,以能吃掉对手最多棋子为准。 6.系统测试系统测试的目的主要在于发现错误,找出软件的缺陷和隐患,是确保软件质量的重要方法。在完成黑白棋游戏之后,分别对游戏中各个进行了测试,主要是检验该游戏在各种情况下中的功能能否实现,是否满足黑白棋游戏规则的走棋,从而验证该系统确实符合预订的需求, 软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码的最终复查,是软件质量保证的关键步骤。早在1973年, W.Hetael曾经指出,测试是对程序或系统能否完成特定任务建立信心的过程。 系统在开发过程中采用了多种措施保证软件质量,但是实际开发过程中还是不可避免地会产生差错。系统中通常可能隐藏着错误和缺陷,若将未经周密测试的系统投入运行,将会造成难以想象的后果。因此系统测试是管理系统开发过程中为保证软件质量必须进行的工作。大量统计资料表明,系统测试的工作量往往占管理系统开发总工作量的40%以上。因此必须重视测试工作。6.1双人模式下的测试双人模式是游戏进行的基础,因此此部分的测试较多,且具有代表性。6.1.1 悔棋和悔棋恢复测试正常情况下,黑白棋双人模式中悔棋可以悔棋至初始棋局,并能恢复至玩家最后一次落子的棋局。在悔棋中途,如果玩家改变落子,则只能恢复至该处,不能也不应该继续回复原本没有恢复的棋步。6.1.2 PASS情况下的悔棋恢复PASS情况下的悔棋恢复,就要先设计出一个有pass情况的棋局出来,然后选择悔棋,看是否正常悔棋。6.2 单人模式下的测试单人模式是双人模式的一个特殊情况,因此有些测试和双人模式相同,不用反复测试,只需测试对方走棋是否符合规则就行。 备注,单人模式测试由于是电脑配合走棋,因此某些环境不容易还原,在程序开发中进行过测试,并将测试结果统计如下,在此就另外不附图说明。6.2.1 PASS情况的测试由于单人模式需要进行思考,所以中途可能会造成遇到PASS情况,致使该步走棋方发生错误,比如本来该白棋走的结果却是黑棋走。经过测试,测试失败。 查找原因,每次电脑思考都是固定套用每次落子切换走棋方的方法,致使一方PASS,本不该切换走棋方的,仍然切换的错误情况,后经改进为每步棋由哪方走棋的数组记录,错误得以解决。6.2.2 游戏正常测试本测试,测试电脑AI是否能选择正确位置走棋,结果发现在某些未知情况下,电脑会在本不能下子处下子。 测试失败。 查找原因,暂时为查明,但该BUG位于AI算法函数中,这点是确定的,因此程序AI算法部分,有待改进。6.2.3 悔棋测试由于单人模式每次需要同时悔棋两步,因此也要单独测试,经过测试,符合要求,测试成功!6.3 综合测试报告从以上的测试方法和测试结果可以看出,该游戏的在双人模式下能完全正确的运行,与当初的预想一致。基本上实现了需求分析和系统设计中所提到的所有功能(计时功能暂未开发)。单人模式下存在一处bug,但影响到程序的可执行性,应该得到修正。7. 总结和展望7.1 总结本程序能以友好的界面运行于Windows系统、Linux系统的两大桌面环境(Gnome和KDE)、以及Mac系统(Mac系统未经测试,官方声明说可以)。本程序可以实现双人对战、人机对战、全局棋盘悔棋等黑白棋功能,界面友好。 虽然作为毕业设计的部分本设计已经接近尾声,但作为我的一个程序它仅仅是一个开始,本程序如果作为一个可发行版,还有以下几部分需要完善:1. 加入计时功能 2.增加先后手选择 3.完善AI算法。 对于计时功能和先后手选择,很容易实现。但考虑到实际应用中这两个也不是黑白棋必须的功能,就把时间主要放在了AI的开发,而没有完善这个细节。我们专业并未开设过与人工智能相关的课程,但由于我对此感兴趣,在论文选题时毅然选择了这个挑战非常大的关于人工智能的题目,由于我自学能力和时间有限,现在的黑白棋AI部分还处于初级阶段,但我会坚持不懈的努力,将黑白棋程序不断完善。7.2展望计算机下棋是近年来人工智能领域的一个研究热点,许多新的技术层出不穷,世界级的棋类大师被计算机打败的例子屡见不鲜,随着人工智能在计算机中的广泛应用,人们对计算机的棋力提出了更高的要求。 人工智能下棋技术经过十余年的发展,取得了很多非常优秀的研究成果。但无论是什么样的算法,计算机运算的速度都是一个不可回避的问题,深蓝虽然战胜了世界国际象棋棋王卡斯帕罗夫,为了提高深蓝的下棋速度,所耗费的资源也是非常大的。那么提高算法的精确度,避免无谓的搜索是计算机下棋技术下一个需要解决的问题。 就像第一章提到的那样,人工智能技术在不断的发展、不断前进,那么是否会有一天计算机的智慧超越人类?那时人类会处于怎样的地位?会像电影里演的那样电脑控制了地球,而人类成为奴隶吗?这一切都不得而知,答案就由未来几十年的计算机工程师来揭开。致谢必须感谢老师对我学习的支持,精神的支持。没有他们的汗水,我是无法完成本科的学业的。感谢我的指导老师:张、刘老师。刘老师严谨求实、谦逊和蔼、平易近人、处处为学生着想,令我敬佩。如果没老师们的悉心指导也不会写出本程序,更不会学到Linux的编程和相关知识。我所取得的每一点进步都包含了张老师的心血。 感谢四年来教我知识的其他老师,在即将完成学业的时刻,我向所有教过我的老师表示衷心的感谢和崇高的敬意。 感谢同组的同学,虽然我们的毕业设计是彼此独立开发,但在毕业设计期间,经常和他一起讨论,相处的很融洽。 感谢所有帮助过我的其他人。四年的本科求学生涯使我完成了学士论文课题的研究工作和本文的撰写工作,在这段期间得到了很多人的关怀和帮助,没有他们的关怀和帮助很难想象能顺利完成学业。感谢互联网上的前辈们,为我树立了榜样,同时留下了可供我参考的宝贵的资料和程序。 最后,再次对关心、帮助我的老师和同学表示衷心地感谢。 由于我的水平有限,论文难免出现差错和遗漏,敬请老师批评指正。参考文献1 George F.Luger Artificial Intelligence: Structures and Strategies for Complex Problem Solving Addison WesleyM.2001-7. 2 Qt3.0.5版官方教程.Qt参考文档S.2002 3 Mat Buckland.Ai Techniques For Game ProgrammingM.Premier Press.2002. 4 张海藩.软件工程导论(第四版)M. 北京:清华大学出版社 2003-12. 5 张宏林.数字图像分析与处理技术M.北京:人民邮电出版社 2003-2. 6 棋类游戏的智能模块设计浅谈人工智能J.2004-09. 7 蔡自兴,徐光祐.人工智能及其应用(第三版)M.北京:清华大学出版社.2003-9. 8 杜秀全,程家兴.博弈算法在黑白棋中的应用J.2003. 9 王小春.PC游戏编程(人机博弈)M. 重庆大学出版社.2002.6. 10 赖泳伶,张孝凡.黑白棋自我学习的改进策略J.2004.6. 11 于明俭./developerworks/cn/linux/guitoolkit/qt/.Othello game based on the Qt developmentAbstract:This program uses the QT library of object-oriented C+ language, which can run games under Linux and Windows environments. A double game, the man-machine chess, unlimited undo function, which man-machine chess include the difficulty of selection. This paper first points out the game of Othello, the Linux desktop environment, the development status of the QT development environment, and then focuses on the QT development tools, the use of the common tactics of Othello, Othello program interface design rules, design, algorithm design (including search algorithm, the situation valuation, alpha-beta cut branches, hash table, MTD, the current mainstream algorithms), shall be final and search, as well as other essential functions of the game, and finally introduces the development trends of the Linux desktop environment GUI. The design through the development of a chess game on a chess game development process, including the logic of the software development, programming, software implementation and software testing several steps. Keywords:Othello; Linux; artificial intelligence; QT附件:大学本科生毕业论文(设计)规范一、毕业论文(设计)格式规范一份完整的毕业论文(设计)材料一般应包括下列内容:(一)题目;(二)目录;(三)论文主体(包括中英文摘要及关键词;正文;致谢;参考文献等);(四)附录。具体分述如下: (一)题目题目应力求简短、精确、有概括性,直接反映毕业论文(设计)的中心内容和学科特点。题目一般不超过20个汉字,如确有必要,可用副标题作补充。(二)目录

温馨提示

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

评论

0/150

提交评论