基于JAVA中国象棋网络对弈软件毕业设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
中国象棋网络版是一款可以实现多人同时在线的网络对弈象棋软件。
中国象棋网络版采用C/S架构,由跨平台的Java语言和MySQ L数据库开发,在开发过程中使用了多线程、java swing、Socket编程以及TCP和UDP协议等技术。
中国象棋网络版提供了:棋友状态列表,弈棋邀请,观看他人弈棋,棋谱记录和保存,在线交流,快速注册等功能。
服务端提供了:发布系统消息提示,服务器状态显示,在线棋友管理等功能。
最后,对系统进行测试表明,系统功能达到了预期的要求,实现与同类的象棋软件如QQ象棋类似的功能,具有界面友好,操作简便,运行稳定的特点,完成设计要求的功能。
本系统不足之处在于没有实现人机对弈、聊天记录的本机存储,将在以后的更新版本中逐步完善。
关键词:对弈,Java,多线程
Abstract
Chinese chess online is a software can support multiplayer play chess online at the same time .
The chinese chess online, based on the architecture of C/S, is developed by MySQL database and Java, a cross-platform language. In the development, multi-thread, Java swing, Socket programming and TCP/UDP protocol are applied. First, the newer can fast register and then get an account in the network version. The players can invite others to join, watch others playing, communicate with others online and hold chess-playing records. Of course ,there exists a status bar to check the states of all chess players. Here the service releases the notes of the system information, displays the state of itself, and deal with chess players online, etc. The test of the system indicates, all the expected functions have been realized. It has the similar functions just like the QQ chess, an online software of kind. The interface is on good terms, and the operation is easy, and also it runs stably. However, disappointingly, the computer can't be an opponent of the players, and the users' computer can't keep the chat records itself. These are both the weak points and the improvements will be made in the new version.
Keywords: chess-playing , Java, Multithreading
目录
1. 前言 (1)
1.1课题的研究目的和意义 (1)
1.2开发和运行环境 (1)
1.2.1开发环境 (1)
1.2.2运行环境 (1)
2.JAVA和网络套接字技术 (2)
2.1J AVA简介 (2)
2.2J AVA图形技术 (2)
2.3J AVA事件响应技术 (4)
2.3.1鼠标事件响应 (4)
2.3.2键盘事件响应 (4)
2.4网络网络通信技术 (4)
2.4.1 TCP (4)
2.4.2 UDP (4)
2.4.3 Socket (5)
2.4.4 Java实现 (5)
3.中国象棋网络版架构设计与通信设计 (7)
3.1中国象棋网络版架构分析与设计 (7)
3.2中国象棋网络版数据通信设计与实现 (7)
3.2.1通信协议选择 (7)
3.2.2数据类型分析 (9)
3.2.3数据格式设计 (11)
3.2.4数据通信与处理伪码示例 (13)
4.中国象棋网络版客户端实现 (16)
4.1客户端基础架构 (16)
4.2客户端GUI设计 (16)
4.2.1弈棋主面板 (16)
4.2.2用户列表面板 (17)
4.2.3棋谱记录面板 (17)
4.2.4用户交流面板 (17)
4.3客户端类设计 (18)
4.3.1 chessboardP (18)
4.3.2 userP (18)
4.3.3 chessstateP (19)
4.3.4 chatP (19)
4.3.5数据处理相关类 (19)
4.4客户端主要算法伪码示例 (20)
4.4.1棋子和棋盘状态维护算法简介 (20)
4.4.2棋盘规则马规则伪码示例 (20)
4.4.3棋子选择和移动伪码示例 (20)
4.4.4棋谱生成部分伪码示例 (21)
4.4.5棋局结果判定伪码示例 (22)
4.4.6通信数据处理和分发算法简介 (22)
4.4.7棋子选中闪烁算法简介 (22)
5.中国象棋网络版服务器端实现 (23)
5.1服务器端基础架构 (23)
5.2服务器端GUI设计 (24)
5.3服务器端类设计 (25)
5.3.1 serverGUI (25)
5.3.2 serverListener (25)
5.3.3 chessroom (26)
5.3.4 databaseinterface (26)
5.4数据库相关开发 (26)
5.4.1数据库需求分析 (26)
5.4.2数据库表设计 (26)
5.5服务器端主要算法伪码示例 (27)
5.5.1登录注册时与数据库交互伪码示例 (27)
5.5.2弈棋聊天用户列表维护数据转发算法简介 (28)
5.5.3 MD5加密产生密匙伪码示例 (28)
5.5.4踢用户下线伪码示例 (28)
6.中国象棋网络版运行测试 (30)
6.1.客户端功能测试 (30)
6.1.1用户上线响应异常 (30)
6.1.2弈棋过程中将可以出九宫异常 (31)
6.2服务器端测试 (32)
6.2.1用户下线后服务器在线用户数统计异常 (32)
6.2.2对正在弈棋的用户强制下线异常 (33)
6.3测试总结 (33)
结束语 (34)
致谢 (35)
参考文献 (36)
附录 (37)
1.前言
1.1 课题的研究目的和意义
本课题的目的是采用Java语言编写实现网络象棋对弈软件,实现中国象棋的网络对弈,拥有用户列表、棋谱查看保存、在线交流等功能。
虽然现在已经有了许多网络对弈软件,其中大多数都很优秀,所以本课题不作对比性开发。
通过中国象棋网络版的开发熟练掌握在Eclipse下的Java开发,详细了解Socket网络套接字技术、TCP和UDP协议,掌握MySQL应用。
1.2开发和运行环境
1.2.1开发环境
操作系统Windows7
开发平台 MyEcilpse 8.5
JDK1.6.0_17
数据库 MySQL5.1
MySQL Workbench 5.2 CE
1.2.2运行环境
Window 7、Windows xp等各类支持Java的操作系统。
2.Java和网络套接字技术
2.1 Java简介
Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。
Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口(Application Programming Interface、简称API)构成。
Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。
在硬件或操作系统平台上安装一个Java平台之后,Java 应用程序就可运行。
现在Java平台已经嵌入了几乎所有的操作系统。
这样Java程序可以只编译一次,就可以在各种系统中运行。
Java应用编程接口已经从1.1x版发展到1.2版。
目前常用的Java平台基于Java1.5,最近版本为Java1.7。
Java分为三个体系JavaSE(Java2 Platform Standard Edition,java 平台标准版),JavaEE(Java 2 Platform,Enterprise Edition,java平台企业版),JavaME(Java 2 Platform Micro Edition,java平台微型版)。
本软件采用的是JavaSE。
Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。
Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。
2.2 Java图形技术
Java是面向对象的语言,运用Java开发图形界面相当便捷,Java提供了JFrame、JPanel、JButton、JLabel等窗口和组件。
Java采用了触发更新的方式更新界面,如果我们需要在界面上添加上自己的图形则只需要重写paint方法。
AWT(Abstract Windowing Toolkit),中文译为抽象窗口工具包,是Java 提供的用来建立和设置Java的图形用户界面的基本工具。
AWT由Java中的java.awt包提供,里面包含了许多可用来建立与平台无关的图形用户界面(GUI)的类,这些类又被称为组件(components)。
抽象窗口工具包(Abstract Windowing Toolkit) (AWT)是Java的平
台独立的窗口系统,图形和用户界面器件工具包。
AWT是Java基础类 (JFC)的一部分,为Java程序提供图形用户界面(GUI)的标准API。
AWT提供了Java Applet和Java Application中可用的用户图形界面GUI中的基本组件(components)。
由于Java是一种独立于平台的程序设计语言,但GUI却往往是依赖于特定平台的,Java采用了相应的技术使得AWT能提供给应用程序独立于机器平台的接口,这保证了同一程序的GUI在不同机器上运行具有类似的外观(不一定完全一致)。
Java1.0的AWT(旧AWT)和Java1.1以后的AWT(新AWT)有着很大的区别,新的AWT克服了旧AWT的很多缺点,在设计上有较大改进,使用也更方便,这里主要介绍新的AWT, 但在Java1.1及以后版本中旧的AWT的程序也可运行。
抽象窗口工具包AWT (Abstract Window Toolkit) 是 API为Java 程序提供的建立图形用户界面GUI (Graphics User Interface)工具集,AWT可用于Java的applet和applications中。
它支持图形用户界面编程的功能包括:用户界面组件;事件处理模型;图形和图像工具,包括形状、颜色和字体类;布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关;数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴。
Java释出的时候,AWT作为Java最弱的组件受到不小的批评。
最根本的缺点是AWT在原生的用户界面之上仅提供了一个非常薄的抽象层。
例如,生成一个AWT的复选框会导致AWT直接调用下层原生例程来生成一个复选框。
不幸的是,一个Windows平台上的复选框同MacOS平台或者各种UNIX 风格平台上的复选框并不是那么相同。
这种糟糕的设计选择使得那些拥护Java“一次编写,到处运行(write once, run anywhere)”信条的程序员们过得并不舒畅,因为AWT并不能保证他们的应用在各种平台上表现得有多相似。
一个AWT应用可能在Windows 上表现很好可是到了Macintosh上几乎不能使用,或者正好相反。
在90年代,程序员中流传着一个笑话:Java的真正信条是“一次编写,到处测试(write once, test everywhere)”。
导致这种糟糕局面的一个可能原因据说是AWT从概念产生到完成实现只用了一个月。
在第二版的Java开发包中,AWT的器件很大程度上被Swing工具包替代。
Swing通过自己绘制器件而避免了AWT的种种弊端:Swing调用本地图形子系统中的底层例程,而不是依赖操作系统的高层用户界面模块。
Swing是一个用于开发Java应用程序用户界面的开发工具包。
它以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。
Swing 开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。
工具包中所有的包都是以swing作为名称,例如javax.swing,javax.swing.event。
2.3 Java事件响应技术
Java事件响应技术采用监听事件产生组件的事件产生来响应事件。
2.3.1鼠标事件响应
鼠标操作可以产生ActionEvent,MouseEvent,MouseWheelEvent事件,我们可以创建一个继承ActionListener接口的MyActionListener类用来监听鼠标产生的ActionEvent事件,在MyActionListener中重写actionPerformed方法,在此方法中可以加入当鼠标产生ActionEvent事件时的响应操作,我们通过创建另一个继承MouseListener接口的MyMouseListener类用来监听鼠标产生的MouseEvent,在MyMouseListener中重写mouseClicked方法,在此方法中可以加入鼠标产生MouseEvent事件时的响应操作。
2.3.2键盘事件响应
键盘操作可以产生KeyEvent事件,我们可以创建一个继承KeyListener接口的MyKeyListener类用来监听键盘产生的KeyEvent事件,在MyKeyListener 中重写keyPressed方法,在此方法中可以加入键盘产生KeyEvent事件时的相应操作。
2.4 网络网络通信技术
2.4.1 TCP
TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。
在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。
TCP是TCP/IP体系中非常复杂的一个协议,TCP的最主要的特点有:
1)TCP是面向连接的运输层协议。
2)每一条TCP连接只能有两个端点,每一条连接只能是点对点的。
3)TCP提供可靠交付的服务。
4)TCP提供全双工通信。
5)面向字节流。
2.4.2 UDP
UDP 是User Datagram Protocol的简称,中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
它是IETF RFC 768是UDP的正式规范。
用户数据报协议UDP只在IP的数据报服务之上增加了很少一点的功能,这就是复用和分用的功能以及差错检测的功能。
UDP的主要特点是:
1)UDP是无连接的,即发送数据之前不需要建立连接,因此减少了开
销和发送数据之前的时延。
2)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维
持复杂的连接状态表。
3)UDP是面向报文的。
2.4.3 Socket
socket的英文原义是“孔”或“插座”。
作为4BDS UNIX的进程通信机制,取后一种意思。
通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
如何使用Socket开发一个Server-Client模型的程序。
服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。
客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。
要学Internet上的TCP/IP网络编程,必须理解Socket接口。
Socket接口设计者最先是将接口放在Unix操作系统里面的。
如果了解Unix系统的输入和输出的话,就很容易了解Socket了。
网络的Socket数据传输是一种特殊的I/O,Socket 也是一种文件描述符。
Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
2.4.4 Java实现
Java提供了灵活方便的类实现Socket通信,包中拥有丰富的API,与TCP和UDP相关的有。
InetAddress:用来封装IP地址的类。
ServerSocket:用来产生服务器套接字实例的类。
Socket;用来产生客户端套接字实例的类。
DatagramPacket:用来产生数据包实例的类。
DatagramSocket:用来实现UDP套接字的类。
另外java.io提供了InputStream和OutputStream虚类实现对字节流操作的封装。
3.中国象棋网络版架构设计与通信设计
3.1 中国象棋网络版架构分析与设计
本软件要实现多用户在线弈棋,所以采用C/S架构,服务器端和客户端分别完成各自的功能。
服务器需要实现登录注册和弈棋通信两大功能模块,提供登录、注册、数据转发、在线用户数据维护、建立弈棋等服务功能。
将服务器分为两大模块是因为这两个模块可以完全分离,互不影响,独立运行,保证了登录模块出现异常不会影响到已在线用户的用户体验,提高了服务器的可用性。
客户端需要实现登录、注册、弈棋、用户列表、实时交流和棋局状态记录显示六大功能,需要设计登录、注册、弈棋、用户列表维护、实时交流、棋局状态记录显示、登录注册和弈棋通信八大模块。
3.2中国象棋网络版数据通信设计与实现
3.2.1通信协议选择
经架构分析将登录注册模块与弈棋的通信模块分开设计,又根据两个模块对网络通信可靠性和即时性要求不同,所以设计登录模块的网络层通信协议为UDP 协议,弈棋通信模块的网络层通信协议为TCP协议。
效率分析:
UDP协议是无连接、不需要包检测和重传机制的,优点是网络通信效率高。
而TCP协议是面向连接的,需经过三次握手,拥有包检测和重传机制,保证了数据完整和正确性,优点是可靠。
登录注册模块需要提供一个高效但不一定可靠的响应,即该模块允许在通信过程中丢包。
每一次登录注册请求与响应只产生一个往返的数据报,UDP协议的无连接特性保证的数据通信的高效性。
面对恶意登录请求,如果选择TCP协议,大量的建立连接会占用过多的系统资源,产生很高的服务器负载,影响服务质量,降低客户的用户体验。
所以登录注册模块选择UDP协议可以带来一个高效益的服务响应。
弈棋通信模块需要给客户提供一个高可靠性和稳定性的连接,即不允许在通信过程中发生数据丢失而不处理的事件。
如果采用UDP协议需要在服务器应用中添加包检测与重传功能,增加了服务器负载。
且弈棋通信是一个较长的数据通信过程,使用UDP协议并不能很大提供数据通信效率,而TCP协议很好的提供了包检测和重传机制,保证了数据通信的高可靠性和稳定性。
服务器与客户端的典型数据通信与处理流程图如图3.1。
图3.1 服务器与客户端网络通信流程图
服务器端
3.2.2数据类型分析
要实现在线对弈,就需要有数据的交互,根据预设的功能需要最基础的就有登录、登出、棋子移动、聊天等数据的通信,还有其它一些如:棋子的选择、用户列表更新、棋谱的传输等数据通信。
如果不加分类很容易产生混乱,所以根据数据所属的不同模块将这些数据进行分类。
数据传输方式以“UTF-8”字符编码明文传输,其消息字符串message 中的
第一个字符为系统消息,将第一个字符char 的2个字节16bit 分为4级消息 char&0xf00 char&0xf 符号位 第二级消息 第四级消息
将此字符进行位移运算分离各级消息
第一级消息 第三级消息 char&0xf000 char&0xf0
关于棋盘的消息格式为:4字节字符串,前2个字节表示系统消息,后2个字节表示用户操作消息:
X 坐标 y 坐标
源x 坐标 源y 坐标
目的x 坐标 目的y 坐标
用户积分 用户状态 8-16个
";"为分隔符,分割 每个用户的信息 多个
服务器发送给旁观者的棋盘状态是一个由24个字符组成的字符串:
第一个字符为系统消息
其余23个字符分别携带棋盘上的90个位置的棋子状态
其中空子位为0
1-7代表黑方棋子:1 车 8-14代表红方棋子:8 车 2 马 9 马 3 象 10 相 4 士 11 仕 5 将 12 帅 6 炮 13 炮 7 兵 14 卒
3.2.3数据格式设计
根据3.2.2节中对数据格式的分析,设计出系统消息格式(详见表3.1)。
给不同的功能模块设计不同的系统命令(如表3.1中Chessboard中第一级命令格式为CHESSBOARDPANE 0x1000/0001,其中0x1000表示此命令的十六进制数值,0001表示为此命令的部分二进制数值,CHESSBORADPANE表示此命令所实现的消息内容)。
3.2.4数据通信与处理伪码示例
数据通信格式为系统命令类型+消息数据。
此伪码示例简要的阐述了从登录到弈棋的数据通信与处理过程。
Begin:
第一步(登录):
Client (Login): send UDP packet(登录消息+用户名+密码)
Server (Login and Register Thread): 接收Client的UDP包,解析数据内容为 command + message
if(command == 登录消息)
查询数据库中此用户名的密码
if(无此用户或密码不一致)
send UDP packet(登录失败)
else 将用户名经MD5加密
send UDP packet(登录成功+MD5加密后的密匙)
else if(command == 注册消息)
if(数据库中有此用户)
send UDP packet(注册失败)
else send UDP packet(注册成功)
else 错误消息类型,丢弃
Client(Login):接收Server的UDP响应包,解析数据内容为command +
message
if(command==登录成功) goto 第二步
else 登录失败 goto 第一步
第二步(连接弈棋服务器):
Client(UserList):send TCP request(连接服务器+用户名+密匙)
Server(ChessRoom Thread):接收Client的TCP连接,解析数据内容为
command + message
将用户名进行MD5加密生成密匙
if(客户端密匙==服务器端密匙)
send TCP packet(登录成功)
添加用户到usermanage中
生成用户交互监听进程
查询数据库用户数据
send TCP packet to全体在线用户(用户列表更新+新上
线用户信息)
send TCP packet to当前用户(用户列表初始化+全体在
线用户信息)
else send TCP packet(登录失败)
Client(UserList):接收Server的TCP响应包,解析数据内容为command
+ message
if(command==登录成功)
接收Server的用户列表初始化信息,初始化用户列表
goto第三步
else goto 第一步
第三步(邀请弈棋):
Client1(Userlist):send TCP request(邀请弈棋+Client2用户名) Server(ChessRoom Thread): 接收Client的TCP连接,解析数据内容为command + message
if(Client2已经被邀请或正在弈棋) send(拒绝邀请)
else send to Client2(邀请弈棋+Client1用户名)
Client2(Userlist):接收Server的TCP包,解析数据内容为command + message
if(同意Client1的弈棋邀请)
send(接收邀请)
else send(拒绝邀请)
goto第三步
Server(ChessRoom Thread): 接收Client的TCP连接,解析数据内容为command + message
if(command == 同意邀请)
send to Client1(接受邀请)
生成一个ChessDesk实例管理整个弈棋过程
send to Client1 Client2(开始弈棋+执子颜色)
send to全体用户(用户列表更新+Client1 Client2用户状态改变)
goto 第四步
else send to Client1(拒绝邀请)
Client1(Userlist):接收Server的TCP包,解析数据内容为command
+ message
if(command==接收邀请)
接收Server的TCP包,初始化棋盘,更新用户列表
goto第四步
else goto 第三步
Client2(Userlist):接收Server的TCP包,初始化棋盘,更新用户列
表
goto 第四步
第四步(弈棋过程):
ClientRedOrBlack (ChessBoard):send (选中棋子+棋子坐标) ClientRedOrBlack (ChessBoard):send (移动棋子+棋子坐标)
ClientRedOrBlack (ChessBoard):send (棋局结束) goto 第三步
Server(ChessDesk): 接收ClientOneColor的TCP包,解析数据内容为command + message
Switch(command)
case 选中棋子:send to ClientOtherColor(选中棋子+
棋子坐标)
case 移动棋子:send to ClientOtherColor (移动棋子+
棋子坐标)
记录当前棋盘状态
case 棋局结束:send to ClientOtherColor (棋局结束)
结束ChessDesk生命周期
goto第五步
ClientRedOrBlack (ChessBoard): 接收Server的TCP包,解析数据内
容为command + message Switch(command)
case 选中棋子:选中棋子
case 移动棋子:移动棋子
case 棋局结束:棋局结束 goto 第三步
第五步(用户数据更新):
Server(ChessRoom):
处理积分信息,更新数据库
send to全体在线用户(用户列表更新+用户状态改变)Client(Userlist): 接收Server的TCP包,解析数据内容为command +
message
更新用户列表
4.中国象棋网络版客户端实现
4.1客户端基础架构
客户端架构设计如图4.1。
图4.1客户端架构图
4.2客户端GUI 设计
客户端GUI 需求分析和效果展示。
4.2.1弈棋主面板
该面板要实现弈棋的主要功能:显示棋盘、选择棋子、移动棋子
实现后的效果如图4.2。
图4.2 弈棋主面板
4.2.2用户列表面板
该面板主要实现在线用户状态显示、用户上线、用户下线、观战和邀请弈棋的功能。
实现后的效果如图4.3。
图4.3用户列表面板
4.2.3棋谱记录面板
该面板主要实现棋谱的记录和显示、棋谱的保存、对弈双方用户名。
实现后的效果如图4.4。
图4.4棋谱记录面板
4.2.4用户交流面板
该面板主要实现在线的用户交流、以及系统消息的显示。
实现后的效果如图4.5。
图4.5用户交流面板
4.3客户端类设计
由面向对象的思想,对不同模块的功能进行需求分析,设计出相应的类。
4.3.1 chessboardP
chessboardP包需要实现棋盘模块的功能:具体有弈棋规则、棋盘、棋子、棋盘界面、棋谱生成。
chessboardP包结构如图4.6。
图4.6 chessboardP包结构
Rule.java 弈棋规则类,实现象棋规则、胜负判定。
ChessBoard.java 棋盘类,实现逻辑棋盘生成、棋盘记录。
Chess.java 棋子类,实现逻辑棋子生成。
ChessBoardPane.java 棋盘界面类,实现棋盘展现、弈棋操作、棋子闪烁、弈棋通信。
ChessRecordMethod.java 棋谱生成类,实现棋谱的产生。
4.3.2 userP
userP包需要实现用户列表和登录注册模块的功能:登录和注册UDP通信、登录、注册、用户列表、邀请弈棋、观看弈棋。
userP包结构如图4.7。
图4.7 userP包结构
LoginAndRegisterUDP.java 登录和注册UDP通信类,实现登录和注册的UDP 通信。
LoginPane.java 登录界面类,实现登录界面展现。
RegisterPane.java 注册界面类,实现注册界面展现。
UDPMethod.java UDP通信接口,提供UDP通信的统一接口。
UserListPane.java 用户列表界面类,实现用户状态显示、邀请弈棋、观看弈棋。
4.3.3 chessstateP
chessstateP包需要实现棋谱记录模块的功能:棋谱显示、棋谱保存、时钟。
chessstateP包结构如图4.8。
图4.8 chessstateP包结构
ChessStatePane.java 棋谱显示类,实现棋谱的显示。
Clock.java 时钟类,实现时钟功能。
SaveFile.java 存储棋谱类,实现棋谱的存储。
4.3.4 chatP
chatP包需要实现聊天功能:在线交流。
chatP包结构如图4.9。
图4.9 chatP包结构
ChatPane.java 聊天框显示类,实现聊天框的展现、聊天数据通信。
ChatPaneConstants.java 聊天框显示会话属性类,实现会话属性常量。
4.3.5数据处理相关类
实现与服务器端通行和数据预处理分发。
dataprocessP包结构如图4.10。
图4.10 dataprocessP包结构
DataProcess.java 数据预处理和分发类,预处理底层通信类传递的数据,
根据数据类型分发给不同的模块。
MessageConstant.java 数据类型常量类,拥有各种数据类型的常量。
Transmission.java 通信接口,提供通信接口。
TransmissionClient.java TCP通信类,实现底层的TCP通信。
4.4客户端主要算法伪码示例
4.4.1棋子和棋盘状态维护算法简介
棋子是由Chess.java进行封装,主要属性有chessObject,chessImage分别表示棋子类型和棋子图片,棋子chessObject取值有:
0代表没有棋子。
1-7代表黑方棋子: 1 车 2 马 3 象 4 士 5 将 6 炮 7 兵。
11-17代表红方棋子:11 车 12 马 13 相 14 仕 15 将 16 炮 17 卒。
棋盘是由ChessBoard.java的一个实例对象维护的,该类有一个属性Chess[10][9] board数组,此数组来维护整个棋盘状态。
4.4.2棋盘规则马规则伪码示例
Begin:
初始化->int 源X坐标,源Y坐标,目的X坐标,目的Y坐标,棋盘数组
马走日,所以棋盘中马在一个位置最多有8种走法,
遍历这八种走法并且判断是否蹩马腿
if(源X±1==目的X && 源Y±2==目的Y && 棋盘数组[源X][源Y±1]==0)return合法走法
if(源X±2==目的X && 源Y±1==目的Y && 棋盘数组[源X±1][源Y]==0)return合法走法
如果都不满足则为非法走法return 非法走法
4.4.3棋子选择和移动伪码示例
Begin:
初始化->int 鼠标X坐标,鼠标Y坐标,棋盘X坐标,棋盘Y坐标
int flag->0当flag=1时表示有己方棋子被选中0表示没有
第一步:
在棋盘上点击鼠标,获得当前鼠标的X和Y坐标,对鼠标XY坐标进行量化处理,形成棋盘数组坐标
if(flag==0)
if(点击的棋子是己方棋子)flag->1
else goto 第一步
else
if(点击的棋子是己方棋子)flag->0
else if(走子合法)移动棋子
else goto第一步
4.4.4棋谱生成部分伪码示例
通用的棋谱规则为:红方棋盘从右向左纵向九条竖线记为一到九路,黑方从右到左竖线记为1到9 ,红方的一路就是黑方的9路。
走直线的棋子,进退是数格子的,比如红方一路的车向前走一步就是车一进一,平是记录从几路到几路,红方二路的炮平到五路就是炮二平五。
走斜线的棋子只有进退没有平进退是记录从几路到几路,比如二路的马向前跳到三路就是马二进三。
如果在一条路上有两个相同的棋子则用前后区分而不必说明在几路,比如二路上有两个我方车把前面的车向前走一步就是前车进一。
一条棋谱可以分为两个部分:棋子信息+移动信息。
Begin:
初始化->int 源X坐标,源Y坐标,目的X坐标,目的Y坐标
String 棋子信息,移动信息
第一步:
if(棋子上方有相同的棋子)front->ture
else front->false
if(棋子下方有相同的棋子)back->ture
else back->false
if(front && back) 棋子信息->“中”+棋子类型
else if(!front && back)棋子信息->“前”+棋子类型
else if(front && !back)棋子信息->“后”+棋子类型
else棋子信息->棋子类型+源棋子所在路数
goto 第二步
第二步:
if(走子为横向走动)
移动信息->“平”+目的位置所在的路数
else if(向前移动)
if(棋子为斜线移动的棋子)
移动信息->“进”+ 目的位置所在的路数
else 移动信息->“进”+(目的X-源X)。