认证主体:赖**(实名认证)
IP属地:广东
下载本文档
1、需求设计实现说明书基于Windows平台的网络/单机中国象棋Based on Windows SystemNetwork/Single plane Chinese chess编 写 作 者胡友谋专 业软件工程联 系 电 子 信 箱superfume个 人 说 明2009届本科毕业两年工作经验目录第一章网络/单机中国象棋需求分析11.1引言11.1.1编写目的11.1.2项目背景11.1.3定义11.2任务概述21.2.1目标21.2.2运行环境21.3总体划分21.3.1系统功能划分21.3.2端到端模式(P2P)功能详细描述31.3.3端到端模式用例41.3.4服
2、务器模式(C/S)功能详细描述41.3.5服务器模式用例51.3.6人机对战模式详细功能描述51.3.7服务器端功能描述51.3.8其他功能需求描述6第二章网络/单机中国象棋总体设计72.1软件简介及总体框架72.1.1软件简要说明72.1.2总体框架图72.1.3各功能模块框架图82.2系统静态模型82.2.1定义系统对象类82.2.2分析类图102.3系统动态模型112.3.1端到端(P2P)进行象棋对战112.3.2客户/服务器(C/S)模式对战122.3.3人机对战13第三章网络/单机中国象棋详细设计143.1引言143.2程序系统结构143.2.1层次方框图143.2.2系统结构图1
3、53.3 ChessSound模块设计说明153.3.1模块描述153.3.2模块类图153.3.3类详细说明163.4ChessBoardImage模块163.4.1模块描述163.4.2模块类图163.4.3类详细说明173.5ChessImage模块173.5.1模块描述173.6ChessClasses模块173.6.1模块描述173.6.2模块类图183.6.3类详细说明183.7ChessRoomTable模块203.7.1模块描述203.7.2模块类图213.7.3类详细说明213.8ComputerChessPlayer模块223.8.1模块描述223.8.2模块类图233.8
4、.3类详细说明23第四章网络对战实现254.1 网络通信相关技术分析254.1.1端口(port)254.1.2套接字(socket)254.1.3网络字节顺序264.1.4客户机/服务器模式264.1.5 Windows Sockets的实现264.1.6套接字的类型274.1.7基于TCP(面向连接)的socket编程274.2 服务器通信相关技术分析274.2.1资源分配机制284.2通信体系模式284.2.1网络协议的选择284.2.2C/S与P2P相结合294.3异步I/O模式294.4并发服务策略29第五章计算机博弈实现315.1前言315.2机器博弈的基本思想315.3棋盘局面表
5、示325.3走法生成335.3.1判断棋子是否在棋盘中335.3.1判断棋子是否在九宫335.3.2走棋步长设定345.4搜索算法345.4.1博弈树345.4.2极大极小算法355.4.3负极大值算法355.4.4Alpha-Beta搜索算法355.4.5局面评估36III第一章网络/单机中国象棋需求分析1.1引言1.1.1编写目的在完成了针对网络/单机中国象棋软件的前期调查,与很多游戏玩家进行了全面深入地探讨和分析,同时参考了部分同类型软件的功能的基础上,提出了这份软件需求规格说明书。此需求规格说明书对网络/单机中国象棋软件做了全面细致的用户需求分析,明确所要开发的软件应具有的功能、性能与
6、界面,使系统分析人员及软件开发人员能清楚地了解用户的需求,并在此基础上进一步提出概要设计说明书和完成后续设计与开发工作。本说明的预期读者为用户、业务或需求分析人员、测试人员、用户文档编写者、项目管理人员。1.1.2项目背景随着网络技术的不断发展和普及,网络游戏也有了长足的发展;网络棋类游戏作为其独特的一个分支,也倍受广大网游玩家的喜欢。通过网络,人们可以在更大的范围内和他人对弈,可以增强棋艺的技术文化交流,也可以增加玩家的棋艺水平。种个企业集团或团体都有自己的局域网,大家在工作之余也很想进行些有意义的娱乐活动,下中国象棋应该是首选吧。同时计算机发展也是非常的迅速,计算机的计算速度和并行的能力都
7、有了空前的提高,人们自然也很希望可以和计算机比比智力的高低,与计算机进行中国象棋对弈应该就是最好的方式吧。通过以上的简单分析,为了满足各种用户的需求,既可以网络对战,又可以人机对战的网络/单机中国象棋就有了开发的必要。在这样的背景下,我计划开发一款这样多功能的象棋软件。1.1.3定义C/S:客户端/服务器模式P2P:端对端模式AI:人工智能OOD:面向对象设计1.2任务概述1.2.1目标开发网络/单机中国象棋软件,实现网络服务器模式对战,网络端到端模式对战,以及人机对战功能。并且软件的界面友好,操作方便。1.2.2运行环境本软件建议运行在Windows xp 以上版本的PC机上。采用的开发工具
8、是Visual Studio 2005开发平台,使用的开发语言为C+。1.3总体划分1.3.1系统功能划分图1.1 网络/单机中国象棋功能划分图A. 端到端模式:用户在选择该模式之后,进入端到端游戏模式。用户首先通过对方的地址同对方相连接,或者等待对方的连接,当连接成功以后就可以开始下棋了。B. 服务器模式:用户在选择该模式之后,进入服务器模式进行游戏。用户首先通过服务器地址同服务器相连接,连接成功以后可以看到服务器当前的房间信息,并且可以选择一个空位坐下,如果对面也有人坐下就可以开始下棋了。C. 人机对战模式:用户在选择该模式之后,进行人机对战模式。用户首先选择电脑执红或执黑,就可以开始下棋
9、了。D. 游戏控制:控制游戏过程中的全动作。E. 外观控制:更改程序在外界,或者显示内容。1.3.2端到端模式(P2P)功能详细描述端到端模式的特别是两个客户端程序直接通过网络相互连通进行游戏,参于中国象棋对弈的玩家只有两人。这时客户端程序也可以作为服务端,具体操作如下:a. 选择游戏模式为点对点模式。b. 作为客户端的一方点击连接按钮在弹出的对话框中输入对方的IP地址进行连接。c. 作为服务器的一方会监听客户端的连接请求,并对来到的请求进行响应。d. 待服务端用户同意连接请求后,双方中的任意一方都可以点击开始按钮进行游戏,点击开始游戏的一方为红方。e. 游戏过程中可以悔棋、求和和认输等操作,
10、同时程序自动判断胜负。1.3.3端到端模式用例图1.2 端到端模式用例图1.3.4服务器模式(C/S)功能详细描述服务器模式的特别是所有的游戏玩家都集中连接服务器,在统一的平台下集中游戏。在连接好服务器之后可以在房间里选择空位,棋桌的另一方如果也有玩家占位,则可以进行游戏。功能简述如下:a. 选择服务器模式。b. 正常运行服务器程序。c. 客户端点击连接,填入服务器所在的地址,连接成功点击显示房间。d. 双击一个空位准备游戏。e. 待对面的位置有玩家入坐就可以开始游戏,过程同端到端模式。1.3.5服务器模式用例图1.3 服务器模式用例图1.3.6人机对战模式详细功能描述人机对战模式是最难实现的
11、部分,要求设计合理高效的数据结构和智能博弈搜索算法,使得计算机具有很高的棋力。功能简述如下:a. 选择人机对战模式:电脑执红或电脑执黑。b. 选择电脑水平:简单、一般、困难和超级。c. 选择电脑迭代加加深搜索。d. 点击开始游戏。e. 游戏过程中可以悔棋。1.3.7服务器端功能描述服务器端程序是实现中国象棋服务器对战模式的必要组成部分。它使所有客户端的网络信息通信都集中在服务器上,使游戏玩家的选择更方便快捷。具体功能描述如下:a. 接受每一个客房端的连接,并维护网络资源,向客房端发送房间信息。b. 当已经满座的棋桌双方提示可以开始下棋。c. 为已经进入对战的客房端传送下棋信息。1.3.8其他功
12、能需求描述软件还有其他的附加功能需求,具体描述如下:a. 选择棋子、走动棋子、吃子和判断胜负时播放不同的声音。b. 游戏过程中,可以更换棋子和棋盘的样式。游戏过程中,可以表示出信息。24第二章网络/单机中国象棋总体设计2.1软件简介及总体框架2.1.1软件简要说明本软件是基于端对端(P2P)、客户/服务器(C/S)和单机模式的中国象棋博弈软件,是一个综合性的棋类网络游戏软件。主要包括了网络信息传输管理,面向对象软件设计,服务器并发访问和人工智能等技术。实现了点对点网络对战,服务器网络对战和人机对战功能。2.1.2总体框架图本系统采用端到端(P2P)、客户/服务器(C/S)和单机模式的应用软件。
13、其框架图如下:图2.1 端到端(P2P)用例框架图图2.2 客户/服务器(C/S)模式用例框架图2.1.3各功能模块框架图图2.3 网络/单机中国象棋各功能模块图图2.4 网络中国象棋服务器端功能模块图2.2系统静态模型2.2.1定义系统对象类A.棋盘和棋子图片资源模块为了方便软件的维护和软件界面的多样化发展,故将软件中所涉及到的棋盘和棋子图片资源都统一用单独的模块进行维护。把图片资源编译到动态连接库中,并用库中的一个导出类向外部提供资源。棋盘图片资源模块只有一个静态类:CBoardImageManager;棋子图片资源模块一个静态类:CChessImageManager。B.声音资源模块为了
14、方便软件的维护和软件运行时与用户互动的多样化发展,故将软件所涉及到的声音资源都统一用单独的模块进行维护。把声音资源编译到动态连接库中,并用库中的一个导出类向外部提供资源。声音资源模块只有一个静态类:CSoundManager 。C.棋盘、棋子模块棋盘、棋子模块是程序中重要的部分,它将界面和棋子运行的逻辑分离开来。界面只要有一个棋盘的对象,使用棋盘类的接口就可以了,而不用去管棋盘内部的处理过程。这样就大大的降低了模块间的耦合程序。所有棋子的基类:CChess;CChess 类的子类:CBingzu、CJiangshuai、CJu、CMa、CPao、CShiwei和CXiang。处理下棋逻辑的部分
15、就是棋盘类:CChessBoard。D.棋房间、棋桌模块棋房间中有很多棋桌,每个棋桌有两个位置可以供客户连接。棋房间的信息都是用服务器管理,而客户端只是接受服务器发送过来的房间信息并进行相应的处理;客户端可以选择一个位置座下,如果对面也有人入座就可以进行对弈活动了。由于棋房间、棋桌在客户端程序和服务端程序都会用到,所以也单独做成一个模块,这样可以利用代码的复用。棋子房间类:CChessRoom;棋桌类:CChessTable。E.网络模块网络模块是本软件进行网络对战的必要模块,主要处理网络连接,网络信息传输的。作为服务端,则有一个用于网络监听的SOCKET对象来监听客户端的连接请求,当接受了客
16、户端的连接请求之后,就创建一个SOCKET对方与客户端的连接绑定。作为客户端,直接创建一个SOCKET对方,通过服务端的地址和端口连接。网络监听SOCKET类:CListenSocket;用于点对点客户端通信类:CClientSocket;用于服务器模式客户端通信类:CClientSocketForServer。F.人工智能模块人工智能模块就是实现计算机博弈功能的部分,运用了现在比较流行的计算机博弈算法和数据结构,使计算机具有了一定的棋力。所用到的技术点有:棋盘表示、走法生成、搜索技术、局面评估、置换表、杀手启发和静态搜索等技术。计算机博弈类:CAIPlayer。G.服务器模块服务器模块是整个
17、软件的服务器部分,实现了客户端的并发访问控制,让所有的客户端玩家都在统一的平台进行游戏,只要知道服务器地址,而不用去管其他玩家所在的客户端地址。客户端与服务器的通信有两个网络连接,一个用于下棋另一个用于接受房间信息。当服务器接受到一个客户端的连接就创建一个SOCKET对方与之绑定,如果再的客户端连接就再创建。监听客户端连接的类:CListenSocket;用于同客户端连接的通信类:CClientSocket;棋房间类:CServerChessRoom(继承于CChessRoom);棋桌类:CServerChessTable(继承于CChessTable);用于向各个客户端分发房间消息的观察者类
18、:CPostInfoThread。2.2.2分析类图通过上一节分析得到了系统中的类,如下图所示:图2.5 网络/单机中国象棋类图图2.6 服务器类图2.3系统动态模型2.3.1端到端(P2P)进行象棋对战端到端进行象棋对战,是两个玩家直接进行连接游戏。首先,是作为服务端的一方创建一个网络监听端,并打开一个网络端口,等待客户端的连接。客户端则创建一个网络客户端,通过服务端的网络地址和端口进行连接。服务端同意客户端连接请求之后也创建一个网络客户商同请求连接的客户端进行绑定。这样就建立了网络连接,就可以进行游戏了。时序图如下:图2.7 端到端对弈时序图2.3.2客户/服务器(C/S)模式对战客户/服
19、务器模式进行对战,就需要有一个独立的服务器供客户端的连接。服务器要管理好每一个客户端的连接,并且正确处理它们之间正确的信息通信。首先服务器打开两个服务端的网络监听:一个是用来监听客户端房间信息连接,另一个是用来对客户端对弈信息连接。客户端通过服务器地址和端口与服务器进行连接。服务器监听到网络连接之后就是创建两个网络通信客户端分别与客户端的两个连接请求相绑定,并把房间信息发送到客户端。当客户端选择了一个位置坐下,那么这个客户端的对弈通信连接就被绑定到该位置,当该位置的对面也有人时,这个棋桌的双方就可以开始对弈了。时序图如下:图2.8 客户/服务器模式对弈时序图2.3.3人机对战人机对战是本设计的
20、一个亮点,把人工智能同中国象棋结合起来,让计算机具有了下棋的能力。用户只要选择好了电脑的执棋方,以及选择好电脑的棋力水平,就可以同电脑对弈了。时序图如下:图2.9 人机对弈时序图第三章网络/单机中国象棋详细设计3.1引言在使用程序设计语言编写程序之前,需要对所采用的算法的逻辑关系进行分析并设计出全部必要的过程细节,并给予清晰的表达,使之成为编码测试和测试的依据。3.2程序系统结构采用层次方框图和系统结构图的形式列出系统内的每个模块和子程序的名称、标识符和它们之间的层次结构关系。3.2.1层次方框图图3.1层次方框图3.2.2系统结构图图3.2系统结构图3.3 ChessSound模块设计说明3
21、.3.1模块描述此模块最终编译为一个动态连接库文件,为软件运行过程中提供所要的声音资源。模块内包涵了软件运行过程中所需的音频资源,只有一个静态类:CSoundManager。3.3.2模块类图图3.3ChessSound模块类图3.3.3类详细说明表3-1 CSoundManager 详细说明表类名CSoundManager概述:根据调用者的消息发出相应的声响。数据成员数据成员名详细说明module类型:HMODULE说明:此为私有的静态数据成员,指向本身模块的句柄。成员函数成员函数名详细说明PlayChessSound参数:int SoundResID(音频资源ID)返回类型:void说明:
22、此函数为静态成员函数,根据传入的ID参数,播放模块内的音频资源。3.4ChessBoardImage模块3.4.1模块描述此模块为ChessClasses模板提供棋盘图片资源。模块内包涵了棋盘图片资源。模块包涵了软件运行过程中所需的棋盘图片资源,只有一个类CBoardImageManager。3.4.2模块类图图3.4CBoardImageManager类图3.4.3类详细说明表3-2 CBoardImageManager 详细说明表类名CBoardImageManager概述:为ChessClasses模板提供棋盘图片资源。数据成员数据成员名详细说明成员函数成员函数名详细说明GetImage
23、参数:CBitmap &bmp (用于绑定图片的位图对象的引用) int id (相应图片资源ID)返回类型:void说明:此函数为静态成员函数,根据传入的位图对象引用和图片ID参数,将相应的图片绑定到位图对象。3.5ChessImage模块3.5.1模块描述此模块为ChessClasses模板提供棋子图片资源。模块内包涵了棋子图片资源。模块包涵了软件运行过程中所需的棋盘图片资源,只有一个类CChessImageManager,类图和类详细说明表请参考3.4.2和3.4.3节。3.6ChessClasses模块3.6.1模块描述该模块是依托于ChessImage模块和ChessBoardIma
24、ge模块,包涵所有的棋盘和棋子的业务处理逻辑,并使之与GUI部分完全分离。充分的利用了MVC的设计模式,提高了软件的开发效率,也有利于软件的维护。它在整个系统中占有重要的地位,实现了主程序网络对战的走法判断的算法处理。3.6.2模块类图图3.5 ChessClasses 模块类图3.6.3类详细说明表3-3 CChess 类详细说明类名CChess概述:此类为所有棋子类的基类,包括棋子都有的属性和方法。数据成员数据成员名详细说明point类型:CPoint说明:表示棋子所在的点。isRed类型:bool说明:表示棋子是否属于红方。isBoos类型:bool说明:表示棋子是否是将或帅。idmap
25、类型:int说明:表示棋子所用图片资源的ID。成员函数名详细说明DrawChess参数:CDC *pDC, CBitmap * pBitmap返回类型:void说明:根据棋子当前的点位置信息和图片资源,将棋子绘制到指定的CDC和CBitmap里。ChessGo参数:CPoint &point(打算让棋子要到达的下一个点)返回类型:bool说明:此函数为虚拟函数。根据棋子当前所在点、传入参数所表示的目标点,以及当前棋盘的形势来判断一个走法是否合理。ChangeStyle参数:int style返回类型:void说明:此函数为虚拟函数。改变棋子的外观样式。表3-4CChessBoard 类详细说明
26、表类名CChessBoard概述:棋盘类。数据成员数据成员名详细说明onlyOneBoard类型:CChessBoard *说明:静态数据成员,指向唯一实例的指针。chessArray类型:CChess *;说明:存储棋盘棋子的二维级数。成员函数成员函数名详细说明GetChessBoard参数:无返回类型:CChessBoard *说明:静态成员函数,得到唯一的棋盘实例指针。DelChessBoard参数:无返回类型:void说明:静态成员函数,删除唯一的棋盘实例。InitChessesRed参数:无返回类型:void说明:以红方初始化棋盘对象。InitChessesBlue参数:无返回类型:
27、void说明:以黑方初始化棋盘对象。DrawChesses参数:CDC *pDC, CBitmap *pBitmap返回类型:void说明:将棋盘上所有棋子绘制出来。DrawChessBoard参数:CDC *pDC, CBitmap *pBitmap返回类型:void说明:将棋盘绘制出来。GetChess参数:CPoint &point返回类型:CChess *说明:根据传入的点,来得到该点的棋子,如果该点没有棋子则返回空。SetBoardPoint参数:CPoint &pointNew, CPoint &pointOld返回类型:void说明:根据传入的终点和起来来下一步棋,当然这必须是在
28、判断该走法符合规则之后。Repent参数:无返回类型:void说明:悔一步棋。3.7ChessRoomTable模块3.7.1模块描述此模块是为服务器模式下提供房间和棋桌对象而建立的。这个模块会在主程序和服务器模块中共同使用。3.7.2模块类图图3.6ChessRoomTable 类图3.7.3类详细说明表3-5 CChessTable 类详细说明表类名CChessTable概述:棋桌类。数据成员数据成员名详细说明topLeft类型:CPoint说明:棋桌左上角所在的点。bottomRight类型:CPoint说明:棋桌右下角所在的点。leftBtnRect类型:CRect说明:棋桌左座位所在
29、的区域。rightBtnRect类型:CRect说明:棋桌右座位所在的区域。成员函数成员函数名详细说明DrawTable参数:CDC *pDC, CBitmap * pBitmap返回类型:void说明:根据当前棋桌状态绘制棋桌。表3-6 CChessRoom 类详细说明表类名CChessRoom概述:棋房间类。数据成员数据成员名详细说明chessTables类型:CChessTable说明:房间内的棋桌。TablesInfo类型:char说明:所有棋桌的状态列表。成员函数成员函数名详细说明DrawRoom参数:CDC *pDC, CBitmap * pBitmap返回类型:void说明:绘制
30、房间。DrawTables参数:CDC *pDC, CBitmap * pBitmap返回类型:void说明:绘制房间内所有的棋桌。SetTablesInfo参数:无返回类型:void说明:设置房间内所有棋桌的状态。3.8ComputerChessPlayer模块3.8.1模块描述此模块是中国象棋人工智能模块,使用了合理的棋盘表示数据结构,先进的走法生成算法,极大极小值搜索算法,局面加密算法,置换表和杀手启发的静态搜索算法。3.8.2模块类图图3.7ComputerChessPlayer 类图3.8.3类详细说明表3-7CAIPlayer 类详细说明表类名CAIPlayer概述:棋房间类。数据
31、成员数据成员名详细说明isFlipped类型:bool说明:是否翻转棋盘标志。成员函数成员函数名详细说明SetCallBack参数:callBack : *pFun, pUserData : void *返回类型:void说明:设置回调函数。MakeAIPlayerGo参数:int sRow, int sCol, int dRow, int dCol返回类型:bool说明:叫电脑下一步棋。Startup参数:无返回类型:void说明:重启电脑。LoadBook参数:CString bookPath返回类型:void说明:载入开局库。SetAILevel参数:int level返回类型:void
32、说明:设置电脑级别。Repentance参数:无返回类型:void说明:悔棋。第四章网络对战实现4.1 网络通信相关技术分析不同的计算机要在网络上进行通信,就要知道目的计算机的IP地址,所使用的通信协议,和所开通的端口(指定开通该端口的应用程序接收信息)。4.1.1端口(port)按照OSI七层模型的描述,传输层提供进程(应用程序)通信的能力。为了标识通信实体中进行通信的进程,TCP/IP协议提出了协议端口(protocol port)的概念。端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序通过系统调用与某端口相绑定(binding)后,传输层传给该端口的数据被相应的进程所
34、CP/IP,从而开发各种网络应用的程序。随着Unix的应用推广,套接字在编写网络软件中得到了极大的普及。后来,套接字又被引进了Windows等操作系统,成为开发网络应用程序的非常有效快捷的工具。套接字存在于通信区域中。通信区域也叫地址族,它是一个抽象的概念,主要用于将通过套接字通信的进程的共有特性综合在一起。套接字通常只与同一区域的套接字交换数据(也有可能跨区域通信,但这只在执行了某种转换进程后才能实现)。Windows Sockets只支持一个通信区域:网际域(AF_INET),这个域被使用网际协议簇通信的进程使用。4.1.3网络字节顺序不同的计算机存放多字节值的顺序不同,有的机器在起始地址
35、存放低字节,有的机器在起始地址存放高位字节。基于Intel的CPU,即我们常用的PC采用的是低位先存。为保证数据的正确性,在网络协议中需要制定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高位先存格式。4.1.4客户机/服务器模式客户机/服务器模式在操作过程中采取的是主动请求的方式。服务器方要先启动,并根据请求提供相应的服务:1. 打开一个通信通道并告知本地主机,他愿意在某一地址和端口上接收客户请求;2. 等待客户请求到达该端口;3. 接收到重复服务请求,处理该请求并发送应答信号了。接收到并发服务请求,要激活一个新的进程(或线程)来处理这个客户请求。新进程(或线程)处理此客户请求,
36、并不需要对其他请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止;4. 返回第二步,等待另一个客户请求;5. 关闭服务器。客户方:1. 打开一个通信通道,并连接到服务器所在主机的特定端口;2. 向服务器发服务请求报文,等待并接收应答;继续提出请求;3. 请求结束后关闭通信通道并终止。4.1.5 Windows Sockets的实现Windows Sockets是Microsoft Windows的网络程序设计接口,它是从Berkeley Sockets扩展而来的,以动态链接库的形式提供给我们使用。Windows Sockets在继承了Berkeley Sockets主要特征的基础上
37、,又对他进行了重要扩充。这些扩充主要是提供了一些异步函数,并增加了符合Windows消息驱动特性的网络时间异步选择机制。Windows Sockets 1.1和berkeley Sockets都是基于TCP/IP协议的;windows Sockets 2从Windows Sockets 1.1发展而来,与协议无关并向下兼容,可以使用任何底层传输协议提供的通信能力,来为上层应用程序完成网络数据通讯,而不关心底层网络链路的通讯情况,真正的实现了底层网络通讯对应用程序的透明。4.1.6套接字的类型流式套接字(SOCK_STREAM):提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按发
38、送顺序接收。数据报式套接字(SOCK_DGRAM):提供无连接服务。数据包以独立包形式发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。原始套接字(sock_raw)。4.1.7基于TCP(面向连接)的socket编程服务器端程序:1. 创建套接字(socket);2. 将套接字绑定到一个本地地址和端口上(bind);3. 将套接字设为监听模式,准备接收客户请求(listen);4. 等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept);5. 用返回的套接字和客户端进行通信(send/recv);6. 返回,等待另一客户请求;7. 关闭套接
39、字。客户端程序:1. 创建套接字(socket);2. 向服务器发出连接请求(connect);3. 和服务器端进行通信(send/recv);4. 关闭套接字。客户端不用绑定端口,因为当服务器接收到请求时已经记录下客户端的端口号。4.2 服务器通信相关技术分析网络中国象棋服务器同时为多个客户服务,要求服务器具有很高的稳定性,同时能够及时响应客户请求。性能的提高依赖服务器数据处理的每一个环节,而通信部分位于体系底层,显得愈为重要。系统资源的分配方式、Socket的管理、I/O模式的选择、并发服务以及负载均衡策略等都直接影响到通信的效率。4.2.1资源分配机制服务器在接受大量客户连接请求的时,需
40、要地向系统申请资源,如申请内存接收数据,申请线程处理业务逻辑,申请IO对数据收发进行投递等。操作系统在处理应用程序的这些请求时,不断地创建资源供应用程序使用,在应用程序释放资源后执行销毁和回收操作。图5.1资源分配方式示意图4.2通信体系模式4.2.1网络协议的选择合理的选择网络协议将使游戏更加的高效、稳定和安全。常用的协议主要包括TCP/UDP协议和IP协议。在讨论哪种协议更适合网络游戏之前我想有必要简略地描述一下它们的工作方式。TCP/IP和UDP/IP是网络体系结构中非常重要的通信协议族。IP层负责网际数据包的传输。UDP或者TCP层将大的数据包传给IP,IP将数据包分割为小的子数据包,
41、为每个数据包加上一个信封,计算出目的地的IP地址,应该如何到达那里,然后将数据包发送到你的ISP。UDP和TCP是网络体系中传输层定义两种传输协议,区别在于TCP保证数据包的传送和有序,而UDP不保证。为了确定数据包通过Internet完好无损地送到了目的方,TCP期待从目的方为它发送的每个数据包发回一个应答包(网络用语是ACK)。如果它在一定时间内没有收到ACK,它就停止发送任何新的数据包,重新发送丢失的数据包,并且将继续这样做直到收到目的方的回应。网络中国象棋所传输的是正确的下棋落子信息,需要很高的正确性,所以我选择TPC协议。4.2.2C/S与P2P相结合客户机/服务器(Client/S
42、erver,缩写C/S)模型和端到端(Peer-to-Peer,缩写P2P)模型是网络结构中最主要的两种结构模型。C/S模型,一般客户机向服务器提出请求,而服务器则响应客户机的请求,发送客户机要求的数据。在C/S模型内,客户机和服务器承担着完全不同的角色;客户端与其它客户端不直接进行通信。网络上所有客户端的消息都必须先发送给服务器,再由服务器将消息转发给其它客户端。这种体系结构比较适用于多人在线对弈,多人在统一的服务器中选择自由对手下棋。而在P2P模型中,每个网络节点则扮演着同样的角色和对等的地位。多个玩家参与的游戏中,各个玩家之间采用Peer-to-Peer的直接通信方式,没有中心服务器来保
43、存游戏状态,而是每个客户端保存自己的游戏状态。在网络通信服务的形式上,一般采用浮动服务器的形式,即其中一个玩家的机器既是客户端,又扮演服务器的角色,一般由创建游戏的玩家担任服务器(主机)。网络中国象棋将C/S与P2P两种模式都运用于其中,即将来可以两个客户端直接端到端对战,也可以通过一个独立的服务器进行网络对战。4.3异步I/O模式服务器需要同时为大量客户服务,不能只为一个客户机服务而忽视别的客户机,因此必然要求能够同时接收和处理多个服务请求。I/O策略描述服务器如何发起多个I/O请求,即如何同时接收多个服务请求。异步I/O模型中,当服务器发起I/O操作时,内核在服务器处理其他请求的同时,异步
44、地执行操作直到完成。异步I/O的优点是服务器不需要在I/O请求上阻塞,因为它们是异步完成的这使得服务器能够高效地为高I/O延迟的操作进行伸缩。网络中国象棋在传输房间信息时,会传输相对关大的数据量,故采用的是异步I/O 模式传输数据。4.4并发服务策略考虑到网络中国象棋的实际使用情况,目前用户使用量不会太大,我采用的是一个请求一个线程(Thread-per-Request)的并发服务策略。该模式在单独线程控制中处理每个来自客户的请求。当每个请求到达时,服务器就会创建一个新线程来处理该请求。这种设计允许每个线程使用同步I/O机制来发送接受数据。Thread-per-Request优点是它的简单性和
45、它利用多处理器平台上并行性的能力。36第五章计算机博弈实现5.1前言计算机博弈的研究广泛而深入。早在上世纪五十年代,就有人设想利用计算机智能来实现计算机与人的对弈。国内外许多知名学者和知名科研机构都曾经涉足这方面的研究,历经半个多世纪,到目前为止已经取得了许多惊人的成就。1997年IBM的“深蓝”战胜了国际象棋世界冠军卡斯帕罗夫,惊动了世界。同样计算机博弈在中国象棋方面也有了很深入的研究,本章主要介绍本人在毕业设计中所用到的计算机博弈搜索算法等相关技术。5.2机器博弈的基本思想计算机博弈的核心思想就是对博弈树节点的估值过程和对博弈树搜索过程的结合。在博弈过程中的任何一个阶段,站在博弈双方其中一
46、方的立场上,可以构想出一个博弈树。这个博弈树的根节点是当前时刻的棋盘局面,它的子节点是假设再走一步棋以后的各种棋局,子节点的子节点是从子节点的棋盘局面再走一步棋的各种棋盘局面,以此类推,构造整棵博弈树,直到可以分出胜负或和棋的局面。整棵的博弈树非常庞大,且不同的棋类有所不同。图5.1博弈树示意图博弈算法的任务就是对博弈树进行搜索找出对当前局面来讲要走的最优的一步棋。对博弈树进行极大极小搜索,可以达到这一目的。极大极小搜索,是因为博弈双方所要达到的目的相反,对一方有利的局面正好是对另一方不利的局面,所以博弈的一方总是希望下一走是子节点中取值最大者,而另一方恰恰相反。这便形成了极大极小过程。由于算
47、法不能也没有必要做到搜索整棵博弈树的所有节点,对于一些已经确定为不佳的走法可以将以它为根节点的子树剪掉。搜索的深度也不必深入到分出胜负的棋局,只需要在一定深度范围内对局面进行评价即可。只有搜索空间缩小到一定程度,搜索才可以真正的进行。当搜索进行到一定深度,用局面评价机制来评价棋局,按照极大极小的原则选出最优,向上回溯,给出这一局面的父亲节点的价值评价,然后再继续向上回溯,一直到根节点,最优走步就是这样搜索出来的。在这个过程中,最为重要的是搜索算法,高效的搜索算法可以保证用尽量少的时间和空间损耗来达到寻找高价值的走步。但是真的想要博弈程序棋力提高,还必须有一个好的局面评价机制,即估值算法作后盾。
48、就是说,用这个估值算法评价的局面价值必须是客观的、正确的,可以确凿的评价局面的优劣以及优劣的程度。5.3棋盘局面表示计算机并不能像我们正常人那样通过眼睛看就知道当前棋局的形式,必须将现实当中的棋局映射到计算机理解的数据结构之中。棋盘局面表示主要探讨的就是使用什么样的数据结构来表示棋盘。通常用来描述棋盘及其棋盘上棋子信息的是一个二维数组。但是为了在以后的搜索算法中使用更高效的方式,如图6.2所示我选择用一个256个元素的一维数组中的90个元素来表示棋盘信息。图5.2棋盘表示如图5.2所示,我们用256位元素的BYTE数组来存储棋盘信息,高亮部分从第3排到第12排、第3列到11列就是棋盘信息。使用这样的数据结构的好处就是很容易判断棋子是否是在棋盘上,对棋子的走法规定也是特别的容易。5.3走法生成走法生成就是将一个局面的所有可能走法都列举出来的部分,它显示了下一步可以有哪些走法。为了提高走法生成的效率,我事先根据棋盘表示已经把产生棋子走法的相关条件特征放在一些数组里面。5.3.1判断棋子是否在棋盘中如图5.3所示,在生成目标走法的时候会用到这个数组,当一个棋子走一步,那么可以知道它下一步的目的位置,直接用目标位置作为下标来访问这个数组对应的元素,如果得到的值为
0/150
联系客服
本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!