网络对弈课程设计说明书分解文档格式.docx
- 文档编号:20873044
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:53
- 大小:756.96KB
网络对弈课程设计说明书分解文档格式.docx
《网络对弈课程设计说明书分解文档格式.docx》由会员分享,可在线阅读,更多相关《网络对弈课程设计说明书分解文档格式.docx(53页珍藏版)》请在冰豆网上搜索。
(1)满足客户端连接到服务器的基本要求。
(2)服务器满足记录客户端游戏动作的基本要求。
(3)满足服务器实时获得客户端游戏状态的基本要求。
2.2用户需求
2.2.1服务端需求
(1)可以有一个显示服务器状态的界面,用于记录各个客户端的连接状态。
服务器是用于连接各个客户端的通信,如果独立地创建一个直观的服务器,将有力地显示客户端的每个状态,直观地向用户反应各类信息。
(2)可以支持多人同时在线。
一个服务器能够你能够接受来自其他多个客户端的请求,提供相应的响应服务,是网络对弈的基本要求。
(3)可以显示在线用户的信息。
显示在线用户的信息,比如主机名,IP地址,以及连接断的状态,有利于用户随时监控客户端的通信状态。
(4)不允许玩家同名。
不允许客户端同名即是不允许客户端的端口号相同,如果相同,将会造成游戏登陆用户的管理混乱。
(5)服务器界面节约大方。
服务器是用于监控客户端的连接情况,没用必要做得繁杂,用户只需要直观的状态显示,所以我们的服务器不需要设计太多按钮,只需要有显示服务器状态,关闭服务器,清空列表的按钮,方便用户操作。
2.2.2客户端需求
(1)能够通过主机IP及端口号登陆到服务器。
(2)可以显示当前所有用户。
游戏客户端应设计一个可以显示当前所有在线用户的列表,有助于用户随意选择玩家挑战。
(3)可以从在线用户列表中选择玩家进行挑战。
(4)可以创建以及接受挑战。
(5)如果对方正在与其他玩家对弈,则应给出相应提示。
(6)五子棋规则一定要严密。
其中五子棋游戏的规则如下:
Ø
棋盘,棋子:
a)棋盘为十五路,正中一点为“天元”,周围四点为小星。
b)棋子分黑白两色,黑子113枚,白子112枚,共225枚。
比赛规则:
a)黑先白后,从天元开始落子。
然后执白棋的一方在黑棋周围的交叉点上落子,白第二着棋应布在自己河界的一侧。
此后,执黑方在以天元为中心的25个交叉点的范围内布盘面的第三着棋。
b)最先在横向,竖向,斜向形成连续的相同色五个棋子的一方为胜。
c)黑棋禁手判负,白棋无禁手。
黑棋禁手包括“三三”,“四四”,“长连”。
黑方只能“四三”胜。
所谓禁手,是指黑方一子落下同时形成两个或两个以上的活三,冲四及长连禁手。
长连禁手是指黑方形成六个或六个以上的连续棋子。
d)双方均不能形成五连为和棋。
e)对局中拔子,中途退场均判为负。
f)五连与禁手同时形成,先五为胜。
因黑方已形成五连,故禁手失效,黑方胜。
g)黑方禁手形成时,白方应立即指出禁手点,黑方即负。
若白方继续应子,则黑方禁手不成立。
h)高段位职业比赛的特殊规定:
“三手可交换”:
黑下完第2手,执白者可提出交换。
即执白方变为执黑方。
“五手两打法”:
执黑下第五手时,必须下两手棋,执白者从这两手棋中任选一步。
i)本文所论述的联机五子棋系统就是依照这种方式进行的。
2.2.3技术上可行性分析
对需求分析阶段的结果进行总结,对软件的可行性分析如下:
(1)网络对弈需要两个客户端进行通信,而利用服务器的线程开发,进行中间中介连接正好可以完成。
(2)五子棋的规则虽然严密,但是通过各种情况分析,然后将每个情况分析设计出来。
(3)本系统的设计运行环境只用到MyEclipse的编程软件,无需借用到其它的软件,比较容易实现。
2.3.系统运行环境
系统运行环境:
MyEclipse6.6
3总体设计
3.1系统结构设计
该游戏主要分为服务器端与客户端两部分。
服务器端的功能主要是建立与客户端的连接,监控客户端的连接及断开的状态,接收客户端发送的信息以及向客户端发送信息。
客户端的功能主要是连接服务器端,创建游戏用户,创建游戏,加入游戏,选择玩家挑战,向服务器发送信息,接收服务器端发送来的信息。
其具体的功能模块如图所示:
3.2服务器设计
服务器的设计主要分为服务器主界面,服务器线程,服务器主机面板三个部分。
服务器主界面的设计主要包括界面大小,界面背景,界面上的按钮,比如清空列表,服务器状态,关闭服务器的设计,以及启动对客户端的监听,启动服务器线程。
服务器线程的设计主要包括接受多个客户端的连接,接受客户端信息,向客户端发送信息。
服务器主机面板的设计主要包括客户端信息板的设计,包括板的大小,背景颜色。
3.3客户端设计
客户端的设计主要分为客户端界面,客户端线程两部分。
客户端界面的设计主要包括客户端界面大小,背景颜色,主要按钮:
创建游戏,加入游戏,连接到服务器,放弃游戏,退出游戏的设计以及它们对应事件的处理。
客户端线程的设计主要包括连接到服务器,向服务器发送信息,接受服务器信息的设计以及它们对应的事件处理,比如收到服务器发送来的游戏胜利,信息错误,信息有效等的处理。
其具体功能模块如图所示:
3.4棋类设计
五子棋类的设计主要分为棋盘,棋子,五子棋动作线程,规则四部分。
棋盘的设计主要包括画棋子,捕获下棋事件,画网络棋盘。
棋子的设计包括黑棋以及白旗的设计,其中有大小,颜色,所属棋盘的设计。
五子棋动作线程的设计包括处理捕获下棋信息,发送当前下棋信息,这一部分的设计是五子棋类设计的重点。
规则的设包括取得指定棋子的位置,判断当前棋子是否取得胜利,当前棋子各个方向的判断,当前所要下的棋子是否越界。
4详细设计
4.1服务器
4.1.1服务器主类的设计开发
服务器主类即服务器端的运行类,用户通过运行该类进入服务器的主界面。
其中包括创建服务器端用到的控件以及声明用到的对象引用,完成对控件的初始化:
设置窗体的标题,图标,大小以及可见性,将各个控件添加到各面板的相应位置
FIRServer.java类:
//服务器界面类
publicclassFIRServerextendsFrameimplementsActionListener
{
JButtonclearMsgButton=newJButton("
清空列表"
);
JButtonserverStatusButton=newJButton("
服务器状态"
JButtoncloseServerButton=newJButton("
关闭服务器"
PanelbuttonPanel=newPanel();
ServerMsgPanelserverMsgPanel=newServerMsgPanel();
ServerSocketserverSocket;
HashtableclientDataHash=newHashtable(50);
//将客户端套接口和输出流绑定
HashtableclientNameHash=newHashtable(50);
//将客户端套接口和客户名绑定
HashtablechessPeerHash=newHashtable(50);
//将游戏创建者和游戏加入者绑定
publicFIRServer()
{
super("
Java五子棋服务器"
setBackground(Color.LIGHT_GRAY);
buttonPanel.setLayout(newFlowLayout());
clearMsgButton.setSize(60,25);
buttonPanel.add(clearMsgButton);
clearMsgButton.addActionListener(this);
serverStatusButton.setSize(75,25);
buttonPanel.add(serverStatusButton);
serverStatusButton.addActionListener(this);
closeServerButton.setSize(75,25);
buttonPanel.add(closeServerButton);
closeServerButton.addActionListener(this);
add(serverMsgPanel,BorderLayout.CENTER);
add(buttonPanel,BorderLayout.SOUTH);
addWindowListener(newWindowAdapter()
{
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
});
pack();
setVisible(true);
setSize(400,400);
setResizable(false);
validate();
try
createServer(4331,serverMsgPanel);
}
catch(Exceptione)
e.printStackTrace();
}
//用指定端口和面板创建服务器
publicvoidcreateServer(intport,ServerMsgPanelserverMsgPanel)throwsIOException
SocketclientSocket;
//客户端套接口
longclientAccessNumber=1;
//连接到主机的客户数量
this.serverMsgPanel=serverMsgPanel;
//设定当前主机
serverSocket=newServerSocket(port);
serverMsgPanel.msgTextArea.setText("
服务器启动于:
"
+InetAddress.getLocalHost()+"
:
//djr
+serverSocket.getLocalPort()+"
\n"
while(true)
//监听客户端套接口的信息
clientSocket=serverSocket.accept();
serverMsgPanel.msgTextArea.append("
已连接用户:
+clientSocket+"
//建立客户端输出流
DataOutputStreamoutputData=newDataOutputStream(clientSocket
.getOutputStream());
//将客户端套接口和输出流绑定
clientDataHash.put(clientSocket,outputData);
//将客户端套接口和客户名绑定
clientNameHash
.put(clientSocket,("
新玩家"
+clientAccessNumber++));
//创建并运行服务器端线程
FIRServerThreadthread=newFIRServerThread(clientSocket,
clientDataHash,clientNameHash,chessPeerHash,serverMsgPanel);
thread.start();
catch(IOExceptionex)
ex.printStackTrace();
publicvoidactionPerformed(ActionEvente)
if(e.getSource()==clearMsgButton)
{//清空服务器信息
if(e.getSource()==serverStatusButton)
{//显示服务器信息
try
服务器信息:
+InetAddress.getLocalHost()+"
+serverSocket.getLocalPort()+"
catch(Exceptionee)
ee.printStackTrace();
if(e.getSource()==closeServerButton)
{//关闭服务器
System.exit(0);
publicstaticvoidmain(Stringargs[])
FIRServerfirServer=newFIRServer();
}
4.1.2服务器线程的设计开发
服务器线程是服务器启动后创建并启动的第一个线程,该线程主要用于接收客户端的连接,并未每个连接分配一个服务器代理线程。
服务器代理线程主要用于接收客户端传来的消息,并将该消息转发给另一个客户端。
服务器为所有客户端都分配了一个该类线程实例,单独为特定客户端进行服务。
同时每一个服务器代理线程都有能唯一标识的名称。
FIRServerThead.java类:
publicclassFIRServerThreadextendsThread
SocketclientSocket;
//保存客户端套接口信息
HashtableclientDataHash;
//保存客户端端口与输出流对应的Hash
HashtableclientNameHash;
//保存客户端套接口和客户名对应的Hash
HashtablechessPeerHash;
//保存游戏创建者和游戏加入者对应的Hash
ServerMsgPanelserverMsgPanel;
booleanisClientClosed=false;
publicFIRServerThread(SocketclientSocket,HashtableclientDataHash,
HashtableclientNameHash,HashtablechessPeerHash,
ServerMsgPanelserver)
this.clientSocket=clientSocket;
this.clientDataHash=clientDataHash;
this.clientNameHash=clientNameHash;
this.chessPeerHash=chessPeerHash;
this.serverMsgPanel=server;
publicvoiddealWithMsg(StringmsgReceived)
StringclientName;
StringpeerName;
if(msgReceived.startsWith("
/"
))
if(msgReceived.equals("
/list"
{//收到的信息为更新用户列表
Feedback(getUserList());
elseif(msgReceived.startsWith("
/creatgame[inchess]"
{//收到的信息为创建游戏
StringgameCreaterName=msgReceived.substring(20);
//取得服务器名
synchronized(clientNameHash)
{//将用户端口放到用户列表中
clientNameHash.put(clientSocket,msgReceived.substring(11));
}
synchronized(chessPeerHash)
{//将主机设置为等待状态
chessPeerHash.put(gameCreaterName,"
wait"
Feedback("
/yourname"
+clientNameHash.get(clientSocket));
sendGamePeerMsg(gameCreaterName,"
/OK"
sendPublicMsg(getUserList());
/joingame"
{//收到的信息为加入游戏时
StringTokenizeruserTokens=newStringTokenizer(msgReceived,"
"
StringuserToken;
StringgameCreatorName;
StringgamePaticipantName;
String[]playerNames={"
0"
"
};
intnameIndex=0;
while(userTokens.hasMoreTokens())
{
userToken=(String)userTokens.nextToken("
if(nameIndex>
=1&
&
nameIndex<
=2)
{
playerNames[nameIndex-1]=userToken;
//取得游戏者命
}
nameIndex++;
gameCreatorName=playerNames[0];
gamePaticipantName=playerNames[1];
if(chessPeerHash.containsKey(gameCreatorName)
&
chessPeerHash.get(gameCreatorName).equals("
{//游戏已创建
synchronized(clientNameHash)
{//增加游戏加入者的套接口与名称的对应
clientNameHash.put(clientSocket,
("
[inchess]"
+gamePaticipantName));
synchronized(chessPeerHash)
{//增加或修改游戏创建者与游戏加入者的名称的对应
chessPeerHash.put(gameCreatorName,gamePaticipantName);
sendPublicMsg(getUserList());
//发送信息给游戏加入者
sendGamePeerMsg(gamePaticipantName,
("
/peer"
+"
+gameCreatorName));
//发送游戏给游戏创建者
sendGamePeerMsg(gameCreatorName,
else
{//若游戏未创建则拒绝加入游戏
sendGamePeerMsg(gamePaticipantName,"
/reject"
try
closeClient();
catch(Exceptionez)
ez.printStackTrace();
/[inchess]"
{//收到的信息为游戏中时
intfirstLocation=0,lastLocation;
lastLocation=msgReceived.indexOf("
0);
peerName=msgReceived.substring((firstLocation+1),lastLocation);
msgReceived=msgReceived.substring((lastLocation+1));
if(sendGamePeerMsg(peerName,msgReceived))
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 对弈 课程设计 说明书 分解