网络对弈课程设计说明书分解.docx

上传人:b****6 文档编号:7746678 上传时间:2023-01-26 格式:DOCX 页数:53 大小:756.96KB
下载 相关 举报
网络对弈课程设计说明书分解.docx_第1页
第1页 / 共53页
网络对弈课程设计说明书分解.docx_第2页
第2页 / 共53页
网络对弈课程设计说明书分解.docx_第3页
第3页 / 共53页
网络对弈课程设计说明书分解.docx_第4页
第4页 / 共53页
网络对弈课程设计说明书分解.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

网络对弈课程设计说明书分解.docx

《网络对弈课程设计说明书分解.docx》由会员分享,可在线阅读,更多相关《网络对弈课程设计说明书分解.docx(53页珍藏版)》请在冰豆网上搜索。

网络对弈课程设计说明书分解.docx

网络对弈课程设计说明书分解

编号:

计算机网络课程设计说明书

题目:

网络对弈程序设计

系别:

计算机科学与工程学院

专业:

计算机科学与技术

学生姓名:

学号:

指导教师:

王虎寅

 

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))

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小学作文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1