目录
近来有空闲,把前几个学期做的实验上传上来。如有错误的地方欢迎大佬批评指正,有更好的方法也期待您的分享~
实验要求
使用Java语言开发并调试,完成一个网络对战游戏平台。能实现用户的远程登录,游戏大厅,选座落座,群聊聊天或者私人聊天,以及双人五子棋游戏对战功能。
一、概述
1.1 系统介绍
本系统基于 Java 语言开发并实现一个具有独立服务器端,支持多个客户端连接的五子棋网络对战游戏平台,其拥有五子棋对战的基本功能,如落子、判断胜负等;通过客户端连接服务器,实现用户的远程登录、游戏大厅、选座落座等;为了提高整个系统的交互,还实现了玩家之间的聊天功能和一些简单的命令。
1.2 功能性需求
(1)登录页面
首先呈现的是登录页面,该页面由用户填写个人用户名、服务器地址以及选择头像。
(2)主页落座
主页落座可以点击自动落座或者选择特定的座位坐下。
(3)聊天框
聊天页面用户可以实现群聊聊天。
(4)基本对战
对战页面可以显示自己和对手的用户名、头像信息。双方准备之后就能开始游戏。开始游戏时能展示轮到哪方下棋。游戏结束,能够在双方页面展示输赢信息。确定后重置棋盘,可以重新开局。并且游戏页面支持对战用户聊天。
1.3 非功能性需求
点开登陆页面,背景音乐响起。在下棋过程中,落子时发出声音。
![](https://img-blog.csdnimg.cn/direct/27521c4b906947fea01976ce362efa3e.png)
二、设计过程
2.1 C/S架构设计
游戏系统使用的是 C/S(Client/Server) 网络架构,是一种常见的软件系统体系结构,主要应用于局域网内,采用两层结构,即前端是客户机,后端是服务器,是一种“一对多”的模式。客户端负责完成与用户的交互,全程只有一台服务器,服务器负责数据的管理,例如通过 Socket 接受处理多个客户端发来的请求,完成了业务逻辑之后,再将结果信息返回给客户端。
![](https://img-blog.csdnimg.cn/direct/5f1b6eebb5d44eabb3ac34d81e440c1c.png)
2.2整体流程
用户首先进入登录页面,填写信息后,点击登录按钮进入游戏大厅页面。客户端和服务器进行首次连接,登录信息发送给服务器。用户进入游戏大厅时,会和服务器一直保持通信状态,用户期间可以进行聊天、落座等功能。点击座位后,用户进入游戏页面,双方准备之后游戏开始。用户之间的落子信息等通信通过子服务器来处理。
![](https://img-blog.csdnimg.cn/direct/29197e44004046aea6f210aee7ff8451.png)
2.3服务器设计
客户端之间的通信主要是由服务器中转。使用泛型类 Server 容器 users 存储玩家信息,采用 ServerSocket 接收来自客户端的 String 信息写入,客户端请求登录后,服务器调用 ChatServer01() 将用户添加到 users 容器,对其 String 信息进行分割、判断识别后给出对应反馈,并将信息分发给所有在线的用户,通知其他玩家新人进入房间的信息。构建信息读取类,在此类中对接收的客户端信息进行识别操作,调用 MsgReader01() 继承 Thread 类并重写 run() 方法,在创建此对象后启动线程。
![](https://img-blog.csdnimg.cn/direct/e2e4e3b02f50434cbf642e74ad052851.png)
![](https://img-blog.csdnimg.cn/direct/335e1658786045d19701a406b250efa7.png)
在棋盘界面 MsgReader02 中,user 存储当前用户的信息, userList 容器存储所有用户的信息,二维数组 array[][] 存储棋子信息,将客户端传递的 String 信息分割成字符串数组,从中提取出x坐标和y坐标。开始游戏后,根据数组 judge_start[] 的值决定棋子的颜色(1代表黑子,2代表白子),函数 winCol() 判断胜利。
![](https://img-blog.csdnimg.cn/direct/68deec4bacd648709eadf66ae575b2d9.png)
2.4功能设计
2.4.1登录页面设计流程
对于主容器组件采用网格式布局,各部分组成面板采用边界式布局,对于按钮逐渐要添加事件监听事件,使用户在选择点击后能进入相应的功能界面。“连接”按钮判断用户名是否输入,若是连接输入的服务器,并跳转至主界面;“重置”按钮将用户名为空、头像选择设置为初始头像;“退出”按钮退出登陆界面。
用户登录后填写相应的头像和名字,点击确认后,系统判断姓名是否为空以及服务器是否有相同名字的人。如果名字栏不为空,并且没有同名字的人,用户通过登录验证,进入游戏大厅,否则显示提醒重新输入。
![](https://img-blog.csdnimg.cn/direct/51ab9408117e4d6e8157bb15a7153456.png)
用户登录之后创建TestUser ,服务器端保存该 TestUser ,包含用户姓名name,用户头像的本地地址face,以及用户座位 seat 。TestUser类如下图。登录之后,客户端开启线程,不断向服务器发起请求数据。请求用户座位和已经登录用户的信息。
![](https://img-blog.csdnimg.cn/direct/9f958ee60ac04ebe9e98c2c0dc42364e.png)
2.4.2群聊设计流程
聊天功能用于实现多个客户端进入游戏后可进行相互之间的信息交互。
游戏大厅的聊天框页面,消息框会自动获取服务器上登录的信息,并且会展示一条已经登陆的信息“xxx已经登录啦!”。
若用户在文本框输入信息点击“发送”按钮,需要判断输入是否为空,如果为空,弹出提示框;若不为空,则该客户端所输入信息会显示于所有建立连接的客户端界面上,发送信息到所有人。
五子棋游戏页面,该聊天界面不会显示所有玩家的信息,只会显示进行对战之间两位玩家的信息交流。
![](https://img-blog.csdnimg.cn/direct/6f5e04fe822e477daa8db6407cb1971c.png)
2.4.3主页落座设计
(1)座位的设计
数组jb_noone[] 为座位,共30个;数组 jl_xqnoone[] 为桌子;数组 jl_name[] 为用户名;数组 jl_number[] 为桌号。使用for循环排座位,如果i是偶数,则当前为左侧座位按钮,添加完组件后 x 坐标右移一个桌子的宽度;否则当前为右侧座位按钮,添加完组件后 x 坐标右移一个桌距。
(2)用户主动点击座位按钮落座
用户点击座位后,系统判断该座位是否已经有人坐下,有的话在本地删除UI并且通知服务器删除用户;若无则使用包含s, i, my_face, 和 my_name的字符串 String将座位坐标位置和用户头像写入服务器。之后调起五子棋页面,并且发送信息告诉服务器该用户坐下,服务器分发给其他登录用户。
(3)自动落座
如果用户点击“自动落座”按钮,在0-14里面获取随机数,判断是否有人,如果有人就重复获取,直到道获取到空的位置,不再有空位就提示用户。将座位取出后模拟一次点击。
![](https://img-blog.csdnimg.cn/direct/62160d179a7e445f8dca86e703108bd8.png)
2.4.4对战设计流程
(1)棋局模型的设计
由于客户端和服务器需要频繁获取对方的各种对战信息,所以封装一个棋局模型类(waitConnect02)。二维数组 array[][] 用来保存棋子,judge_start[] 代表棋子的颜色(1代表黑子,2代表白子)。
(2)用户下棋
用户进入后,客户端自动为双方分配棋子颜色,如果双方完成准备,则双方点击开始游戏。黑先(黑方的第一枚棋子可下在棋盘任意交叉点上)、白后,交替下子,每次只能下一子。用户放完棋子后,将消息发送给子服务器,服务器判断输赢分发给每个客户端。
![](https://img-blog.csdnimg.cn/direct/7539908e532e470a936374b0292aafb3.png)
(3)输赢展示
客户端收到棋局信息,判断棋局是那种颜色赢,如果是SPACE 则继续对战,否则就判断本地颜色是否和棋局赢的那方赢,如果是则本地提示赢了,否则本地提示输了。并将用户取消与子客户端的连接。
(4)退出
用户点击“退出”按钮,如果用户还在对战,则弹出提示框,提示用户不可推出。如果不在对战,将本地棋盘重置,本地聊天框Ui重置,通知母服务器删除座位。
![](https://img-blog.csdnimg.cn/direct/4b2ab0066ee9476fa11be32b38bc97e2.png)
(5)输赢算法
用户下棋之后,本地判断棋子输赢。每下一颗棋子,判断算法接收棋子x坐标,y坐标,棋子颜色三个参数。分别判断上、下、左、右、左上、左下、右上、右下八个方位是否五子连成一线。如果遍历指针遇到和当前颜色不相同的棋子,就更换方位。如果一个方位上的棋子大于等于4个就立即返回true,如果所有方位都没有被返回,就说明都不符合,返回false。
![](https://img-blog.csdnimg.cn/direct/53edceab18a44b7b9bf92a28ea7fa5d7.png)
2.4.5 附加功能设计
(1)背景音乐
封装一个 Music 类存储背景音乐,用户一打开登陆界面便调用 run() 方法开启背景音乐。
![](https://img-blog.csdnimg.cn/direct/295950017a0742cfa6a871e7095720d8.png)
(2)落子音乐
双方用户都准备开始游戏后开启对战音乐,MusicThread的start()方法专门控制音乐的播放,stop()方法控制音乐的暂停。用户点击下棋时,播放落子音效。
![](https://img-blog.csdnimg.cn/direct/047e316dfce04b589cfbb3864dcb2e56.png)
三、测试过程以及解决方法
3.1 通信的问题
采用字符串 String 进行数据传输,在客户端和服务器之间建立可靠的通信协议,将字符串s, i, my_face, 和 my_name写入客户端的输出流,服务器读取信息,采用 split(" ") 根据空格将信息分割成一个字符串数组 str_01[] ,从而进行后续的操作。
3.2 类型转换的问题
不同类型之间不可进行对应比较, str_01[] 数组存储了客户端的信息,从中直接提取出的数据类型为 string ,所以需要采用 parseInt() 将提取出棋子的 x 坐标和 y 坐标转换为整数,再对棋子进行判断胜负等操作。解决方法:调用相关类型的转换函数进行类型转换。
3.3 五子棋判断胜负的问题
一开始的判胜方法为从左上角开始对每一个棋子进行遍历和判断,这种方法耗时耗力,后来改成每下一颗棋子,从该棋子的上、下、左、右、左上、左下、右上、右下八个方向进行判断。
四、实现效果
4.1 登录页面
用户正常输入用户名,选择头像后进入游戏大厅页面。
![](https://img-blog.csdnimg.cn/direct/92ce6da370de40eab2eaa1fc9f815510.png)
输入用户名为空进行提示。
![](https://img-blog.csdnimg.cn/direct/144ad1799220413daa4921740da4a01b.png)
4.2 游戏大厅
用户进入游戏大厅后,左上角将展示自己的个人信息,左下角会有自己或者其他用户的登录信息。用户坐下后,其他用户可显示自己的坐下的信息。若更换位置,原来座位信息将被删除。已经有人坐下的位置不可被点击。右上角的自动落座按钮,能让用户一键落座,增加可玩性。
![](https://img-blog.csdnimg.cn/direct/a11a7b8d576d4749bd4f84664bb0e3dc.png)
4.3 五子棋页面
用户进入五子棋页面后可以展示五子棋对战页面的信息,双方准备后游戏开始。同时准备按钮不可点击。
![](https://img-blog.csdnimg.cn/direct/bc6dcde2f466427b9604fa8150fa233d.png)
游戏结束后双方都可以看到输赢的提示框。
![](https://img-blog.csdnimg.cn/direct/7dadc8ceb44e4c79a0f821b66be189e8.png)
4.4 音效
为了提升用户游戏体验,系统增加了音效功能。游戏开始之后,背景音效随之响起。同时,当用户放置棋子时,将发出落子音效。
![](https://img-blog.csdnimg.cn/direct/dabfe8d4aa1a45c584259deb12086fa1.png)
4.5 消息聊天
![](https://img-blog.csdnimg.cn/direct/65e5f7b37ce949af97b0e8322e83f4fa.png)