五子棋人工智能课题毕业论文 下载本文

问题定义的一个的关键问题是“要解决的问题是什么”,这个是这个阶段必须要明确要回答的问题。在没将问题定义好,试图准备下个阶段的任务。这明显是不成熟,甚至不可能的事。

选择操作

调用

图2.1 系统模型

本次系统设计中首先明确了需要解决的问题是五子棋AI算法和网络通信的

研究,基本的要求是设计一款能够实现网络和单机对战的五子棋游戏,提供一些基本的操作如退出系统,向后悔棋等操作,重点是放在AI算法和网络通信的研究。而并不是美工设计,也不是为了提供各种操作丰富的接口。主要是通过这种可视化的界面探讨AI,当然增加可玩性和美工会给系统润色不少。

上面只是很粗略的明确大概的方向,严格按照软件工程的方法这个阶段需要生产一份书面报告。需要通过对系统的实际用户访问调查,扼要地写出他对问题的理解,并在用户和使用部门负责人的会议上认真讨论这份书面报告,澄清含糊不精的地方,改正理解不正确的地方,最后得出一份双方都满意的文档。本系统的需求很少也很明显了。

2.2.2可行性研究

这个阶段要回答的关键问题:“对于上一个阶段所确定的问题是否可行?”为

了回答这个问题,我们需要进行一次大大压缩和简化了的系统分析和设计的过程,也就是在较抽象的高层次上进行的分析和设计的过程。

可行性研究应该比较简短,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。

可行性研究应该比较简短,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。可行性研究以后的那些阶段将需要投入要多的人力物力。及时中止不值得投资的工程项目,可以避免更大的浪费。

根据这些基本的概念,我在技术上主要是通过相关文档资料的查找后确定可行性,凭着大学期间打下厚实的专业科基础,特别是数据结构和算法,能够在这段时间内理解通透并应该有所改进,后来证明是对的。利用剩下时间也应该来说也比较充裕的。经济上暂不考虑。 下面主要从技术上进行分析:

工具: VC++是一款经久不衰的开发工具,它代表了基于Windows的C++语言产品,完美地集成了传统的编程工具,也集成了Windows中特殊的工具箱,如MFC(Microsoft Foundation Classes)和Windows资源编辑器(App Studio)。另外还加入了几种新工具,如轮廓应用程序生成器(App Wizard)、C++类管理器(Class Wizard)和类浏览器(Class Browser),以及各种各样为开发Microsoft Windows下的CC++程序而设计的工具,MFC类库为我们提供了丰富的类资源。所以VC++是最好的选择。

本程序将采用VC++的单文档的视图框架,这样可以简化程序的开发。网络通信方面将从MFC封装socket的类CSocket实现点对点通信。

算法: 在这图论搜索技术这方面,前人已有很成熟的算法。如粗糙的有深度优先算法(DFS)和广度优先算法(BFS)这两个基本的算法,关键需要解决的是

6 能够设计出一种高效的剪枝函数,减小搜索问题的规模。目前博弈类游戏中的人工智能基本都采用极大极小值方法这对我来说是个挑战,而剪枝的则采用Alpha-Beta,通过丰富的文档资料初步了解到这些技术已经很成熟了。我有信心能解决好这个问题。

Socket:联机对战中的数据传输量很少,利用Socket编程是在好不过了,而且在这方面的掌握程度不存在有问题。

所以通过对以上关键问题的分析,可以很明确了该系统的可行性。这个阶段的任务告一段落了。可以着手下一个阶段的任务了。软件工程很强调文档驱动开发过程,只有完成了上个阶段的工作后,才能开始下一步骤,这是传统的瀑布开发方法。当然不同的开发模型,过程也会有所区别,大体上都遵循软件工程的这个步骤。这个阶段应该要产生一份《可行性分析报告》。

2.2.3 需求分析

这个阶段的任务仍然不是具体地解决问题,而是准确地确定“为了解决这个问

题,目标系统需要做什么”,主要是确定目标系统必须具备哪些功能。

用户了解他们所面对的问题,知道必须做什么,但是通常不能完整准确地表达出他们的要求,更不知道怎样利用计算机解决他们的问题;软件开发人员知道怎样使用软件实现人们的要求,但是对特定用户的具体要求并不完全清楚。因此在需求分析阶段必须和用户密切配合,充分交流信息,以得出经过用户确认的系统逻辑模型。通常用数据流图、数据字典和简要的算法描述表示系统的逻辑模型。

在设计本系统时考虑到用户需要的是一个操作简便界面简单的游戏软件。同时要提供人机和人人这样的功能。特别是人机部分,要考虑到不同级别的用户。电脑智能不能太低需要有一定的智能下棋功能。 本系统用提供平常下棋的一些步骤操作。

网络联机:提供向服务器一方发出连接请求的操作,并从弹出的对话框中设置IP和端口号;服务器提供监听的操作同样在弹出的对话框中设置端口号。任何一方需要悔棋请求,则必须通过对方的确定后方可。连接成功后双方可以开始游戏,决定在界面中提供在线聊天功能。用户可以通过主界面的上的菜单操作执行响应的功能和请求,如向对方发处向后悔棋一步,重新开始,认输等,另一方在接到请求后决定接受或拒绝。

人机对战:选择和电脑对弈的等级操作,同样也可以执行网络联机的悔棋等功能,只是因为是人机所以无需通过确认。

2.2.4总体设计

这个阶段必须回答的关键问题是:“概括地说,应该如何解决这个问题?” 首先,应该考虑几种可能的解决方案。如,目标系统的一些主要功能是用计算机自动完成还是用人工完成;如果使用计算机,那么是使用批处理方式还是人机交互方式;信息存储使用传统的文件系统还是数据库……。通常至少应该考虑下述几类可能的方案:

7 低成本的解决方案。系统只能完成最必要的工作,不能多做一点额处的工作。本系统的最基本要求就是能够实现必要的操作,其他额外的一些工作在后面完成

中等成本的解决方案。这样的系统不仅能够很好地完成预定的任务,使用起来很方便,而且可能还具有用户没有具体指定的某些功能和特点。虽然用户没有提出这些具体要求,但是系统分析员根据自己的知识和经验断定,这些附加的能力在实践中将证明是很有价值的。

这个成本方案在完成上面的低成本方案后添加的。如增加保存棋局,美化界面,实现观看电脑与电脑之间的对战等功能。

高成本的“十全十美”的系统。这样的系统具有用户可能希望有的所有功能和特点。

结构设计的一条基本原理就是程序应该模块化,也就是一个大程序应该由许多规模适中的模块按合理的层次结构组织而成。总体设计阶段的第二项主要任务就是设计软件的结构,也就是确定程序由哪些模块组成以及模块间的关系。通常用层次图或结构图描绘软件的结构。 2.2结构图

2.2.5详细设计

这个阶段的具体内容我把放到模块分析的章节去分析。下面仅作个简要的概述。

总体设计阶段以比较抽象概括的方式提出了解决问题的办法。详细设计阶段的任务就是把解法具体化,也就是回答下面这个关键问题:“应该怎样具体地实现这个系统呢?”

这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的程序代码。

2.2.6编码和单元测试

这个阶段的关键任务是根据以上阶段分析的软件模型,编写各个功能模块。 要注意的是程序的扩张性和可读性。以便以后软件的升级修改。同时要仔细的测试每个功能编写好的功能模块。

这个内容也放到下面编译运行章节去。

2.3 用户界面

用户界面在整个系统的使用中起着很大的作用,它将直接影响到用户对软件的评价。界面是人机交互的平台,所以在设计时尽量往用户方考虑。提供操作简便和友好界面。

以下是系统使用的界面,感觉还有很多地方需要改进和完善。但是总体来说已经能够基本满足系统的需要。拥有较为良好的交互功能。

8 图 2.3 用户界面

9

2.4 系统解析

下面结合操作对各个功能模块设计进行相应的解析。

2.4.1 界面部分

这部分我采用的是vc++提供的单文档视图框架,该框架为我们生成了Window应用程序最基本的界面无需自己动手编写复杂的菜单模块等代码,只要在基于这个框架的基础上对相应的功能进行补充和扩展。

2.4.1.1 CFiveChessView的属性

CView 类是该框架中一个很重要的类,它提供了大部分的交互功能,如菜单,鼠标左键等消息的的响应。下面对本系统中的CFiveChessView类的几个重点内容做个介绍。

m_ListenSocket和m_ClientSocket变量,这两个类成员均是派生自CSocket类,前者定义为一个服务端的套接字(Socket)变量,它用于服务端负责监听,当它收到某个主机发来的连接请求时,将m_ClientSocket和远程主机端的套接字关联。这样双方可以进行通信了。

CMatch m_match 这是一个棋盘类的一个变量。关于这个类将在后面做详细的讲解,将棋盘单独抽象为一个类,并向外部提供棋盘的一些操作。这比较符合面向对象编程。

CComputer m_computer 这也是一个很重要的成员,它将人机对战中的电脑方抽象成一个类,该类提供不同的等级的下棋功能。根据当前棋盘的局势给出最佳的下棋点。该类也将在后面给出详细的介绍。

m_mode 这是用于标记当前系统的是属于哪种模式人机或者联机,当它是人机的状态时值为P_PK_C(枚举类型的值),同样当它是联机状态就为P_PK_P。若当前没有选择的状态值就为NOCHOOSE,表示当前还为进行选择。 m_who 用于标记使用棋子的类型,1代表黑色,2代表白色。 m_turn 这是联机中用于标识当前是轮到哪方下棋了。 m_bWin标识本机方赢的状态。

m_bOver 标识游戏是否已经结束。 2.4.1.2 CFiveChessView的函数 以下的五个变量均为CBitmap类对象,m_lastwhitechess加载的是位图。m_whitechess加载的是位图,m_lastblackchess加载m_blackchess加载 位图 ,m_black 加载位图。m_board加载的是棋盘位图。 下面对该视图类一些重要的成员函数做些介绍。

? DrawWhiteChess(int i,int j,CDC *pDC); ? DrawBlackChess(int i,int j,CDC *pDC);

这两个函数根据传递进来的参数,确定要在棋盘的哪个位置和画的类型,如当该点是最近下的一个棋子,则把它用m_lastblackchess或m_lastwhitechess加载的位图贴出来。否则使用m_whitechess或m_blackchess位图。

这两个函数是在OnDraw(CDC* pDC)函数中被调用的。这个函数在窗口初始化或者需要重绘的时候被调用的。系统会发出一个重绘消息,调用OnPaint(),

10