Java面向对象程序设计实践:基于Socket网络编程的五子棋对战平台

目录

一、概述

二、设计过程

三、测试过程以及解决方法

四、实现效果

五、源代码


近来有空闲,把前几个学期做的实验上传上来。如有错误的地方欢迎大佬批评指正,有更好的方法也期待您的分享~


实验要求

使用Java语言开发并调试,完成一个网络对战游戏平台。能实现用户的远程登录,游戏大厅,选座落座,群聊聊天或者私人聊天,以及双人五子棋游戏对战功能。


一、概述

1.1 系统介绍

本系统基于 Java 语言开发并实现一个具有独立服务器端,支持多个客户端连接的五子棋网络对战游戏平台,其拥有五子棋对战的基本功能,如落子、判断胜负等;通过客户端连接服务器,实现用户的远程登录、游戏大厅、选座落座等;为了提高整个系统的交互,还实现了玩家之间的聊天功能和一些简单的命令。

1.2 功能性需求

(1)登录页面

首先呈现的是登录页面,该页面由用户填写个人用户名、服务器地址以及选择头像。

(2)主页落座

主页落座可以点击自动落座或者选择特定的座位坐下。

(3)聊天框

聊天页面用户可以实现群聊聊天。

(4)基本对战

对战页面可以显示自己和对手的用户名、头像信息。双方准备之后就能开始游戏。开始游戏时能展示轮到哪方下棋。游戏结束,能够在双方页面展示输赢信息。确定后重置棋盘,可以重新开局。并且游戏页面支持对战用户聊天。

1.3 非功能性需求

点开登陆页面,背景音乐响起。在下棋过程中,落子时发出声音。

图1 系统功能

二、设计过程

2.1 C/S架构设计

游戏系统使用的是 C/S(Client/Server) 网络架构,是一种常见的软件系统体系结构,主要应用于局域网内采用两层结构,即前端是客户机,后端是服务器是一种“一对多”的模式。客户端负责完成与用户的交互全程只有一台服务器,服务器负责数据的管理例如通过 Socket 接受处理多个客户端发来的请求,完成了业务逻辑之后,再将结果信息返回给客户端。

图2 C/S 模式图

2.2整体流程

用户首先进入登录页面,填写信息后,点击登录按钮进入游戏大厅页面。客户端和服务器进行首次连接,登录信息发送给服务器。用户进入游戏大厅时,会和服务器一直保持通信状态,用户期间可以进行聊天、落座等功能。点击座位后,用户进入游戏页面,双方准备之后游戏开始。用户之间的落子信息等通信通过子服务器来处理。

图3 系统运作整体流程图

2.3服务器设计

客户端之间的通信主要是由服务器中转。使用泛型类 Server 容器 users 存储玩家信息,采用 ServerSocket 接收来自客户端的 String 信息写入,客户端请求登录后,服务器调用 ChatServer01()  将用户添加到 users 容器,对其 String 信息进行分割、判断识别后给出对应反馈,并将信息分发给所有在线的用户,通知其他玩家新人进入房间的信息。构建信息读取类,在此类中对接收的客户端信息进行识别操作,调用 MsgReader01() 继承 Thread 类并重写 run() 方法,在创建此对象后启动线程。

图4 Server 类结构图
图5 MsgReader01 类结构图

在棋盘界面 MsgReader02 中,user 存储当前用户的信息, userList 容器存储所有用户的信息,二维数组 array[][] 存储棋子信息,将客户端传递的 String 信息分割成字符串数组,从中提取出x坐标和y坐标。开始游戏后,根据数组 judge_start[] 的值决定棋子的颜色(1代表黑子,2代表白子),函数 winCol() 判断胜利。

图6 MsgReader02 类图

2.4功能设计

2.4.1登录页面设计流程

对于主容器组件采用网格式布局,各部分组成面板采用边界式布局,对于按钮逐渐要添加事件监听事件,使用户在选择点击后能进入相应的功能界面。“连接”按钮判断用户名是否输入,若是连接输入的服务器,并跳转至主界面;“重置”按钮将用户名为空、头像选择设置为初始头像;“退出”按钮退出登陆界面。

用户登录后填写相应的头像和名字,点击确认后,系统判断姓名是否为空以及服务器是否有相同名字的人。如果名字栏不为空,并且没有同名字的人,用户通过登录验证,进入游戏大厅,否则显示提醒重新输入。

图7 登录页面流程图

用户登录之后创建TestUser ,服务器端保存该 TestUser ,包含用户姓名name,用户头像的本地地址face,以及用户座位 seat 。TestUser类如下图。登录之后,客户端开启线程,不断向服务器发起请求数据。请求用户座位和已经登录用户的信息。

图8 用户信息类TestUser

2.4.2群聊设计流程

聊天功能用于实现多个客户端进入游戏后可进行相互之间的信息交互。

游戏大厅的聊天框页面,消息框会自动获取服务器上登录的信息,并且会展示一条已经登陆的信息“xxx已经登录啦!”。

若用户在文本框输入信息点击“发送”按钮,需要判断输入是否为空,如果为空,弹出提示框;若不为空,则该客户端所输入信息会显示于所有建立连接的客户端界面上,发送信息到所有人。

五子棋游戏页面,该聊天界面不会显示所有玩家的信息,只会显示进行对战之间两位玩家的信息交流。

图9 客户端与服务器端的聊天功能运作流程

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里面获取随机数,判断是否有人,如果有人就重复获取,直到道获取到空的位置,不再有空位就提示用户。将座位取出后模拟一次点击。

图10 落座流程图

2.4.4对战设计流程

(1)棋局模型的设计

由于客户端和服务器需要频繁获取对方的各种对战信息,所以封装一个棋局模型类(waitConnect02)。二维数组 array[][] 用来保存棋子,judge_start[] 代表棋子的颜色(1代表黑子,2代表白子)。 

(2)用户下棋 

用户进入后,客户端自动为双方分配棋子颜色,如果双方完成准备,则双方点击开始游戏。黑先(黑方的第一枚棋子可下在棋盘任意交叉点上)、白后,交替下子,每次只能下一子。用户放完棋子后,将消息发送给子服务器,服务器判断输赢分发给每个客户端。

图11 游戏对战客户端间交互流程

(3)输赢展示

客户端收到棋局信息,判断棋局是那种颜色赢,如果是SPACE 则继续对战,否则就判断本地颜色是否和棋局赢的那方赢,如果是则本地提示赢了,否则本地提示输了。并将用户取消与子客户端的连接。

(4)退出

用户点击“退出”按钮,如果用户还在对战,则弹出提示框,提示用户不可推出。如果不在对战,将本地棋盘重置,本地聊天框Ui重置,通知母服务器删除座位。

图12 退出操作流程图

(5)输赢算法

用户下棋之后,本地判断棋子输赢。每下一颗棋子,判断算法接收棋子x坐标,y坐标,棋子颜色三个参数。分别判断上、下、左、右、左上、左下、右上、右下八个方位是否五子连成一线。如果遍历指针遇到和当前颜色不相同的棋子,就更换方位。如果一个方位上的棋子大于等于4个就立即返回true,如果所有方位都没有被返回,就说明都不符合,返回false。

图13 五子棋输赢算法描述图

2.4.5  附加功能设计

(1)背景音乐 

封装一个 Music 类存储背景音乐,用户一打开登陆界面便调用 run() 方法开启背景音乐。

图14 Music 类结构图

(2)落子音乐

双方用户都准备开始游戏后开启对战音乐,MusicThread的start()方法专门控制音乐的播放,stop()方法控制音乐的暂停。用户点击下棋时,播放落子音效。

图15 MusicThread 类结构图

三、测试过程以及解决方法

3.1 通信的问题

采用字符串 String 进行数据传输,在客户端和服务器之间建立可靠的通信协议,将字符串s, i, my_face, 和 my_name写入客户端的输出流,服务器读取信息,采用 split(" ") 根据空格将信息分割成一个字符串数组 str_01[] ,从而进行后续的操作。

3.2 类型转换的问题

不同类型之间不可进行对应比较, str_01[] 数组存储了客户端的信息,从中直接提取出的数据类型为 string ,所以需要采用 parseInt() 将提取出棋子的 x 坐标和 y 坐标转换为整数,再对棋子进行判断胜负等操作。解决方法:调用相关类型的转换函数进行类型转换。

3.3 五子棋判断胜负的问题

一开始的判胜方法为从左上角开始对每一个棋子进行遍历和判断,这种方法耗时耗力,后来改成每下一颗棋子,从该棋子的上、下、左、右、左上、左下、右上、右下八个方向进行判断。

四、实现效果

4.1  登录页面

用户正常输入用户名,选择头像后进入游戏大厅页面。

图16 用户登录页面

输入用户名为空进行提示。

图17 用户登录异常页面

4.2  游戏大厅

用户进入游戏大厅后,左上角将展示自己的个人信息,左下角会有自己或者其他用户的登录信息。用户坐下后,其他用户可显示自己的坐下的信息。若更换位置,原来座位信息将被删除。已经有人坐下的位置不可被点击。右上角的自动落座按钮,能让用户一键落座,增加可玩性。

图18 游戏大厅页面

4.3 五子棋页面

用户进入五子棋页面后可以展示五子棋对战页面的信息,双方准备后游戏开始。同时准备按钮不可点击。

图19 用户五子棋对战页面

游戏结束后双方都可以看到输赢的提示框。

图20 游戏结束提示框

4.4 音效

为了提升用户游戏体验,系统增加了音效功能。游戏开始之后,背景音效随之响起。同时,当用户放置棋子时,将发出落子音效。

图21 客户端音效

4.5 消息聊天

图22 用户张三、李四互相发送欢迎信息

五、源代码

https://download.csdn.net/download/m0_73700621/89447971

  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java语言游戏项目实战资源包 内容概览: 这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整的代码实现。 项目文档:详细的项目文档,介绍了项目的背景、功能、架构以及实现细节,帮助你更好地理解项目。 操作手册与使用说明:针对每个游戏项目,都准备了详细的操作手册和使用说明,手把手教你如何运行和测试项目。 学习笔记:整理了Java语言在游戏开发中的核心知识点和常用技术,方便你随时查阅和学习。 适用人群: 这份资源包适用于所有对Java游戏开发感兴趣的朋友,无论你是计算机专业的学生,还是希望业余时间尝试游戏开发的爱好者,都可以从中受益。 使用建议: 由浅入深实践:建议先从简单的游戏项目开始,逐步深入,既能增强自信,也能逐步提升技术水平。 结合文档与代码:在实践过程中,结合项目文档和代码,理解每一行代码背后的意义和原理。 持续学习与探索:Java语言和游戏开发技术都在不断更新,建议你在实践中持续学习新的技术和工具,不断提升自己。 Java语言游戏项目实战资源包 内容概览: 这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整的代码实现。 项目文档:详细的项目文档,介绍了项目的背景、功能、架构以及实现细节,帮助你更好地理解项目。 操作手册与使用说明:针对每个游戏项目,都准备了详细的操作手册和使用说明,手把手教你如何运行和测试项目。 学习笔记:整理了Java语言在游戏开发中的核心知识点和常用技术,方便你随时查阅和学习。 适用人群: 这份资源包适用于所有对Java游戏开发感兴趣的朋友,无论你是计算机专业的学生,还是希望业余时间尝试游戏开发的爱好者,都可以从中受益。 使用建议: 由浅入深实践:建议先从简单的游戏项目开始,逐步深入,既能增强自信,也能逐步提升技术水平。 结合文档与代码:在实践过程中,结合项目文档和代码,理解每一行代码背后的意义和原理。 持续学习与探索:Java语言和游戏开发技术都在不断更新,建议你在实践中持续学习新的技术和工具,不断提升自己。 Java语言游戏项目实战资源包 内容概览: 这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整的代码实现。 项目文档:详细的项目文档,介绍了项目的背景、功能、架构以及实现细节,帮助你更好地理解项目。 操作手册与使用说明:针对每个游戏项目,都准备了详细的操作手册和使用说明,手把手教你如何运行和测试项目。 学习笔记:整理了Java语言在游戏开发中的核心知识点和常用技术,方便你随时查阅和学习。 适用人群: 这份资源包适用于所有对Java游戏开发感兴趣的朋友,无论你是计算机专业的学生,还是希望业余时间尝试游戏开发的爱好者,都可以从中受益。 使用建议: 由浅入深实践:建议先从简单的游戏项目开始,逐步深入,既能增强自信,也能逐步提升技术水平。 结合文档与代码:在实践过程中,结合项目文档和代码,理解每一行代码背后的意义和原理。 持续学习与探索:Java语言和游戏开发技术都在不断更新,建议你在实践中持续学习新的技术和工具,不断提升自己。Java语言游戏项目实战资源包 内容概览: 这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整的代码实现。 项目文档:详细的项目文档,介绍了项目的背景、功能、架构以及实现细节,帮助你更好地理解项目。 操作手册与使用说明:针对每个游戏项目,都准备了详细的操作手册和使用说明,手把手教你如何运行和测试项目。 学习笔记:整理了Java语言在游戏开发中的核心知识点和常用技术,方便你随时查阅和学习。 适用人群: 这份资源包适用于所有对Java游戏开发感兴趣的朋友,无论你是计算机专业的学生,还是希望业余时间尝试游戏开发的爱好者,都可以从中受益。 使用建议: 由浅入深实践:建议先从简单的游戏项目开始,逐步深入,既能增强自信,也能逐步提升技术水平。 结合文档与代码:在实践过程中,结合项目文档和代码,理解每一行代码背后的意义和原理。 持续学习与探索:Java语言和游戏开发技术都在不断更新,建议你在实践中持续学习新的技术和工具,不
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值