2班倪佩佩学号0059.docx

上传人:b****5 文档编号:30370200 上传时间:2023-08-13 格式:DOCX 页数:27 大小:564.42KB
下载 相关 举报
2班倪佩佩学号0059.docx_第1页
第1页 / 共27页
2班倪佩佩学号0059.docx_第2页
第2页 / 共27页
2班倪佩佩学号0059.docx_第3页
第3页 / 共27页
2班倪佩佩学号0059.docx_第4页
第4页 / 共27页
2班倪佩佩学号0059.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

2班倪佩佩学号0059.docx

《2班倪佩佩学号0059.docx》由会员分享,可在线阅读,更多相关《2班倪佩佩学号0059.docx(27页珍藏版)》请在冰豆网上搜索。

2班倪佩佩学号0059.docx

2班倪佩佩学号0059

 

Java课程设计

黑白棋网络对战平台系统的设计与实现

姓名倪珮珮

学号201000130059

时间2011年5月5日星期四

 

一、需求分析4

1.1功能需求4

1.2开发环境4

二、整体架构4

三、通信协议4

3.1协议指令5

3.1.1客户端的指令集6

3.1.2服务器端的指令集7

四、详细设计9

4.1数据库设计9

4.2包图9

4.2.1客户端9

4.2.2服务器端9

4.3类图10

4.3.1客户端10

4.3.2服务器端11

4.4类概要13

五、使用指南13

5.1概况13

5.2流程14

5.3界面介绍15

六、测试用例……………………………………………………………………………………………………22

七、时间进度………………………………………………………………………………………………………23

八、关键技术实现………………………………………………………………………………………………24

九、特色功能………………………………………………………………………………………………………29

十、个人体会……………………………………………………………………………………………………30

一、需求分析

1.1功能需求

本系统实现一个基于C/S架构的黑白棋网络对战平台,在这个系统中,服务器提供一个平台使得多个玩家可以同时连接服务器进行双人对战,多人观看。

同时提供友好的图形用户界面。

具体功能需求如下:

1.1.1客户端

●提供登陆窗体使用户可以通过输入其用户名和密码登陆服务器,此时可以点击设置按钮设置服务器IP地址。

●提供注册窗体使得新的用户可以通过此注册一个新ID。

●登陆服务器后用户将进入游戏大厅,用户可以看到当前已登录用户的所有信息。

●在游戏大厅内,系统将提供一个供用户聊天的聊天窗口,这里是所有登录用户用于群聊的部分

●进入大厅后,玩家可以进入游戏模式。

也可进入观战模式

●在用于黑白棋比赛的窗口中,将显示当前棋盘、下棋记录,用户详情以及其对手的详情,同时提供一个聊天窗口。

●在比赛过程中,用户可以向对手请求悔棋,当且仅当对手同意时方能悔棋;同时用户也可以向对手认输从而提前结束比赛。

●在比赛尚未开始或一局比赛已经结束时,用户可以正常退出黑白棋游戏从而结束比赛。

1.1.2服务器端

●提供图形化的界面,显示服务器运行状况以及提供启动和关闭服务器的接口

●服务器被启动后,对于每一个用户的连接,将启动一个线程用于该连接上的用户的事务处理

●服务器将对用户的请求(诸如登陆,注册,获得大厅信息等)结合数据库的查询给予适当的反馈信息

●每当有一个新的用户登陆时,服务器将这则消息发送给其他每个在线用户

●每当有一个新的用户就坐时,服务器将这则消息发送给其他每个在线用户。

●当比赛结束或有用户认输或强行退出比赛时,服务器将要更新数据库上他们的比赛积分值和输赢次数,同时将更新后的信息发送给每一个用户

1.2开发环境

开发语言:

Java

开发工具:

Eclipse-SDK-3.5.1-win32

所用开发系统:

MicrosoftWindowsXP

二、整体架构

本系统采用经典的C/S模式。

C/S(Client/Server)架构,即大家熟知的客户机和服务器架构。

它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。

目前大多数应用软件系统都是Client/Server形式的两层架构。

C/S架构把数据库内容放在远程的服务器上,而在客户机上安装相应软件。

C/S软件一般采用两层架构,其分布结构如图1所示。

它由两部分构成:

前端是客户机,即Client,结合了程序界面和应用逻辑,接受用户的请求,并向数据库服务提出请求,后端是服务器,即数据管理(Server),将数据提交给客户端,客户端将数据进行计算并将结果呈现给用户,还要提供完善的安全保护及对数据的完整性处理等操作,并允许多个客户同时访问同一个数据库。

 

图1C/S结构

三、通信协议

本系统的通信协议和一些经典的网络应用通信协议类似(例如FTP协议),客户端和服务器都是通过发送/接收命令(通常由命令头+参数构成)来通信的。

3.1协议指令

3.1.1客户端的指令集

3.1.1.1用户名(USERNAME)

其参数是用户输入的用户名,客户端将此命令发送给服务器端有两种场景:

一是用户登陆;二是用户注册。

对于这两种用途,服务器端都会直接在数据库中国查找该用户名给出用户名存在/不存在的消息,由客户端后续的操作去处理这些情况。

3.1.1.2密码(PASSWORD)

其参数是用户输入的密码,客户端将此命令发送给服务器以实现登陆。

3.1.1.3开始比赛(START)

无参指令,用于通知服务器该用户准备好了比赛。

3.1.1.4放置棋子(GetQIZI)

参数为用户所放置棋子的位置,客户端将此命令发送给服务器以通知服务器其在该位置上放置了一颗棋子。

3.1.1.5房间内聊天信息(DOS)

参数为用户所发送给其对手及观战者的聊天信息,用于通知服务器该用户向其对手及观战者发送了一条聊天信息。

3.1.1.6请求悔棋(huiqi)

无参指令,用于通知服务器该用户向其对手请求悔棋。

3.1.1.7同意悔棋(agree)

无参指令,用于通知服务器其同意对手的悔棋请求。

3.1.1.8拒绝悔棋(reject)

无参指令,用于通知服务器其拒绝对手的悔棋请求。

3.1.1.9请求认输(GIVE_UP)

无参指令,客户端向服务器发送此命令以请求认输。

3.1.1.10确认认输(COMFIRM_GIVE_UP)

无参指令,客户端向服务器发送此命令以确认收到对手认输的消息。

3.1.1.11比赛结果(PanDing)

参数为黑方和白方分别所占的棋格数,客户端向服务器发送此命令以将比赛结果发送至服务器。

3.1.1.12大厅公聊信息(ShowMessage)

参数为用户所发送给每个在线用户的聊天信息,客户端向服务器发送此命令以将公聊信息发送至服务器。

3.1.1.13注册(CLIENT_REGIST)

参数是用户的注册信息,客户端向服务器发送此命令以注册新用户。

3.1.1.14请求观战(CLIENT_ASK_FOR_LOOKING)

参数是请求观战的房间ID,客户端发送此命令以请求观战某一房间

3.1.1.15开始猜先(CLIENT_START_CHOOSE_COLOR)

参数是客户端抓起的白棋数,客户端发送此命令以通知服务器已选定猜先棋子数,让对手猜

3.1.2服务器端的指令集

3.1.2.1需要密码(SERVER_PASSWORD)

无参指令,服务端向客户器发送此命令以通知用户发送其密码过来。

3.1.2.2用户不存在(SERVER_USER_NOT_EXIST)

无参指令,服务端向客户器发送此命令以通知用户其用户名不存在。

3.1.2.3用户已登录(SERVER_USER_LOGIN_ALREADY)

无参指令,服务端向客户器发送此命令以通知该用户名已经登陆。

3.1.2.4登陆成功(SERVER_LOGIN)

无参指令,服务端向客户器发送此命令以通知用户成功登陆信息。

3.1.2.5登陆失败(SERVER_LOGIN_ERROR)

无参指令,服务端向客户器发送此命令以通知用户密码错误信息。

3.1.2.6新用户登陆(SERVER_NEW_CLIENT)

参数为新登录用户的个人信息,服务端向客户器发送此命令以通知用户有新的用户进入大厅。

3.1.2.7初始化游戏(SERVER_INITIAL_GAME)

无参指令,服务端向客户器发送此命令以通知用户初始化游戏。

3.1.2.8开始游戏(SERVER_START)

无参指令,服务端向客户器发送此命令以通知用户其对手准备好了游戏。

3.1.2.9放置棋子(SERVER_PUT_CHESS)

参数为放置棋子的位置,服务端向客户器发送此命令以通知用户其对手的下棋位置。

3.1.2.10退出大厅(SERVER_QUIT)

无参指令,服务端向客户器发送此命令以通知用户有用户退出大厅信息

3.1.2.11成功进入房间观战(SERVER_AGREE_LOOKING)

有参指令,服务器向客户端发送此命令以通知客户端成功进入房间观战,随即发送房间信息

3.1.2.12开始猜先(SERVER_START_CHOOSE_COLOR)

无参指令,服务器向客户端发送此命令以通知客户端开始猜先

四、详细设计

4.1数据库设计

在本系统中,服务器端将负责在数据库中存储所有用户的相关信息,所以需要为其设计一个数据表。

我设计了userinfo这个表用于存储用户相关信息。

表项

类型

意义

username

VARCHAR(45)

用户名

password

VARCHAR(45)

用户密码

·4.2包图

4.2.1客户端(OthelloHall这个包)

在这个包里,共有四个方法,分别为HallClient,HallServer,ItemAction,Room,分别用于登录注册,连接网络,实现功能按钮,进入房间游戏。

4.2.2服务器端

与客户端基本类似,共有三个方法,分别为Request,Server,ServerTimer,用于获取用户的ID,连接网络,倒计时。

·4.3类图

4.3.1客户端

4.3.2服务器端

·4.4类概要

五、使用指南

本系统拥有友好的图形界面,直接运行后即可使用。

5.1概况:

在输入用户名之后,游戏会自动启动一个本地的服务器,可以供自己或是他人连接。

(如果在本地开启两个以上游戏,会自动提示服务器已经在另一个进程启动)

如果直接按“参加游戏”,则进入“单机模式”。

用户可以与内置的AI进行对战。

当进行网络连接时,可以选择是连接到本地服务器还是他人机子上的服务器。

连接上服务器后,如果参加的人数不满两个,则可以选择“参加游戏”,进入对战模式。

如果超过两个,则进入“观战模式”(默认)观看他人游戏。

游戏的默认设置是,下完一盘棋后参加游戏的人并不会改变。

参加游戏的人可以选择“退出”,点“进入观战模式”,这样在观战的人便也能参加游戏。

5.2流程:

5.3界面介绍

5.3.1与AI对战时黑白棋主界面:

界面左边是棋盘,上边左边是玩家双方的数据。

包括黑方白方,玩家用户名,所用总时间和剩余思考时间,黑子数目白子数目。

右边则是灌水区,用来用户的留言等。

在左上方有两个选项,选择这两个选项会切换界面。

如果选择右边的按钮,会出现一个新的界面,这个界面与“单机人人对战”界面差不多,只是里面有点微小的区别。

在右边有四个按钮,分别为:

用来打开自己下棋的第一步。

用来打开自己下的最后一步

用来打开自己当前步骤的前一步

用来打开对方的最后一步,也就是自己当前步骤的前一步。

5.3.2.网络

网络连接

首先,你要运行一下服务器端,运行服务器端以后再运行一下客户端就可以连接网络了。

连接网络的界面与单机模式的棋盘类似。

只不过连接网络以后,你就可以与玩家聊天了。

在右下角有个”关于“的按钮,按下这个按钮以后,会出现一个窗口,跳出设计者的相关信息。

5.3.3按钮

5.3.3.1保存

将当前对战的过程以*.sav格式的文件保存下载。

5.3.3.2悔棋

悔一步棋。

如果是网络对战的话,需要得到对方的同意。

如果对方不同意悔棋,会自动提示要求悔棋的人,对方不同意悔棋,游戏继续进行。

如果不是你在下棋的阶段,你是不可以悔棋的

5.3.3.3打开

打开以前下棋的保存的棋谱

5.3.3.4关于

打开作者的相关信息

5.3.3.5发送

将玩家的聊天记录发送到公聊窗口上

5.3.4计时器

点击“暂停计时器按钮“,计时器会暂停,点击”启动计时器“,计时器开始运行,并且为双方计时,如果对方超时,会有窗口提示时间已超。

六、测试用例

黑白棋测试用例

1.登陆

a输入未注册用户名和密码,无法登陆

b运行服务器端,服务器端无反应

c输入已登录的用户名和密码,提示该用户已登录。

d输入已注册未登录的用户名和密码,正常登陆大厅

e输入注册的用户名和错误的密码,提示密码错误

2.注册

a输入已注册名字,返回提示已注册

b输入正常信息,提示XX注册成功,并返回登陆窗口

3.大厅

a点击任意桌子,正常进入房间

b进入正在进行游戏的房间观战,正常获得当前房间情况

c选择单机模式还是多人模式,若为单机模式,则与计算机对战,若连接网络,则与其他人对战。

d点击退出时,系统会提示是退出单机模式还是退出程序

e若退出单机模式,则视为观战,若退出程序,则窗口关闭

4.房间

a两个人都准备后,系统提示猜先,并根据结果赋予各方正确的颜色。

b一方点击悔棋,另一方正常收到。

若同意则悔棋,否则不悔棋

c一方点击认输按钮,正常认输

d房间内的聊天系统正常

5.采用各种下棋测试棋谱

a.甲方停步,系统正常提示甲方和乙方

b.双方停步,游戏结束,正确统计结果

c.一方强制退出游戏,游戏结束,刷新界面并更新积分

6.观战

a.未开时游戏进入房间,正常显示房间内就坐情况,并正常接收提示信息

b.游戏进行中进入游戏房间,可以正常接收棋子和时间

c.观战者可以正常进行发言

七、时间进度

第一周

分析项目要求,进行总体设计。

并从网上寻找参考资料,加以阅读。

主要是GUI的高级应用和多线程部分

第二周

编写协议,并制作简单的客户端和服务器端,进行简单正常的通信,建立C/S的大体框架,并绘制UML类图

第三四五周

按照设计一点点的加入各种功能模块,同时进行测试。

一旦发现更好的实现方法,会返回重新设计某一模块。

第六七周

美化GUI界面,网上寻找图片,并同时自己PS。

寻找并试验各种观感,增加美观性。

与此同时,进行测试

第八九十周

测试,并整理开发文档.

八、关键技术实现

8.1抽象棋盘的实现

使用8*8的二维数组模拟。

其中0表示没有棋子,1表示黑子,2表示白子。

8.2具体棋盘的实现

定义一个480*480的JPanel作为一个格子大小为60*60的棋盘。

当用户点击时,点击位置的xy坐标分别除以60得到其在棋盘上的位置。

8.3棋盘的绘制

在JPanel中加入棋盘的图片,并在下完一步后根据模拟的二维数字调用repaint方法,在1和2的地方分别画上相对应的棋子。

8.4下棋的时候的判定

8.4.1吃子

调用PanDing类的staticbooleancheck(intfriend,intx,inty)方法。

传入的分别是所下棋子的颜色(黑1,白2),所在的棋盘的位置(左上角是原点,向右是X+即列,向下是Y+即行)。

然后在方法开头设定变量booleanflag=false;并获得对方棋子的颜色intenemy=(friend==1)?

2:

1;如果该棋子所下的位置合法,则进行翻棋处理,并令flag=true;返回flag。

如果所下位置非法,则返回flag。

在得到所下的其的位置后,首先判断其位置是否为空。

如为空则返回false。

if(qiju[y][x]!

=0)

returnflag;

如不为空,则检测该位置的八个方向。

例:

for(inti=1;x+i<8;i++)//看横向向右(x+)是否可以夹子

{

if(qiju[y][x+1]!

=enemy)//x+1如果不是enemy,跳出

break;

if(qiju[y][x+i]==enemy)//如果是enemy,继续循环

continue;

elseif(qiju[y][x+i]==0)//如果是空的,跳出

break;

else//如果是friend,便翻棋子

{

for(intn=1;n

qiju[y][x+n]=friend;

flag=true;

break;

}

}

在方法最后,如果flag为true,则

qiju[y][x]=friend;//将棋子填下去

8.4.2检测棋局的状况

调用PanDing类的staticintjudge(intfriend)方法。

这个方法一般在check方法后使用。

传入其中的参数是在上一次check方法中传入的棋子颜色。

这个方法有三种返回值:

0、1、2。

0代表双方无子可下,游戏结束。

1代表对方有子可下,游戏继续进行。

2代表对方无子可下,而己方有子可下。

此时对方跳过一步,己方继续。

方法运行时,首先检测对方有无子可下:

for(inti=0;i<8;i++)

{

for(intj=0;j<8;j++)

{

if(temp[i][j]!

=0)

continue;

else

{

if(check(enemyBack,j,i)==true)

{

qiju=temp;

return1;//表示敌方有子可下

}

}

}

}

如无子可下,则检测我方。

如双方都无子可下,返回0。

8.5AI

理论上来说,黑白棋的AI至少应该分成两个部分:

探索部分和评价部分。

探索部分即模拟自己和对方的会下的地方,然后用评价系统评价棋局,最后返回得到评价最高的走法。

作为附加的部分,可以在其中设置一些套路。

即当某个出现某种棋局时,可以根据既定的套路。

此外,也可以添加学习系统。

即在结束一盘棋后对齐进行一个整体性的评价分析。

实现方法也很简单。

首先,优先搜索能够下在边上的地方。

如果没有则搜索自己所有能下的地方,最后下在自己得子最多的地方。

也是用的也是check方法。

8.6存盘与读取

在PanDing类的内部,设定了一个静态变量staticArrayListqipu=newArrayList();

当下完一步时,便将表示棋盘状况的二维数组加入到容器中。

当要进行存盘时,便使用ObjectOutputStream将其以*.sav文件的形式保存在硬盘上。

当要进行读盘时,则使用ObjectInputStream将容器读入,并通过读取绘制其中的维位数组来重现整个下棋的过程。

8.7客户端与服务器的连接

当客户端与服务器连接时,服务器会分配给客户端一个ID,并且将这个ID和指向客户端的DataOutputStream存进一个HashMap中,以ID作为Key。

随后再将现在棋局的情况发送给客户端。

包括参加双方的姓名(如果有的话),游戏进行的时间,棋盘上的状况等。

发送信息是服务器就根据ID来判别对方是否是玩家,并发出不同的指令。

当客户端要断开连接时,服务器也会根据ID找到其DataOutputStream,并将其删除。

8.8客户端与服务器间的数据传输

客户端与服务器间的命令的请求和回应基本上都是以字符串的方式来传递的(writeUTF)。

其中,每个字符串都有一个四个大写字母的开头。

根据这些大写字母,客户端或服务器决定对这些命令做怎样的处理。

“MESS”:

聊天信息。

直接显示在聊天栏上。

“QIZI”:

棋盘信息。

用来传递棋子摆放的位置及棋子的颜色。

“NAME”:

参展的玩家的名字。

“TIME”:

游戏进行的时间。

“INFM”:

游戏的一些进展情况。

如胜负,悔棋等。

“REQU”:

客户端向服务器发送的一些请求命令。

需要服务器进行回应。

“RSPN”:

服务器向客户端发送的回复命令。

8.9BUG:

这里有一些明显的BUG是关于计时器的。

比如,新加入的观战者从服务器接收关于时间的数据时有可能会因为服务器或客户端自身的原因使得观战的人的时间会和正常的时间显示产生零点几秒的误差。

当在同一个机子上启动两个客户端时,如果一个客户端启动了存档读取器,另一个客户端也启动的话,这个客户端就会锁住。

九、特色功能

1.行棋和悔棋时有音效。

2.简单的AI(可以人机对战)。

十、个人体会

这次课程设计对我个人来说是一次质的飞跃。

因为我从一开始的不知所措到后来的了然于胸,这期间我花了很长时间才转变过来。

上学期还停留在对Java语法的掌握上,这学期就要应用了。

我发现单单掌握Java语法是远远不够的,因为在编程时你会遇到很多意想不到的错误和困难。

就比如说这次的课程设计,编黑白棋程序时我就遇到了很多很多的困难,当自己敲出一行行代码时才发现自己有很多问题都没有想清楚。

有很多异常处理没有做,也有很多特殊情况没有考虑到。

因而,我觉得在编程序前,需要对自己的程序项目做一个总体的规划,然后再根据规划具体的实现规划里面的内容。

这样就可以避免花很多时间去修改代码。

还有,我觉得编程最重要的就是合作,因为一个人不可能把所有的问题都考虑进去,如果加上合作就能够轻而易举的把所有的问题都考虑清楚并且很轻松的解决问题。

有时候,我们需要从别人的思考中去思索,去得到启迪。

这是一个双赢的局面,对于这次编程,我感触最深的就是不断尝试并且学习新的内容来解决以所不可能解决的困难。

一个人不可能学会所有的东西,所以我们要在学习中不断的充实自己,不断让自己变得更强大,这样我们就在无形中学到了很多在课本中学不到的知识。

因而,我觉得编程最重要的就是亲身尝试,并且在尝试中丰富自己的经验,学习新的知识和技能。

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

当前位置:首页 > 求职职场 > 简历

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

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