网络对弈课程设计说明书分解.docx
- 文档编号:7746678
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:53
- 大小:756.96KB
网络对弈课程设计说明书分解.docx
《网络对弈课程设计说明书分解.docx》由会员分享,可在线阅读,更多相关《网络对弈课程设计说明书分解.docx(53页珍藏版)》请在冰豆网上搜索。
网络对弈课程设计说明书分解
编号:
计算机网络课程设计说明书
题目:
网络对弈程序设计
系别:
计算机科学与工程学院
专业:
计算机科学与技术
学生姓名:
学号:
指导教师:
王虎寅
2013年3月20日
1设计任务及目标
1.1开发背景以及设计目标
五子棋有着悠久的历史,五子棋爱好者更是不计其数,但是由于人们工作地点,时间的限制,生活节奏的加快,人们之间的交流越来越少,面对面下五子棋的机会更是少了很多,那种面对面的下棋的方式已经不再适应人们的生活,但网络给了人们一个交流的平台,因此人们开始转向网络五子棋。
网络五子棋有很多优点,通过网络五子棋,对弈双方可以是网络上任意两个五子棋的爱好者,甚至从不认识。
网络五子棋让对弈的范围更加的广泛,让玩家可以与更多的五子棋爱好者切磋棋艺。
所以我此次网络课程设计综合运用《计算机网络》、《JAVA语言程序设计》、《网络编程》等课程知识;从需求分析入手,系统地掌握计算机网络编程初级技术,独立、合理地完成网络五子棋对弈程序设计任务。
设计目标主要包括:
(1)实现需求分析阶段所要求的服务器端以及客户端的功能。
(2)游戏界面朴素美观。
(3)棋子样式采用传统样式,黑色和白色。
(4)客户端的信息交流完全通过服务器传递完成。
1.2设计任务
完成一个网络五子棋对弈程序设计工作。
根据自身多年来进行网络对弈的经验,以及了解,对网络五子棋对弈的设计进行需求分析。
根根设计目标以及需求分析对五子棋游戏界面总体规划和设计,游戏界面设计好以后进行服务器端和客户端的规划设计,最后进行棋盘以及棋子的设计。
设计阶段要进行服务器端框架设计与业务代码开发,客户端框架设计与业务代码的开发,棋子以及棋盘类的设计开发,规则类的设计开发等。
2需求分析
2.1系统需求
(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;//设定当前主机
try
{
serverSocket=newServerSocket(port);
serverMsgPanel.msgTextArea.setText("服务器启动于:
"
+InetAddress.getLocalHost()+":
"//djr
+serverSocket.getLocalPort()+"\n");
while(true)
{
//监听客户端套接口的信息
clientSocket=serverSocket.accept();
serverMsgPanel.msgTextArea.append("已连接用户:
"+clientSocket+"\n");
//建立客户端输出流
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)
{//清空服务器信息
serverMsgPanel.msgTextArea.setText("");
}
if(e.getSource()==serverStatusButton)
{//显示服务器信息
try
{
serverMsgPanel.msgTextArea.append("服务器信息:
"
+InetAddress.getLocalHost()+":
"
+serverSocket.getLocalPort()+"\n");
}
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());
}
elseif(msgReceived.startsWith("/joingame"))
{//收到的信息为加入游戏时
StringTokenizeruserTokens=newStringTokenizer(msgReceived,"");
StringuserToken;
StringgameCreatorName;
StringgamePaticipantName;
String[]playerNames={"0","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("wait"))
{//游戏已创建
synchronized(clientNameHash)
{//增加游戏加入者的套接口与名称的对应
clientNameHash.put(clientSocket,
("[inchess]"+gamePaticipantName));
}
synchronized(chessPeerHash)
{//增加或修改游戏创建者与游戏加入者的名称的对应
chessPeerHash.put(gameCreatorName,gamePaticipantName);
}
sendPublicMsg(getUserList());
//发送信息给游戏加入者
sendGamePeerMsg(gamePaticipantName,
("/peer"+"[inchess]"+gameCreatorName));
//发送游戏给游戏创建者
sendGamePeerMsg(gameCreatorName,
("/peer"+"[inchess]"+gamePaticipantName));
}
else
{//若游戏未创建则拒绝加入游戏
sendGamePeerMsg(gamePaticipantName,"/reject");
try
{
closeClient();
}
catch(Exceptionez)
{
ez.printStackTrace();
}
}
}
elseif(msgReceived.startsWith("/[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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 对弈 课程设计 说明书 分解