1.开发环境
Windows10
JDK1.8
IntelliJIDEA
2.概要设计
根据需求分析,本系统的实现主要用到两个大类:
Client:主要用于产生游戏客户端
Server:主要用于服务器端的生成
2.1 网络编程模式的选取
本系统根据需求选取了基于C/S(客户机/服务器)模式,主要是因为C/S模式下的程序具有非常好的交互性,功能强大,另一种B/S模式下的程序交互性与功能有一些限制网络五子棋系统应用,所以选择了C/S 模式进行实现,使用TCP/IP 方式利用Socket 通过传输层提供服务。在Socket工作中,用Client.net类建立客户端连接,用Server.net类建立服务器端连接,这两个组件分别用来操纵客户端和服务器端的Socket对象进行连接和传输数据。在游戏开始前,服务器端应用程序先启动,然后等待客户端的连接请求。在一个用户上启动客户端程序后,客户端会自动输入服务器端Socket地址和端口号进,玩家点击登陆后,会去找到服务器,然后就向服务器端发请求连接服务器端,允许连接后即向客户端Socket收到Accept信号。客户端和服务器端就正式建立起了后, 就可以分别调用ReceiverServer和ReserverThread的Socket属性和客户端进行数据传输。客户端和服务器端Socket组件必须设置相同的端口号。
2.2 主要类与其作用
2.2.1 棋盘模块
棋盘模块的主要功能是绘制游戏棋盘与棋子。
棋盘模块对象功能如下表
对象名称 |
功能 |
chessBoard[][] |
用于棋盘的初始化搭建,并判断能否落子 |
Data.myOr |
到了己方下棋的时间 |
Data.oppoChess |
用于判断玩家之间棋子的颜色 |
Data.order |
用于判断哪一方走棋,并判断能否悔棋 |
棋盘模块使用图
2.2.2 客户端类
游戏客户端的主要功能是为了生成用户界面、棋盘面板、聊天面板,并且定义生成了操控面板中各个按钮的功能。
客户端对象功能如下表:
对象名称 |
功能 |
Data.connected |
用于判断玩家当前是否登陆到服务器 |
Data.gameStatus |
用于判断玩家当前是否在游戏中 |
Data.myName |
用于存储昵称并判断是否可以更改名字 |
Data.myID |
用于存储玩家ID号,便于进行挑战 |
Data.oppositeID |
游戏时存储对手的ID,便于进行离开、重来、悔棋 |
游戏客户端使用状况图
2.2.3 客户端网络类对象功能
客户端网络类对象功能主要功能是当前玩家在网络对战的时候,从接收服务器端发来的信息。
客户端网络功能使用状况图
2.2.4 服务器类
服务器类主要用于接收来自客户端的登陆信息,并且为每个客户端在服务器端启动一个守护线程,该线程的主要功能是接收客户端发送过来的信息并做出相应的处理。客户端发送到服务器端的信息主要有两个部分:一部分是客户端发送给服务器端需要服务器端进行处理的,如客户端发送过的登陆信息、昵称改名信息等;另一部分是客户端发送给服务器端需要服务端转发给其他客户端的消息,如客户端给对战中的里一个客户端发送的棋盘状态数据、聊天信息、游戏控制信息等。
对象名称 |
功能 |
playerMap |
用于存储每个玩家的信息 |
pairsMap |
用于存储每对对战玩家的配对信息 |
ServerSocket.accept() |
用于建立服务器与新登陆用户之间的联系 |
服务器类使用状况图
3.详细设计
3.1棋盘设计
ChessJudge()方法 用于判断棋子落下后游戏是否胜负已分。如果胜利,就返回true,如果失败,则返回false;
ChessBoardCanvas()方法 用于绘制棋盘、棋盘的背景和棋子下落的位置;
3.2客户端设计
3.2.1界面设计
游戏客户端主要用于玩家信息的初始化,玩家的操作状态的定义,包括结构组织游戏客户端的界面,实现定义游戏控制按钮,完成定义键盘的事件。
主要方法:
GammonFrame()方法 用于启动游戏客户端后,构建游戏界面,从而将客户端模板形象化显示出来;
GammonPanel()方法 用于显示和修改用户信息、显示服务器状态和显示棋盘。当玩家输入新的昵称后点击修改即可变换昵称,点击登陆后可连接服务器;
PlayerPanel()方法 用于实现游戏的主要控制功能。当玩家列表显示有其他玩家时,可点击该玩家名称并点击“挑战”按钮发起 挑战,游戏过程中还可以进行悔棋、重来、离开等按钮操作;
ChatPanel()方法 用于实现聊天功能当玩家输入聊天信息到输入框中后,点击“发送”按钮可将信息发送给对战的玩家;
3.2.2客户端网络设计
网络客户端主要用于接收和发送服务器消息。
LandConnect() 方法 用于登陆服务器。该方法从GammonPanel()中获取了IP地址和端口数值,并判断连接服务器的状态;
PlayGammon() 方法 用于传送玩家之间的落子信息,并且调用ChessJudge()方法来判断输赢,如果当前玩家胜利,向服务器发送‘WIN’信息;
Receive()方法 用于接收服务器传来的各种信息,包括挑战、重来、悔棋、离开、对面传来的聊天信息以及游戏系统信息;
3.2.3 客户端管理设计
MessageManager()方法 用于聊天信息的管理,包括从文本输入框获取输入的聊天信息;
ListManager()方法 用于管理玩家列表信息;
IOManager()方法 用于管理客户端的输入输出流;
3.3服务器设计
3.3.1 界面设计
ServerFrame()方法 用于建立一个服务器,并生成一个监视服务器信息状态的窗口;
PairsPanel()方法 用于显示已经配对的对战玩家ID号;
PlayerPanel()方法 用于显示所有连接到服务器的玩家;
3.3.2 主要功能设计
ReceiveServer()方法 用于接收来自客户端的消息;
ReserverThread()方法 用于传送存于服务器中的信息给用户;
Player()方法 用于储存玩家信息;
4 系统各模块间关系
Client类与Server类之间的交互实现了系统的主要功能。客户端主要用到的是这三个类:Client.judge类、Client.ui类和Client.net类。PlayersPanel类实现了玩家最主要按钮功能;ChessBoardCanvas类用于绘制棋盘和玩家的落子位置。服务器端模块的实现,主要的类是ReceiveServer类和ReserverThread类。服务器类和客户端类用Socket编程实现的信息交换。其他功能都是在用户登陆到服务器后由游戏客户端类自动调用其类来实现的。