中国象棋网络对战平台系统.docx
《中国象棋网络对战平台系统.docx》由会员分享,可在线阅读,更多相关《中国象棋网络对战平台系统.docx(34页珍藏版)》请在冰豆网上搜索。
中国象棋网络对战平台系统
2010年度本科生毕业论文(设计)
中国象棋网络对战平台系统
学院:
电子信息工程学
专业:
网络工程
年级:
2007级
学生姓名:
学号:
导师及职称:
2010年6月
摘要
随着信息技术的发展,人民生活水平的不断提高。
联网游戏作为一种娱乐手段,正以其独特的魅力吸引着越来越多的玩家。
为了满足广大象棋爱好者也可以享受到网络所带来的便利,本论文完成了基于JAVA开发的中国象棋网络对战平台的设计和实现,它主要包含以下几大模块:
网络通信模块,图像绘制模块和规则设置模块。
网络通信模块使得玩家可以方便的迅速建立起网络连接,从而实现联机对弈和聊天功能;图像绘制模块实现棋盘更新以及棋子动态表示等功能;规则设置模块用于约束玩家的棋步。
在本系统中规定了行棋规则,以及吃棋规则。
此应用程序可以实现双人的网络对战,并能进行聊天,在象棋对战过程中,对获胜的一方及对方给与相应的信息提示。
相比传统的中国象棋对战平台,有功能更加齐全,操作更加简单,行棋更加人性化的优点。
关键词:
JAVA中国象棋网络对战平台
Abstract
Withthedevelopmentofinformationtechnology,peoplesstandardoflivinghaveimprovedconstantly.On-linegameasameansofentertainmenthasauniquecharmtoattractmoreandmoreplayers.Tomeetchesslovers,Inthispaper,wehavecompletedthedesignandrealizationofChineseChessnetworkBattleplatformbasedonJava.Itcontainsthefollowingmajormodules:
thenetworkcommunicationmodule,imagerenderingmoduleandtherulessetupmodule.NetworkCommunicationModuleallowsgamerscanquicklysetupaconvenientnetworkconnectioninordertoachieveanonlinegameandchatfunction;imagerenderingmoduletoupdatetheboardaswellasfunctionalpieces,suchasthedynamicthat;rulesbindingsettingsmoduleforstep-by-stepplayer'sgame.Inthissystemweprovidelinegamerules,gamerules.Thisapplicationcanbeachievedinthenetworkbetweentwopeople,andcanchat,intheprocess,Onthewinningsideandtheothertogivetheappropriateinformationtips.ComparedwithtraditionalChineseChessBattleplatform,ithasamorecompletefunction,simpleroperation,themorehumanchessadvantages.
Keywords:
JAVA;ChineseChess;network;Battleplatform.
第一章绪论
1.1背景
从九十年代的MUD时代[1],到99年《网络创世纪》进入中国,再到2001年盛大《传奇》的奇迹成功,直到今天国内网络游戏市场的一片兴盛势头。
网络游戏这个庞然大物已经在中国走过了好几个不同的阶段。
随着网络游戏的影响不断增大,网络游戏具备了越来越多的社会意义。
随着游戏与Java技术平台的合作,越来越多的游戏编程爱好者把Java当作实现游戏程序的首选。
现在,棋牌对弈类的游戏已经成为了众多人士闲暇之时用来消遣的竞技性游戏,它的娱乐性很强,而且还激发了头脑的思考,是游戏和智慧的结合体。
本文基于java技术开发与设计的网络平台对战系统的中国象棋游戏软件。
本人对中国象棋游戏特殊的行棋规则给予了细致的分析与理解,设计出了一种实时可行的方法,使每个棋子的行棋路线都严格遵循本身的行棋规则,使游戏的实战对弈得以实现。
1.2Java语言
1.2.1Java的发展历史
Java的发展历史,可以追朔到1990年。
当时SunMicrosystem公司为了发展消费类电子产品进行了一个名为Green的项目计划。
这个计划的负责任是JamesGosling。
起初他用具有面向对象特征的C++语言编写嵌入式软件,可以放在面包机或PDA(PersonalDigitalAssistant,个人数字主力)等小型电子消费这杯里,以使设备变得更为“聪明”,更具备人工只能。
但后来发现C++并不适合这类任务;因为C++常会使系统失效。
尤其在内存管理方面,c++采用直接地址访问方式。
需要程序员记录并管理内存资源。
这造成程序员编程的极大负担,并可能产生多个Bugs。
面包机上的程序错误可能使面包机烧坏甚至爆炸。
为了解决此类问题,Gosling决定开发一种新的语言,并取名为Oak。
它采用了大部分与C++类似的语法对可能具备危险性的功能加以改进,例如将内存管理改为由语言自己进行管理,以减少程序员的负担及可能发生的错误。
Oak是一种可移置的语言,它是一种平台独立的语言,能够在各种芯片上执行,可以降低设备的研发成本。
1.2.2Java的特点
Java是一种简单、安全、容易适用、面向对象、可移置、高性能、多线程的语言。
1.简单性
Java语言简单高校,基本Java系统(编译器和解释器)所占空间不足250KB由于Java最初是为了对家用电器进行集成控制而设计的,因而具备简单命了的特征。
2.面向对象
面向对象技术是现代工业的一次革新,提高了软件的模块化程度和重复适用率,缩短了软件开发时间,减低了卡发成本。
在Java之前虽然已经有面向对象的程序设计语言问问世,但有些如c++并不是完全的面向对象,而是面向过程和面向对象的混合体。
Java则是完全面向对象的程序设计语言。
3.安全性
Java是可以用在网路及分布环境下的网路程序设计语言。
在网路环境下,语言的安全性变得更为重要。
Java提供了许多安全机制来保证其适用上的安全性。
4.平台独立
平台独立指程序不受操作平台的限制,可以应用在各种平台上。
Java源程序经过编译后生成字节码文件,而字节码与具体的计算机无关。
只要计算机安装了能解释执行字节码的Java虚拟机JVM,就可以执行字节码文件,从而实现Java的平台独立性。
5.多线程
Java具备内建的多线程功能,可以将一个程序的不同程序段设置为不同的线程,使各线程并发、独立执行,提高系统的运行效率。
6.网络功能
Java能从全球网络资源获取所需信息,如数据文件、影响文件、声音文件等,并对所得信息进行处理,所以说Java是一种网络语言。
7.执行效率
Java的字节码需要经过Java虚拟机JVM解释成机器码才能执行,所以速度上较慢。
但是随着JVM技术的进步,使得其执行速度直逼C与C++。
1.3Socket编程
1.3.1关于TCP/IP协议
TCP协议是网络通信的基石,对此,Java专门提供了Socket的类库,在其中抽象出TCP协议通信的常用方法:
(1)客户端,首先发送TCP请求的是客户端,客户端一般是服务(比如数据查询服务)的请求者。
(2)服务器,在接收到客户端的请求后(确保同客户端的通信信道建立)服务器会向客户端提供服务。
服务器一般是服务的执行者,会向客户端返回服务执行的结果。
为了实现客户端同服务器端的通信,客户端首先发送一个“SYN”数据包。
如果服务器收到SYN标记,它将发回一个“SYN+ACK”数据包。
接着,客户端为了表示收到了这个SYN+ACK信息,会向服务器发送一个最终确认信息(ACK包)。
这种SYN,SYN+ACK,ACK的步骤被称为TCP连接建立时的“三次握手”,在这之后,连接就建立起来了,这个连接将一直保持活动状态,直到超时或者任何一方发出一个FIN(结束)信号。
这种通信模式也叫客户端/服务器(C/S)模式。
1.3.2服务器和客户机
网络最基本的目的就是让两台机器连接到一起,并相互“交谈”或者“沟通”。
一旦两台机器都发现了对方,就可以展开一次令人愉快的双向对话。
但它们怎样才能“发现”对方呢?
这就像在游乐园里那样:
一台机器不得不停留在一个地方,侦听其他机器说:
“嘿,你在哪里呢?
”
“停留在一个地方”的机器叫做“服务器”(Server);到处“找人”的机器则叫做“客户机”(Client)或者“客户”。
它们之间的区别只有在客户机试图同服务器连接的时候才显得非常明显。
一旦连通,就变成了一种双向通信,谁来扮演服务器或者客户机便显得不那么重要了。
所以服务器的主要任务是侦听建立连接的请求,这是由我们创建的特定服务器对象完成的。
而客户机的任务是试着与一台服务器建立连接,这是由我们创建的特定客户机对象完成的。
一旦连接建好,那么无论在服务器端还是客户机端,连接只是魔术般地变成了一个IO数据流对象。
从这时开始,我们可以象读写一个普通的文件那样对待连接。
所以一旦建好连接,我们只需使用自己熟悉的IO命令即可。
这正是Java联网最方便的一个地方。
1.4中国象棋介绍
中国象棋是我国国粹,历史悠久,普及流行。
下棋双方根据对棋局形势的理解和对棋艺规律的掌握,调动车马,组织兵力,协调作战。
在棋盘这块特定的战场上,进行着象征性的军事战斗。
以下对游戏规则作简要说明。
(1)棋子
象棋中棋子共三十二个,分为红黑两组,各十六个,由对弈双方各执一组,兵种是一样的,分为七种。
红方:
帅、仕、相、车、马、炮、兵。
黑方:
将、士、象、车、马、炮、卒。
其中帅与将、仕与士、相与象、兵与卒的作用完全相同,仅仅是为了区分红棋和黑棋。
在本设计中为了简便,棋子只有将、士、象、车、马、炮、兵,区分仅仅为颜色不同。
(2)棋盘
棋子活动的场所,叫做棋盘。
在长方形的平面上,绘有九条平行竖线和十条平行的横线相交组成,共九十个交叉点,棋子就摆在这些交叉点上。
中间第五、第六两横线之间未画竖线的空白地带,称为河界。
整个棋盘就以河界分为相等的两部分,两方将、帅坐镇。
画米字方格的地方,叫做九宫。
(3)将或帅
移动范围:
它只能在九宫内移动。
移动规则:
它每一步只可以水平或垂直移动一点。
(4)士
移动范围:
它只能在九宫内移动。
移动规则:
它每一步只可以沿对角线方向移动一点。
(5)象
移动范围:
河界的一侧。
移动规则:
它每一步只可以沿对角线方向移动两点,另外,在移动的过程中不能够穿越障碍。
(6)马
移动范围:
任何位置。
移动规则:
每一步只可以水平或垂直移动一点,再按对角线方面向左或者右移动。
另移动的过程中不能够穿越障碍。
(7)车
移动范围:
任何位置。
移动规则:
可以水平或垂直方向移动任意个无阻碍的点。
(8)炮
移动范围:
任何位置。
移动规则:
移动起来和车很相似,但它必须跳过一个棋子来吃掉对方的一个棋子。
(9)兵
移动范围:
任何位置。
移动规则:
每步只能向前移动一点。
过河以后,它便增加了向左右移动的能力,兵不允许向后移动。
(10)在走棋的时候,如果棋子能够走到的位置有对方的棋子存在,就可以把对方的棋子吃掉而占领该位置;
(11)胜、负
帅(将)被对方吃掉。
第二章系统的分析与设计
2.1.网络对战平台系统的介绍
(1)服务器可以同时服务10桌,每桌允许两个玩家通过对战平台对弈,并且可以有多个旁观者。
(2)玩家自由选择坐在哪一桌的哪一方。
如果两个玩家坐在同一桌,双方应都能看到对方的状态。
旁观者可随时进入游戏房间观看游戏进行情况。
(3)进入游戏界面时有总时间显示,显示对弈双方用户名及下棋步数,双方以一定的时间交替走棋子,一方走棋子的时候,另一方鼠标点击无效。
任意选择棋子并方框闪烁提示,同时,对方也可看见提示。
(4)游戏开始后玩家必须按照下一步提示信息放置棋子,且只能移动本方棋子。
如果玩家单击对方棋子,则表示吃掉该棋子,游戏规则严格按照中国象棋走法规则。
(5)如果一方的将或帅被吃,表明另一方获胜。
(6)在同一房间的用户可以聊天。
(7)游戏结束时提示
(8)游戏结束或强制退出后发消息给服务器
(9)旁观
2.2系统构成
中国象棋网上对弈系统是主要由:
数据结构、图像绘制、规则设置、网络通信、棋子操作五部分构成。
用户通过客户端登陆后即可进入对战平台。
2.3相关技术
2.3.1点对点通信
从OSI参考模型的应用层来看,可认为网络是由工作站和服务器组成的,但从传输层和网络层的角度看,工作站和服务器没有本质的区别,它们都是连接到网络上的一台机器,都可以用网络地址或名称来代替。
它们之间的通信就是所谓的点对点通信,也叫对等通信。
在局域网上,点点通信意味着两个工作站可以直接对话而不用经过文件服务器中转。
通信的基础是套接口(Socket),一个套接口是通讯的一端。
socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
Socket实质上提供了进程通信的端点。
进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。
正如打电话之前,双方必须各自拥有一台电话机一样。
在网间网内部,每一个socket用一个半相关描述:
(协议,本地地址,本地端口)。
一个完整的socket有一个本地唯一的socket号,由系统分配。
最重要的是,socket是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的socket系统调用。
客户随机申请一个socket(相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个socket号;服务器拥有全局公认的socket,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。
socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。
服务器socket半相关为全局所公认非常重要。
假如通信双方没有任何一方的socket固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能在这一端上你可以找到与其对应的一个名字。
一个正在被使用的套接口都有它的类型和与其相关的进程。
套接口存在于通讯域中。
通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。
套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。
WindowsSockets规范支持单一的通讯域,即Internet域。
各种进程使用这个域互相之间用Internet协议族来进行通讯。
2.3.2数据库和数据结构的设计
数据库有一个userinf表,含有user和password2个属性,user为主键,分别用来存用户名和密码,如图:
图2-2数据库userinf表
数据结构设计如下:
HashMapallsocket=newHashMap();用来绑定客户端的用户名和相对应的服务器端得套接字。
HashMapfinduser=newHashMap();绑定下棋的2个用户。
ArrayListready=newArrayList();存已经准备的用户的准备信息。
HashMap>spectator;存旁观者与被旁观者。
2.2服务器端与客户端的通信基本原理
图2-1面向连接通信原理图
本设计采用流套接字(TCP/Socket)通信原理,服务器运行服务程序时为它分配一个端口,客户端连接服务器的时候通过绑定客户端的用户名和相对应的服务器端的套接字进行连接。
建立连接后在服务器端的套接字和客户端的套接字是“绑定”在一起的,这样,通过套接字客户端可以向服务器发送信息,服务器接受后也可以向客户端返回信息,底层的套接字通信如上图2-1所示。
每当一个连接建立后,服务器就实例化一个线程并将套接字作为其构造函数的参数传入。
多个连接建立后,图示如下:
数据结构与数据库
Socket4
Socket3
Socket2
Socket1
Client1
Client2
Client3
Client4
图2-2多个客户端与服务器建立连接
第3章系统模块的设计
3.1客户端系统模块设计
在这里分析了棋盘设计,棋子设计以及游戏房间、棋盘、棋子的关系。
3.1.1棋盘设计
在客户端,棋盘上的棋子都是一个个的对象,放在集合GraphicsList的对象graphics里,相当于客户端的棋盘。
当初始化棋盘时,即在集合graphics中添加一个个棋子对象,并显示在棋盘图片对应的位置上。
客户端的棋盘由一个用户控件构成,其背景图即为棋盘图片。
因此该控件要响应MouseDown、MouseMove、MouseUp、Paint事件。
标记flag:
表示鼠标第几次选中对象,其初始值为零。
lastPoint:
表示鼠标上一次选中棋子时的点坐标。
lastObject:
表示鼠标上一次选中的对象。
(1)MouseDown事件:
{
if(flag==0)
{
判断鼠标按下位置Point是否存在棋子对象w
若存在{选中该对象;flag=1;lastPoint=Point;lastObject=w;}
若不存在{则返回;}
}
If(flag==1)
{
判断lastObject是否满足移动条件
若满足
{
判断鼠标按下位置Point是否存在棋子对象w
若存在
If(lastObject.ChessColor!
=w.ChessColor)
{
删除w;把lastObject移动到该点;Flag=0;返回;
}
else{Flag=0;返回;}
若不存在
{直接把lastObject移动到该点;flag=0;返回;}
}
若不满足
{令flag=0;返回;}
}
}
(2)MouseMove事件:
当鼠标移动到棋子上方时显示为手型图标,表示可以移动该棋子。
其他位置鼠标形状为默认状态。
(3)Paint事件:
绘制graphics里的棋子对象。
依次画出各个棋子对象在棋盘上的位置,然后刷新。
(4)SetChess(inti,intj,intChessColor,intChessID)函数:
把ID号等于ChessID的棋子放置在坐标i,j所在的位置上。
(5)DeleteChess(intchessID)函数:
删除ID号为chessID的棋子。
(6)AddNewObject()函数:
添加新的棋子对象。
(7)SelectObject(intchessID)函数:
选中指定ID的棋子,显现其句柄。
(8)ResetGrid():
初始化棋盘。
添加所有棋子对象,并放置在适当位置。
3.1.2棋子设计
象棋的棋子有七种:
将、士、象、车、马、炮、兵。
他们之间有一些共同的属性和方法,同时也有自己的特点。
因此在设计棋子时,首先写了一个基类,把他们共同的属性和方法放在里面,然后不同的棋子继承这个基类,并拥有自己的属性和方法。
设计的类图如下图3-1所示:
ChessItem
#Ischecket:
bool=false
+ObjRectange:
object
+chesscolor:
int=0
GirdX:
int
GirlY:
int
-OriginalBitman:
Object
+GetHanle():
Object
+DrawTracker():
void
+Draw():
void
+GetHanlerectangle():
object
+PointlnObject():
bool
+IsMoveItem():
bool
+Move():
void
+SetChessPosition():
void
ChessBing
+Drow():
void
+IsMoveItem():
bool
Chessche
+Drow():
void
+IsMoveItem():
bool
ChessMa
+Drow():
void
+IsMoveItem():
bool
ChessPao
+Drow():
void
+IsMoveItem():
bool
ChessShi
+Drow():
void
+IsMoveItem():
bool
ChessXiang
+Drow():
void
+IsMoveItem():
bool
ChessJiang
+Drow():
void
+IsMoveItem():
bool
图3-1棋子类图
棋子的核心函数功能:
(1)IsMove(intdX,intdY,ChessBordpallete)函数:
用于判断棋子是否移动,其返回值为布尔型,其中三个参数的含义分别为:
dX表示移动的X坐标步长,dY表示移动的Y坐标步长,pallete表示棋盘控件对象。
(2)Move(intdX,intdY)函数:
把棋子在X坐标上移动dX距离,在Y坐标上移动dY距离。
(3)SetChessPosition(inti,intj)函数:
把当前棋子左上角的位置设置为i,j坐标所对应棋盘上的位置。
3.1.3游戏房间、棋盘、棋子的关系
一个游戏房间对应一个棋盘,在棋盘上可以添加棋子、删除棋子、移动棋子,这些棋子放在一个集合中,该集合可以想像成盛放棋子的容器。
他们之间的关系如下图3-2所示。
图3-2客户端各个类的关系图
核心函数功能介绍:
(1)SetEnterUserTips(stringuerTypeString,stringnames,stringroomOnLineNames)函数:
设置用户进入房间看到的信息。
userTypeString表示用户类型(0黑方,1红方,2旁观),names表示昵称(格式:
黑方名/红方名/旁观者),roomOnLineNames已经进入房间的用户昵称。
(2)SetExiteUserTips(stringuserTypeString,stringnames)函数:
设置用户退出房间后显示的信息,自己退出不需要调用此方法。
userTypeString表示用户类型(0黑方,1红方,2旁观),names表示昵称(格式:
黑方名/红方名/旁观者)。
3.2服务器端系统模块设计
在系统总体分析和设计中,我们已经讨论了服务器端应包含的所有类,现对这些类进行详细的说明。
它们之间的关系如下图3-3所示。
图3-3服务器端类图
服务器端的棋盘Grid是一个二维数组,其中每一个元素都是一个结构类型,含有两个int型的变量ChessCo