admin管理员组

文章数量:1531374

2024年7月12日发(作者:)

需求设计实现说明书

基于Windows平台的网络/单机

中国象棋

Based on Windows System

Network/Single plane Chinese chess

编 写 作 者

专 业

联 系 电 话

电 子 信 箱

个 人 说 明

胡友谋

软件工程

2009届本科毕业 两年工作

经验

I / 54

目录

第一章 网络/单机中国象棋需求分析1

1.1 引言1

1.1.1 编写目的1

1.1.2 项目背景1

1.1.3定义2

1.2 任务概述2

1.2.1 目标2

1.2.2 运行环境2

1.3 总体划分3

1.3.1 系统功能划分3

1.3.2 端到端模式(P2P)功能详细描述4

1.3.3 端到端模式用例5

1.3.4 服务器模式(C/S)功能详细描述5

1.3.5 服务器模式用例6

1.3.6 人机对战模式详细功能描述6

1.3.7 服务器端功能描述7

1.3.8 其他功能需求描述7

第二章 网络/单机中国象棋总体设计8

2.1 软件简介及总体框架8

2.1.1 软件简要说明8

I / 54

2.1.2 总体框架图8

2.1.3 各功能模块框架图9

2.2 系统静态模型10

2.2.1 定义系统对象类10

2.2.2分析类图12

2.3 系统动态模型14

2.3.1 端到端(P2P)进行象棋对战14

2.3.2客户/服务器(C/S)模式对战14

2.3.3 人机对战16

第三章 网络/单机中国象棋详细设计17

3.1 引言17

3.2 程序系统结构17

3.2.1 层次方框图18

3.2.2 系统结构图19

3.3 ChessSound模块设计说明19

3.3.1 模块描述19

3.3.2 模块类图20

3.3.3类详细说明20

3.4ChessBoardImage模块21

3.4.1模块描述21

3.4.2 模块类图21

3.4.3 类详细说明21

II / 54

3.5ChessImage模块22

3.5.1 模块描述22

3.6ChessClasses模块22

3.6.1模块描述22

3.6.2 模块类图23

3.6.3 类详细说明23

3.7ChessRoomTable模块27

3.7.1 模块描述27

3.7.2 模块类图27

3.7.3 类详细说明28

3.8ComputerChessPlayer模块29

3.8.1 模块描述29

3.8.2 模块类图30

3.8.3 类详细说明30

第四章 网络对战实现25

4.1 网络通信相关技术分析25

4.1.1 端口(port)25

4.1.2 套接字(socket)25

4.1.3 网络字节顺序26

4.1.4 客户机/服务器模式26

4.1.5 Windows Sockets的实现27

4.1.6 套接字的类型28

III / 54

4.1.7 基于TCP(面向连接)的socket编程28

4.2 服务器通信相关技术分析29

4.2.1 资源分配机制29

4.2 通信体系模式30

4.2.1 网络协议的选择30

4.2.2C/S及P2P相结合31

4.3 异步I/O模式32

4.4 并发服务策略32

第五章 计算机博弈实现34

5.1 前言34

5.2 机器博弈的基本思想34

5.3 棋盘局面表示36

5.3 走法生成37

5.3.1 判断棋子是否在棋盘中37

5.3.1 判断棋子是否在九宫37

5.3.2 走棋步长设定38

5.4 搜索算法39

5.4.1 博弈树39

5.4.2 极大极小算法40

5.4.3 负极大值算法40

5.4.4Alpha-Beta搜索算法40

5.4.5 局面评估41

IV / 54

V / 54

第一章 网络/单机中国象棋需求分析

1.1 引言

1.1.1编写目的

在完成了针对网络/单机中国象棋软件的前期调查,及很多游戏

玩家进行了全面深入地探讨和分析,同时参考了部分同类型软件的功

能的基础上,提出了这份软件需求规格说明书。

此需求规格说明书对网络/单机中国象棋软件做了全面细致的用

户需求分析,明确所要开发的软件应具有的功能、性能及界面,使系

统分析人员及软件开发人员能清楚地了解用户的需求,并在此基础上

进一步提出概要设计说明书和完成后续设计及开发工作。本说明的预

期读者为用户、业务或需求分析人员、测试人员、用户文档编写者、

项目管理人员。

1.1.2 项目背景

随着网络技术的不断发展和普及,网络游戏也有了长足的发展;

网络棋类游戏作为其独特的一个分支,也倍受广大网游玩家的喜欢。

通过网络,人们可以在更大的范围内和他人对弈,可以增强棋艺的技

术文化交流,也可以增加玩家的棋艺水平。种个企业集团或团体都有

自己的局域网,大家在工作之余也很想进行些有意义的娱乐活动,下

中国象棋应该是首选吧。同时计算机发展也是非常的迅速,计算机的

1 / 54

计算速度和并行的能力都有了空前的提高,人们自然也很希望可以和

计算机比比智力的高低,及计算机进行中国象棋对弈应该就是最好的

方式吧。

通过以上的简单分析,为了满足各种用户的需求,既可以网络对

战,又可以人机对战的网络/单机中国象棋就有了开发的必要。在这

样的背景下,我计划开发一款这样多功能的象棋软件。

1.1.3定义

C/S:客户端/服务器模式

P2P:端对端模式

AI:人工智能

OOD:面向对象设计

1.2任务概述

1.2.1目标

开发网络/单机中国象棋软件,实现网络服务器模式对战,网络

端到端模式对战,以及人机对战功能。并且软件的界面友好,操作方

便。

1.2.2运行环境

本软件建议运行在Windows xp 以上版本的PC机上。

采用的开发工具是Visual Studio 2005开发平台,使用的开发语

2 / 54

言为C++。

1.3 总体划分

1.3.1系统功能划分

网络/单机中国象棋

端到端模式服务器模式人机对战模式游戏控制外观控制

开始

电脑水平设置

结束

电脑执红

悔棋

电脑执黑

求和

显示房间

认输

连接

断开连接

托管

显示棋盘

棋子外观设置

棋盘外观设置

图1.1 网络/单机中国象棋功能划分图

A.

端到端模式:用户在选择该模式之后,进入端到端游戏模式。

用户首先通过对方的地址同对方相连接,或者等待对方的连

接,当连接成功以后就可以开始下棋了。

B.

服务器模式:用户在选择该模式之后,进入服务器模式进行游

戏。用户首先通过服务器地址同服务器相连接,连接成功以后

3 / 54

可以看到服务器当前的房间信息,并且可以选择一个空位坐

下,如果对面也有人坐下就可以开始下棋了。

C.

人机对战模式:用户在选择该模式之后,进行人机对战模式。

用户首先选择电脑执红或执黑,就可以开始下棋了。

D.

游戏控制:控制游戏过程中的全动作。

E.

外观控制:更改程序在外界,或者显示内容。

1.3.2端到端模式(P2P)功能详细描述

端到端模式的特别是两个客户端程序直接通过网络相互连通进

行游戏,参于中国象棋对弈的玩家只有两人。这时客户端程序也可以

作为服务端,具体操作如下:

a.

选择游戏模式为点对点模式。

b.

作为客户端的一方点击连接按钮在弹出的对话框中输入对方

的IP地址进行连接。

c.

作为服务器的一方会监听客户端的连接请求,并对来到的请求

进行响应。

d.

待服务端用户同意连接请求后,双方中的任意一方都可以点击

开始按钮进行游戏,点击开始游戏的一方为红方。

e.

游戏过程中可以悔棋、求和和认输等操作,同时程序自动判断

胜负。

4 / 54

1.3.3 端到端模式用例

端到端模式用例

选择点对点模式

连接服务端

客户端用户

接受或拒绝请求

服务端用户

进行游戏

图1.2 端到端模式用例图

1.3.4服务器模式(C/S)功能详细描述

服务器模式的特别是所有的游戏玩家都集中连接服务器,在统一

的平台下集中游戏。在连接好服务器之后可以在房间里选择空位,棋

桌的另一方如果也有玩家占位,则可以进行游戏。功能简述如下:

a.

选择服务器模式。

b.

正常运行服务器程序。

c.

客户端点击连接,填入服务器所在的地址,连接成功点击显示

房间。

5 / 54

d.

双击一个空位准备游戏。

e.

待对面的位置有玩家入坐就可以开始游戏,过程同端到端模

式。

1.3.5服务器模式用例

服务器模式用例

选择服务器模式

游戏玩家1

连接服务器

游戏玩家3

占空位

游戏玩家2

进行对战

图1.3 服务器模式用例图

1.3.6人机对战模式详细功能描述

人机对战模式是最难实现的部分,要求设计合理高效的数据结构

和智能博弈搜索算法,使得计算机具有很高的棋力。功能简述如下:

a.

选择人机对战模式:电脑执红或电脑执黑。

6 / 54

b.

选择电脑水平:简单、一般、困难和超级。

c.

选择电脑迭代加加深搜索。

d.

点击开始游戏。

e.

游戏过程中可以悔棋。

1.3.7服务器端功能描述

服务器端程序是实现中国象棋服务器对战模式的必要组成部分。

它使所有客户端的网络信息通信都集中在服务器上,使游戏玩家的选

择更方便快捷。具体功能描述如下:

a.

接受每一个客房端的连接,并维护网络资源,向客房端发送房

间信息。

b.

当已经满座的棋桌双方提示可以开始下棋。

c.

为已经进入对战的客房端传送下棋信息。

1.3.8其他功能需求描述

软件还有其他的附加功能需求,具体描述如下:

a.

选择棋子、走动棋子、吃子和判断胜负时播放不同的声音。

b.

游戏过程中,可以更换棋子和棋盘的样式。

游戏过程中,可以表示出信息。

7 / 54

第二章 网络/单机中国象棋总体设计

2.1 软件简介及总体框架

2.1.1 软件简要说明

本软件是基于端对端(P2P)、客户/服务器(C/S)和单机模式的中国

象棋博弈软件,是一个综合性的棋类网络游戏软件。主要包括了网络

信息传输管理,面向对象软件设计,服务器并发访问和人工智能等技

术。实现了点对点网络对战,服务器网络对战和人机对战功能。

2.1.2总体框架图

本系统采用端到端(P2P)、客户/服务器(C/S)和单机模式的应用软

件。其框架图如下:

客户端1

客户端2

客户端3

客户端4

图2.1 端到端(P2P)用例框架图

8 / 54

客户端1

客户端2

服务器

客户端4

客户端3

图2.2 客户/服务器(C/S)模式用例框架图

2.1.3各功能模块框架图

网络/单机中国象棋

资源模块棋盘、棋子模块棋房间、棋桌模块网络模块

棋盘类

棋盘

图片

资源

模块

棋子

图片

资源

模块

声音

资源

模块

棋房间类

服务

端网

络模

客户

端网

络模

棋子类

棋桌类

图2.3 网络/单机中国象棋各功能模块图

网络中国象棋

服务器程序

图2.4 网络中国象棋服务器端功能模块图

9 / 54

2.2 系统静态模型

2.2.1定义系统对象类

A.棋盘和棋子图片资源模块

为了方便软件的维护和软件界面的多样化发展,故将软件中所涉

及到的棋盘和棋子图片资源都统一用单独的模块进行维护。把图片资

源编译到动态连接库中,并用库中的一个导出类向外部提供资源。棋

盘图片资源模块只有一个静态类:CBoardImageManager;棋子图片资

源模块一个静态类:CChessImageManager。

B.声音资源模块

为了方便软件的维护和软件运行时及用户互动的多样化发展,故

将软件所涉及到的声音资源都统一用单独的模块进行维护。把声音资

源编译到动态连接库中,并用库中的一个导出类向外部提供资源。声

音资源模块只有一个静态类:CSoundManager 。

C.棋盘、棋子模块

棋盘、棋子模块是程序中重要的部分,它将界面和棋子运行的逻

辑分离开来。界面只要有一个棋盘的对象,使用棋盘类的接口就可以

了,而不用去管棋盘内部的处理过程。这样就大大的降低了模块间的

耦合程序。所有棋子的基类:CChess;CChess 类的子类:CBingzu、

CJiangshuai、CJu、CMa、CPao、CShiwei和CXiang。处理下棋逻辑

10 / 54

的部分就是棋盘类:CChessBoard。

D.棋房间、棋桌模块

棋房间中有很多棋桌,每个棋桌有两个位置可以供客户连接。棋

房间的信息都是用服务器管理,而客户端只是接受服务器发送过来的

房间信息并进行相应的处理;客户端可以选择一个位置座下,如果对

面也有人入座就可以进行对弈活动了。由于棋房间、棋桌在客户端程

序和服务端程序都会用到,所以也单独做成一个模块,这样可以利用

代码的复用。棋子房间类:CChessRoom;棋桌类:CChessTable。

E.网络模块

网络模块是本软件进行网络对战的必要模块,主要处理网络连

接,网络信息传输的。作为服务端,则有一个用于网络监听的SOCKET

对象来监听客户端的连接请求,当接受了客户端的连接请求之后,就

创建一个SOCKET对方及客户端的连接绑定。作为客户端,直接创建

一个SOCKET对方,通过服务端的地址和端口连接。网络监听SOCKET

类:CListenSocket;用于点对点客户端通信类:CClientSocket;用

于服务器模式客户端通信类:CClientSocketForServer。

F.人工智能模块

人工智能模块就是实现计算机博弈功能的部分,运用了现在比较

流行的计算机博弈算法和数据结构,使计算机具有了一定的棋力。所

11 / 54

用到的技术点有:棋盘表示、走法生成、搜索技术、局面评估、置换

表、杀手启发和静态搜索等技术。计算机博弈类:CAIPlayer。

G.服务器模块

服务器模块是整个软件的服务器部分,实现了客户端的并发访问

控制,让所有的客户端玩家都在统一的平台进行游戏,只要知道服务

器地址,而不用去管其他玩家所在的客户端地址。客户端及服务器的

通信有两个网络连接,一个用于下棋另一个用于接受房间信息。当服

务器接受到一个客户端的连接就创建一个SOCKET对方及之绑定,如

果再的客户端连接就再创建。监听客户端连接的类:CListenSocket;

用于同客户端连接的通信类:CClientSocket;棋房间类:

CServerChessRoom(继承于CChessRoom);棋桌类:

CServerChessTable(继承于CChessTable);用于向各个客户端分发

房间消息的观察者类:CPostInfoThread。

2.2.2分析类图

通过上一节分析得到了系统中的类,如下图所示:

12 / 54

ChessSound

CSoundManager

(from ChessSound)

ChessBoardImage

CBoardImageManager

(from ChessBoardImage)

ChessImage

CChessImageManager

(from ChessImage)

ChineseChess

CChineseChessView

(from ChineseChess)

ChessClasses

CChess

CChessBoard

(from ChessImage)

(from ChessImage)

CChessPointerList

CClientSocket

(from ChineseChess)

CClientSocketForServer

(from ChineseChess)

(from ChessImage)

CJiangshuai

(from ChessImage)

CJu

(from ChessImage)

CListenSocket

ChessRoomTable

CChessTable

(from ChessRoomTable)

ComputerChessPlayer

CAIPlayer

(from ComputerChessPlayer)

CChessRoom

(from ChessRoomTable)

图2.5 网络/单机中国象棋类图

ChineseChessServer

CPostInfoThread

(from ChineseChessServer)

CChineseChessServerView

(from ChineseChessServer)

CListenSocket

(from ChineseChessServer)

CServerChessRoom

CServerChessTable

CClientSocket

(from ChineseChessServer)

图2.6 服务器类图

13 / 54

2.3系统动态模型

2.3.1端到端(P2P)进行象棋对战

端到端进行象棋对战,是两个玩家直接进行连接游戏。首先,是

作为服务端的一方创建一个网络监听端,并打开一个网络端口,等待

客户端的连接。客户端则创建一个网络客户端,通过服务端的网络地

址和端口进行连接。服务端同意客户端连接请求之后也创建一个网络

客户商同请求连接的客户端进行绑定。这样就建立了网络连接,就可

以进行游戏了。时序图如下:

终端1终端2

1: 创建网络监听

2: 创建客户端连接

3: 通过IP和端口进行连接

4: 接受对连接请求

5: 开始对弈

6: 走子

图2.7 端到端对弈时序图

2.3.2客户/服务器(C/S)模式对战

客户/服务器模式进行对战,就需要有一个独立的服务器供客户

14 / 54

端的连接。服务器要管理好每一个客户端的连接,并且正确处理它们

之间正确的信息通信。首先服务器打开两个服务端的网络监听:一个

是用来监听客户端房间信息连接,另一个是用来对客户端对弈信息连

接。客户端通过服务器地址和端口及服务器进行连接。服务器监听到

网络连接之后就是创建两个网络通信客户端分别及客户端的两个连

接请求相绑定,并把房间信息发送到客户端。当客户端选择了一个位

置坐下,那么这个客户端的对弈通信连接就被绑定到该位置,当该位

置的对面也有人时,这个棋桌的双方就可以开始对弈了。时序图如下:

客户端1服务器

1: 创建网络监听等客户端连接

客户端2

2: 通过地址和端口连接

3: 通过地址和端口连接

4: 创建SOCKET绑定

5: 创建SOCKET绑定

6: 发送房间信息

7: 发送房间信息

8: 选择1桌左位

9: 选择1桌右位

10: 发送房间信息

11: 发送房间信息

12: 开始下棋

13: 开始下棋

15 / 54

图2.8 客户/服务器模式对弈时序图

2.3.3人机对战

人机对战是本设计的一个亮点,把人工智能同中国象棋结合起

来,让计算机具有了下棋的能力。用户只要选择好了电脑的执棋方,

以及选择好电脑的棋力水平,就可以同电脑对弈了。时序图如下:

GUI思考棋局

1: 指定电脑执红(黑)方

2: 设定电脑棋力水平

3: 开始下棋

4: 思考棋局

5: 电脑走一步棋

图2.9 人机对弈时序图

16 / 54

第三章 网络/单机中国象棋详细设计

3.1引言

在使用程序设计语言编写程序之前,需要对所采用的算法的逻辑

关系进行分析并设计出全部必要的过程细节,并给予清晰的表达,使

之成为编码测试和测试的依据。

3.2 程序系统结构

采用层次方框图和系统结构图的形式列出系统内的每个模块和

子程序的名称、标识符和它们之间的层次结构关系。

17 / 54

3.2.1 层次方框图

启动软件

模式选择

游戏控制

网络单机

模式模式

悔求认

棋和输

网络初始

连接电脑

走子

结束软件

对方走

图3.1层次方框图

18 / 54

外观调节

调调

节节

棋棋

子盘

外外

观观

3.2.2 系统结构图

ComputerChessPlayer

ChessSound

ChessImage

ChineseChess

ChessRoomTable

ChessClasses

ChineseChessServer

ChessBoardImage

图3.2 系统结构图

3.3 ChessSound模块设计说明

3.3.1模块描述

此模块最终编译为一个动态连接库文件,为软件运行过程中提供

所要的声音资源。模块内包涵了软件运行过程中所需的音频资源,只

有一个静态类:CSoundManager。

19 / 54

3.3.2 模块类图

图3.3 ChessSound模块类图

3.3.3类详细说明

表3-1 CSoundManager 详细说明表

类名

CSoundManager

概述:根据调用者的消息发出相应的声响。

数据成员

数据成员名

类型:HMODULE

module

说明:此为私有的静态数据成员,指向本身模块

的句柄。

成员函数

成员函数名

详细说明

参数:int SoundResID(音频资源ID)

PlayChessSound

返回类型:void

说明:此函数为静态成员函数,根据传入的ID

20 / 54

详细说明

参数,播放模块内的音频资源。

3.4ChessBoardImage模块

3.4.1模块描述

此模块为ChessClasses模板提供棋盘图片资源。模块内包涵了

棋盘图片资源。模块包涵了软件运行过程中所需的棋盘图片资源,只

有一个类CBoardImageManager。

3.4.2 模块类图

图3.4 CBoardImageManager类图

3.4.3 类详细说明

表3-2 CBoardImageManager 详细说明表

类名

CBoardImageManager

概述:为ChessClasses模板提供棋盘图片资源。

数据成员

数据成员名

21 / 54

详细说明

成员函数

成员函数名

详细说明

参数:CBitmap &bmp (用于绑定图片的位图

对象的引用)

int id (相应图片资源ID)

GetImage

返回类型:void

说明:此函数为静态成员函数,根据传入的

位图对象引用和图片ID参数,将相应的图

片绑定到位图对象。

3.5 ChessImage模块

3.5.1 模块描述

此模块为ChessClasses模板提供棋子图片资源。模块内包涵了棋

子图片资源。模块包涵了软件运行过程中所需的棋盘图片资源,只有

一个类CChessImageManager,类图和类详细说明表请参考3.4.2和

3.4.3节。

3.6 ChessClasses模块

3.6.1模块描述

该模块是依托于ChessImage模块和ChessBoardImage模块,包

涵所有的棋盘和棋子的业务处理逻辑,并使之及GUI部分完全分离。

充分的利用了MVC的设计模式,提高了软件的开发效率,也有利于软

22 / 54

件的维护。它在整个系统中占有重要的地位,实现了主程序网络对战

的走法判断的算法处理。

3.6.2 模块类图

图3.5 ChessClasses 模块类图

3.6.3 类详细说明

表3-3 CChess 类详细说明

类名

CChess

23 / 54

概述:此类为所有棋子类的基类,包括棋子都有的属性和方法。

数据成员

数据成员名

类型:CPoint

point

说明:表示棋子所在的点。

类型:bool

isRed

说明:表示棋子是否属于红方。

类型:bool

isBoos

说明:表示棋子是否是将或帅。

类型:int

idmap

说明:表示棋子所用图片资源的ID。

成员函数名

详细说明

参数:CDC *pDC, CBitmap * pBitmap

返回类型:void

DrawChess

说明:根据棋子当前的点位置信息和图片资

源,将棋子绘制到指定的CDC和CBitmap里。

参数:CPoint &point(打算让棋子要到达的

下一个点)

返回类型:bool

ChessGo

说明:此函数为虚拟函数。根据棋子当前所

在点、传入参数所表示的目标点,以及当前

棋盘的形势来判断一个走法是否合理。

24 / 54

详细说明

参数:int style

返回类型:void

ChangeStyle

说明:此函数为虚拟函数。改变棋子的外观

样式。

表3-4 CChessBoard 类详细说明表

类名

概述:棋盘类。

数据成员

数据成员名

onlyOneBoard

说明:静态数据成员,指向唯一实例的指针。

类型:CChess *[][];

chessArray

说明:存储棋盘棋子的二维级数。

成员函数

成员函数名

参数:无

返回类型:CChessBoard *

GetChessBoard

说明:静态成员函数,得到唯一的棋盘实例

指针。

参数:无

DelChessBoard

返回类型:void

25 / 54

CChessBoard

详细说明

类型:CChessBoard *

详细说明

说明:静态成员函数,删除唯一的棋盘实例。

参数:无

InitChessesRed

返回类型:void

说明:以红方初始化棋盘对象。

参数:无

InitChessesBlue

返回类型:void

说明:以黑方初始化棋盘对象。

参数:CDC *pDC, CBitmap *pBitmap

DrawChesses

返回类型:void

说明:将棋盘上所有棋子绘制出来。

参数:CDC *pDC, CBitmap *pBitmap

DrawChessBoard

返回类型:void

说明:将棋盘绘制出来。

参数:CPoint &point

返回类型:CChess *

GetChess

说明:根据传入的点,来得到该点的棋子,

如果该点没有棋子则返回空。

参数:CPoint &pointNew, CPoint &pointOld

返回类型:void

SetBoardPoint

说明:根据传入的终点和起来来下一步棋,

当然这必须是在判断该走法符合规则之后。

26 / 54

参数:无

Repent

返回类型:void

说明:悔一步棋。

3.7 ChessRoomTable模块

3.7.1 模块描述

此模块是为服务器模式下提供房间和棋桌对象而建立的。这个模

块会在主程序和服务器模块中共同使用。

3.7.2 模块类图

图3.6 ChessRoomTable 类图

27 / 54

3.7.3 类详细说明

表3-5 CChessTable 类详细说明表

类名

概述:棋桌类。

数据成员

数据成员名

类型:CPoint

topLeft

说明:棋桌左上角所在的点。

类型:CPoint

bottomRight

说明:棋桌右下角所在的点。

类型:CRect

leftBtnRect

说明:棋桌左座位所在的区域。

类型:CRect

rightBtnRect

说明:棋桌右座位所在的区域。

成员函数

成员函数名

详细说明

参数:CDC *pDC, CBitmap * pBitmap

DrawTable

返回类型:void

说明:根据当前棋桌状态绘制棋桌。

CChessTable

详细说明

表3-6 CChessRoom 类详细说明表

类名

CChessRoom

28 / 54

概述:棋房间类。

数据成员

数据成员名

chessTables

说明:房间内的棋桌。

类型:char[][]

TablesInfo

说明:所有棋桌的状态列表。

成员函数

成员函数名

详细说明

参数:CDC *pDC, CBitmap * pBitmap

DrawRoom

返回类型:void

说明:绘制房间。

参数:CDC *pDC, CBitmap * pBitmap

DrawTables

返回类型:void

说明:绘制房间内所有的棋桌。

参数:无

SetTablesInfo

返回类型:void

说明:设置房间内所有棋桌的状态。

3.8 ComputerChessPlayer模块

3.8.1 模块描述

此模块是中国象棋人工智能模块,使用了合理的棋盘表示数据结

29 / 54

详细说明

类型:CChessTable[][]

构,先进的走法生成算法,极大极小值搜索算法,局面加密算法,置

换表和杀手启发的静态搜索算法。

3.8.2 模块类图

图3.7 ComputerChessPlayer 类图

3.8.3 类详细说明

表3-7 CAIPlayer 类详细说明表

类名

概述:棋房间类。

数据成员

数据成员名

类型:bool

isFlipped

说明:是否翻转棋盘标志。

成员函数

成员函数名

30 / 54

CAIPlayer

详细说明

详细说明

参数:callBack : *pFun, pUserData : void

*

SetCallBack

返回类型:void

说明:设置回调函数。

参数:int sRow, int sCol, int dRow, int

dCol

MakeAIPlayerGo

返回类型:bool

说明:叫电脑下一步棋。

参数:无

Startup

返回类型:void

说明:重启电脑。

参数:CString bookPath

LoadBook

返回类型:void

说明:载入开局库。

参数:int level

SetAILevel

返回类型:void

说明:设置电脑级别。

参数:无

Repentance

返回类型:void

说明:悔棋。

31 / 54

第四章 网络对战实现

4.1 网络通信相关技术分析

不同的计算机要在网络上进行通信,就要知道目的计算机的IP

地址,所使用的通信协议,和所开通的端口(指定开通该端口的应用

程序接收信息)。

4.1.1 端口(port)

按照OSI七层模型的描述,传输层提供进程(应用程序)通信的能

力。为了标识通信实体中进行通信的进程,TCP/IP协议提出了协议

端口(protocol port)的概念。端口是一种抽象的软件结构(包括一些

数据结构和I/O缓冲区)。应用程序通过系统调用及某端口相绑定

(binding)后,传输层传给该端口的数据被相应的进程所接收,相应

进程发给传输层的数据都通过该端口输出。端口用一个整数型标识符

来表示,即端口号。端口号跟协议相关,TCP/IP传输层的两个协议

TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独

立。即基于TCP和UDP的程序可以有相同的端口号。端口使用一个

16位的数字来表示,他的范围是0~65535,1024以下的端口号保留

给预定义的服务。例如:http使用80端口,smtp使用25端口。

4.1.2 套接字(socket)

为了能够方便的开发网络应用软件,由美国伯克利大学在Unix

25 / 54

上推出了一种应用程序访问通信协议的操作系统调用socket(套接

字)。socket的出现,使程序员可以很方便的访问TCP/IP,从而开发

各种网络应用的程序。随着Unix的应用推广,套接字在编写网络软

件中得到了极大的普及。后来,套接字又被引进了Windows等操作系

统,成为开发网络应用程序的非常有效快捷的工具。套接字存在于通

信区域中。通信区域也叫地址族,它是一个抽象的概念,主要用于将

通过套接字通信的进程的共有特性综合在一起。套接字通常只及同一

区域的套接字交换数据(也有可能跨区域通信,但这只在执行了某种

转换进程后才能实现)。Windows Sockets只支持一个通信区域:网

际域(AF_INET),这个域被使用网际协议簇通信的进程使用。

4.1.3 网络字节顺序

不同的计算机存放多字节值的顺序不同,有的机器在起始地址存

放低字节,有的机器在起始地址存放高位字节。基于Intel的CPU,

即我们常用的PC采用的是低位先存。为保证数据的正确性,在网络

协议中需要制定网络字节顺序。TCP/IP协议使用16位整数和32位

整数的高位先存格式。

4.1.4 客户机/服务器模式

客户机/服务器模式在操作过程中采取的是主动请求的方式。

服务器方要先启动,并根据请求提供相应的服务:

1.

打开一个通信通道并告知本地主机,他愿意在某一地址和

26 / 54

端口上接收客户请求;

2.

等待客户请求到达该端口;

3.

接收到重复服务请求,处理该请求并发送应答信号了。接

收到并发服务请求,要激活一个新的进程(或线程)来处理

这个客户请求。新进程(或线程)处理此客户请求,并不需

要对其他请求作出应答。服务完成后,关闭此新进程及客

户的通信链路,并终止;

4.

返回第二步,等待另一个客户请求;

5.

关闭服务器。

客户方:

1.

打开一个通信通道,并连接到服务器所在主机的特定端口;

2.

向服务器发服务请求报文,等待并接收应答;继续提出请

求;

3.

请求结束后关闭通信通道并终止。

4.1.5 Windows Sockets的实现

Windows Sockets是Microsoft Windows的网络程序设计接口,

它是从Berkeley Sockets扩展而来的,以动态链接库的形式提供给

我们使用。Windows Sockets在继承了Berkeley Sockets主要特征

的基础上,又对他进行了重要扩充。这些扩充主要是提供了一些异步

函数,并增加了符合Windows消息驱动特性的网络时间异步选择机

制。

27 / 54

Windows Sockets 1.1和berkeley Sockets都是基于TCP/IP协

议的;windows Sockets 2从Windows Sockets 1.1发展而来,及协

议无关并向下兼容,可以使用任何底层传输协议提供的通信能力,来

为上层应用程序完成网络数据通讯,而不关心底层网络链路的通讯情

况,真正的实现了底层网络通讯对应用程序的透明。

4.1.6 套接字的类型

流式套接字(SOCK_STREAM):

提供面向连接、可靠的数据传输服务,数据无差错、无重复的

发送,且按发送顺序接收。

数据报式套接字(SOCK_DGRAM):

提供无连接服务。数据包以独立包形式发送,不提供无错保证,

数据可能丢失或重复,并且接收顺序混乱。

原始套接字(sock_raw)。

4.1.7 基于TCP(面向连接)的socket编程

服务器端程序:

1. 创建套接字(socket);

2. 将套接字绑定到一个本地地址和端口上(bind);

3. 将套接字设为监听模式,准备接收客户请求(listen);

4. 等待客户请求到来;当请求到来后,接受连接请求,返回

一个新的对应于此次连接的套接字(accept);

28 / 54

5. 用返回的套接字和客户端进行通信(send/recv);

6. 返回,等待另一客户请求;

7. 关闭套接字。

客户端程序:

1. 创建套接字(socket);

2. 向服务器发出连接请求(connect);

3. 和服务器端进行通信(send/recv);

4. 关闭套接字。

客户端不用绑定端口,因为当服务器接收到请求时已经记录下客

户端的端口号。

4.2 服务器通信相关技术分析

网络中国象棋服务器同时为多个客户服务,要求服务器具有很高

的稳定性,同时能够及时响应客户请求。性能的提高依赖服务器数据

处理的每一个环节,而通信部分位于体系底层,显得愈为重要。系统

资源的分配方式、Socket的管理、I/O模式的选择、并发服务以及负

载均衡策略等都直接影响到通信的效率。

4.2.1 资源分配机制

服务器在接受大量客户连接请求的时,需要地向系统申请资源,

如申请内存接收数据,申请线程处理业务逻辑,申请IO对数据收发

进行投递等。操作系统在处理应用程序的这些请求时,不断地创建资

29 / 54

源供应用程序使用,在应用程序释放资源后执行销毁和回收操作。

创建资源申请资源

返回资源

内存

线程

socket

...

销毁资源释放资源

回收资源

系统应用

图5.1 资源分配方式示意图

4.2 通信体系模式

4.2.1 网络协议的选择

合理的选择网络协议将使游戏更加的高效、稳定和安全。常用的

协议主要包括TCP/UDP协议和IP协议。在讨论哪种协议更适合网络

游戏之前我想有必要简略地描述一下它们的工作方式。TCP/IP和

UDP/IP是网络体系结构中非常重要的通信协议族。IP层负责网际数

据包的传输。UDP或者TCP层将大的数据包传给IP,IP将数据包分

割为小的子数据包,为每个数据包加上一个信封,计算出目的地的

IP地址,应该如何到达那里,然后将数据包发送到你的ISP。UDP和

TCP是网络体系中传输层定义两种传输协议,区别在于TCP保证数据

30 / 54

包的传送和有序,而UDP不保证。为了确定数据包通过Internet完

好无损地送到了目的方,TCP期待从目的方为它发送的每个数据包发

回一个应答包(网络用语是ACK)。如果它在一定时间内没有收到ACK,

它就停止发送任何新的数据包,重新发送丢失的数据包,并且将继续

这样做直到收到目的方的回应。网络中国象棋所传输的是正确的下棋

落子信息,需要很高的正确性,所以我选择TPC协议。

4.2.2 C/S及P2P相结合

客户机/服务器(Client/Server,缩写C/S)模型和端到端

(Peer-to-Peer,缩写P2P)模型是网络结构中最主要的两种结构模型。

C/S模型,一般客户机向服务器提出请求,而服务器则响应客户

机的请求,发送客户机要求的数据。在C/S模型内,客户机和服务器

承担着完全不同的角色;客户端及其它客户端不直接进行通信。网络

上所有客户端的消息都必须先发送给服务器,再由服务器将消息转发

给其它客户端。这种体系结构比较适用于多人在线对弈,多人在统一

的服务器中选择自由对手下棋。

而在P2P模型中,每个网络节点则扮演着同样的角色和对等的地

位。多个玩家参及的游戏中,各个玩家之间采用Peer-to-Peer的直

接通信方式,没有中心服务器来保存游戏状态,而是每个客户端保存

自己的游戏状态。在网络通信服务的形式上,一般采用浮动服务器的

形式,即其中一个玩家的机器既是客户端,又扮演服务器的角色,一

般由创建游戏的玩家担任服务器(主机)。

31 / 54

网络中国象棋将C/S及P2P两种模式都运用于其中,即将来可以

两个客户端直接端到端对战,也可以通过一个独立的服务器进行网络

对战。

4.3 异步I/O模式

服务器需要同时为大量客户服务,不能只为一个客户机服务而忽

视别的客户机,因此必然要求能够同时接收和处理多个服务请求。I/O

策略描述服务器如何发起多个I/O请求,即如何同时接收多个服务请

求。

异步I/O模型中,当服务器发起I/O操作时,内核在服务器处理

其他请求的同时,异步地执行操作直到完成。异步I/O的优点是服务

器不需要在I/O请求上阻塞,因为它们是异步完成的这使得服务器能

够高效地为高I/O延迟的操作进行伸缩。

网络中国象棋在传输房间信息时,会传输相对关大的数据量,故

采用的是异步I/O 模式传输数据。

4.4 并发服务策略

考虑到网络中国象棋的实际使用情况,目前用户使用量不会太

大,我采用的是一个请求一个线程(Thread-per-Request)的并发服务

策略。该模式在单独线程控制中处理每个来自客户的请求。当每个请

求到达时,服务器就会创建一个新线程来处理该请求。这种设计允许

每个线程使用同步I/O机制来发送接受数据。Thread-per-Request

32 / 54

优点是它的简单性和它利用多处理器平台上并行性的能力。

33 / 54

第五章 计算机博弈实现

5.1 前言

计算机博弈的研究广泛而深入。早在上世纪五十年代,就有人设

想利用计算机智能来实现计算机及人的对弈。国内外许多知名学者和

知名科研机构都曾经涉足这方面的研究,历经半个多世纪,到目前为

止已经取得了许多惊人的成就。1997年IBM的“深蓝”战胜了国际

象棋世界冠军卡斯帕罗夫,惊动了世界。同样计算机博弈在中国象棋

方面也有了很深入的研究,本章主要介绍本人在毕业设计中所用到的

计算机博弈搜索算法等相关技术。

5.2 机器博弈的基本思想

计算机博弈的核心思想就是对博弈树节点的估值过程和对博弈

树搜索过程的结合。

在博弈过程中的任何一个阶段,站在博弈双方其中一方的立场

上,可以构想出一个博弈树。这个博弈树的根节点是当前时刻的棋盘

局面,它的子节点是假设再走一步棋以后的各种棋局,子节点的子节

点是从子节点的棋盘局面再走一步棋的各种棋盘局面,以此类推,构

造整棵博弈树,直到可以分出胜负或和棋的局面。整棵的博弈树非常

庞大,且不同的棋类有所不同。

34 / 54

图5.1 博弈树示意图

博弈算法的任务就是对博弈树进行搜索找出对当前局面来讲要

走的最优的一步棋。对博弈树进行极大极小搜索,可以达到这一目的。

极大极小搜索,是因为博弈双方所要达到的目的相反,对一方有利的

局面正好是对另一方不利的局面,所以博弈的一方总是希望下一走是

子节点中取值最大者,而另一方恰恰相反。这便形成了极大极小过程。

由于算法不能也没有必要做到搜索整棵博弈树的所有节点,对于

一些已经确定为不佳的走法可以将以它为根节点的子树剪掉。搜索的

深度也不必深入到分出胜负的棋局,只需要在一定深度范围内对局面

进行评价即可。只有搜索空间缩小到一定程度,搜索才可以真正的进

行。当搜索进行到一定深度,用局面评价机制来评价棋局,按照极大

极小的原则选出最优,向上回溯,给出这一局面的父亲节点的价值评

价,然后再继续向上回溯,一直到根节点,最优走步就是这样搜索出

来的。

在这个过程中,最为重要的是搜索算法,高效的搜索算法可以保

证用尽量少的时间和空间损耗来达到寻找高价值的走步。但是真的想

35 / 54

要博弈程序棋力提高,还必须有一个好的局面评价机制,即估值算法

作后盾。就是说,用这个估值算法评价的局面价值必须是客观的、正

确的,可以确凿的评价局面的优劣以及优劣的程度。

5.3 棋盘局面表示

计算机并不能像我们正常人那样通过眼睛看就知道当前棋局的

形式,必须将现实当中的棋局映射到计算机理解的数据结构之中。棋

盘局面表示主要探讨的就是使用什么样的数据结构来表示棋盘。通常

用来描述棋盘及其棋盘上棋子信息的是一个二维数组。但是为了在以

后的搜索算法中使用更高效的方式,如图6.2所示我选择用一个256

个元素的一维数组中的90个元素来表示棋盘信息。

图5.2棋盘表示

如图5.2所示,我们用256位元素的BYTE数组来存储棋盘信息,

高亮部分从第3排到第12排、第3列到11列就是棋盘信息。使用这

样的数据结构的好处就是很容易判断棋子是否是在棋盘上,对棋子的

走法规定也是特别的容易。

36 / 54

5.3 走法生成

走法生成就是将一个局面的所有可能走法都列举出来的部分,它

显示了下一步可以有哪些走法。为了提高走法生成的效率,我事先根

据棋盘表示已经把产生棋子走法的相关条件特征放在一些数组里面。

5.3.1 判断棋子是否在棋盘中

如图5.3所示,在生成目标走法的时候会用到这个数组,当一个

棋子走一步,那么可以知道它下一步的目的位置,直接用目标位置作

为下标来访问这个数组对应的元素,如果得到的值为1,则说明棋子

的目的位置在棋盘上,如果得到的值为0,则说明棋子的目标位置不

在棋盘上。

图5.3 判断棋子是否在棋盘中的数组

5.3.1 判断棋子是否在九宫

如图5.4所示,在判断将帅的走法时会用到该数组,当一个将帅

走一步,那么可以知道它下一步的目的位置,直接用目标位置作为下

37 / 54

标来访问这个数组对应的元素,如果得到的值为1,则说明目的位置

在九宫之内,如果得到的值为0,则说明棋目标位置不在九宫这内。

图5.4 判断棋子是否在九宫的数组

5.3.2 走棋步长设定

如图5.2所示的棋盘,以帅(将)的步长设定举例如下。向左走一

步,目标点坐标为起始点坐标减1;向右走一步,目标点坐为起始点

坐标加1;向前走一步,目标点坐标为起始点坐标减16;向后走一步,

目标点坐标为起始点坐标加16。

则我们可以用一个数字表示棋子的起点或终点。假设sq为一个

棋盘上所在的点,要知道其在二维棋盘上所在的横坐标将其右移4位

再减3,即[(sq >> 4 ) – 3];要知道其在二维棋盘上所在的纵坐

标将其和15按位相及再减3,即[(sq & 15) - 3]。其他种类棋子的

规则及此类似。

38 / 54

5.4 搜索算法

5.4.1 博弈树

进行一局象棋对弈,棋局的任务变化形式都可以用一颗树来描

述,这样的树就称之为博弈树。在象棋博弈的过程中,参加博弈的是

对抗性的敌我,在对棋局的判断,不是只取决于某一方的意愿,更要

取决于对方所要采取的策略。博弈树把棋局所有的变化形势都收集到

一起,包括了博弈双方所有的可能较量过程,有成功有失败,也有在

实战中可能根本不会出现的棋局。计算机博弈就是要对这颗博弈树进

行搜索,找到最好的解决当前棋局的方案。博弈树的叶子结点就是一

种棋局的最终结果,但是由于计算机不可能真正搜索一个完整的博弈

树,所以我们只能让其搜索尽可能大的深度,再用良好的局面评估来

帮助其判断选择。

图5.5 博弈树示意图

39 / 54

5.4.2 极大极小算法

极大极小算法(Minimax Algorithm)是在搜索博弈树时用到的最

基本的方法。在博弈的过程中,双方要达到的目的是对立的,对红方

有利的形势正好是对黑方不利的形势。我们给每一个节点都会有一个

评估的值,对红方有利的值越大越好,反之对黑方有利的值越小越好。

该红方下子时,会选择所有子节点中取值最大的节点;该黑方下子时,

会选择所有子节点中取值最小的节点。

5.4.3 负极大值算法

负极大值算法是对极大极小值算法的一种优化,它将博弈双方的

选择方式统一。极大值极小值算法,有一方取极大值,另一方取极小

值;则在搜索过程中就要决定哪一方取极大值,哪一方取极小值,会

采取不同的方法处理。Knuth和Moore在1975年提出了负极大值

(Negamax)算法,消除了双方的差别,博弈的双方都取极大值。

5.4.4 Alpha-Beta搜索算法

单纯的使用极大极小值算法或者负极大值算法,就会在决定的深

度下,搜索博弈树的每一个分支。这样做由于搜索量非常的大,会使

搜索的时间大大浪费,效率低下。我们根据前一个分支所得到的结果,

在对下一个分支进行搜索的过程中就可以确定这个分支有没有必要

再进行下去。这样就是Alpha-Beta搜索算法的基本思想,可以减少

不必要的分支搜索。

40 / 54

图5.6 取最大值剪枝图5.7 取最小值剪枝

如图5.6所示A层是取极大值的节点,B层是取极小值的节点,

已经知道B层第一个节点取值为20,C层的第一个分支取值为15,

则B层第二个节点的取值最大也才为15所以A层是不可能会去选择

B的第二个节点的,所以C层以后的节点也没有必要在搜索下去了。

如图5.7所示取最小值时剪枝类似。

5.4.5 局面评估

局面评估是计算机在进行博弈树搜索时精确度的一大保证,它关

系到计算机下对棋局判断的精确度。只有有了良好的局面评估方法,

才能保证计算机找到最佳的走法。同时局面评估方法是对棋局的综合

评估,它的好坏直接决定计算机棋力的强弱。局面评估和搜索算法一

样是博弈系统的核心部分,它对博弈树的节点进行估值,然后搜索引

擎根据搜索算法进行向上搜索,最终找到最佳的走法。

41 / 54

本文标签: 服务器网络棋盘连接博弈