# 贪吃蛇大作战小游戏
## 整体思路与架构
本项目主要分为三个部分,即UI界面、游戏逻辑与网络传输。
UI界面部分,主要是为了实现不同界面之间的切换。包括了注册登陆窗口(loginFrame)与游戏主窗口(GameUI);游戏主窗口中含有游戏初始界面(InitPage)、游戏界面(GamePage)、排名界面(RankPage)、游戏帮助(规则)界面(HelpPage);为了实现聊天等功能,游戏界面中包含了三个部分(SnakeLogic,ConnectPanel,ChatPage),对应于贪吃蛇游戏画布、服务区客户端拨号连接、聊天界面,这部分设计灵感源于QQ游戏的窗口,即大部分为游戏界面,游戏的旁边可以聊天。关系图如图一所示:
游戏逻辑部分,主要负责贪吃蛇游戏的运行、判定与游戏画布的绘制,并且尽可能地将游戏逻辑与图像绘制分离开来,其中含有socket通信类的实例作为成员变量来负责网络通信,具体见第二部分。
网络通信部分,主要负责游戏中双方信息的同步、聊天内容的同步、游戏开始时的同步。作为一个独立的模块,在游戏主逻辑类、连接界面类、聊天类中均含有其实例作为成员变量来负责信息的传输与接收。具体见第二部分。
三个主要部分的调用关系为图二所示
![](https://www.writebug.com/myres/static/uploads/2022/9/12/4e4dc3455eb7cda85fba108e53ee01b1.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/9/12/a65c31bf8f9a384e03dfc553a3e332fe.writebug)
图:UI界关系示意图 图:三个部分关系图
# 一、、模块的设计与实现思路
UI模块:贪吃蛇游戏本身只需要一个界面即可,但是考虑到排行榜、聊天等功能,UI界面就要复杂一些。首先排行榜需要用户名等信息,于是我设计了登陆注册界面;之后进入游戏主窗口之后,首先呈现游戏初始界面,可以选择开始游戏、查看排行榜、游戏规则帮助、退出。对应着图一中的四个界面(JPanel)。
初始界面(InitPage)负责用户的界面选择与切换,根据不同的按钮选择跳转不同的界面。排行榜(RankPage)负责加载排行榜、新增高分排名,显示前10位的得分,其中包含了从本地文件(GreedSnake/data/rank.txt)中读取排名并显示、向该文件写入排名等功能,在游戏结束时会更新排名。
游戏界面(GamePage)负责整个游戏主体,包含了三块JPanel:SnakeLogic, ConnectLogic, ChatLogic。其中SnakeLogic为贪吃蛇游戏的显示画布,具体设计会在游戏逻辑类部分介绍。ConnectLogic为连接部分,负责建立服务器或与服务器连接,当连接完成后会将建立的Socket与网络传输模块绑定起来,从而完成游戏中的通信部分。ChatLogic为聊天室部分,负责双方的聊天,通过绑定后的网络传输模块来完成。
游戏规则帮助界面(HelpPage)比较简单,仅为显示游戏规则。
以上四个界面均位于游戏主窗口(GameUI)中,实现了四个窗口之间的自由切换。
# 二、游戏主逻辑模块:SnakeLogics
贪吃蛇游戏包括两个部分:算法方面的逻辑与游戏画布的绘制。
## 2.1 算法:
SnakeLogic类中包含有Snake类、Entity类的实例作为成员变量,为了尽可能的体现面向对象的原则,我将涉及到蛇的功能均在Snake类的内部实现,例如蛇的移动、死亡判定、复活、进洞出洞等,所需要的地图信息由函数的参数传入,符合“开闭”原则。Snake类中还含有蛇的生命数、所得分数等信息。
SnakeLogic类中含有Food、Obstacle、Hole类,这三个类均继承自Entity类,其中封装了物体之间的碰撞检测。Snake类中表示蛇身体使用的是SnakeEntity类的对象数组,该类同样继承自Entity类,碰撞检测交由这几个底层的类来完成,尽可能地体现了面向对象的思想。
SnakeLogic类中含有包含地图信息的数组GridBlocked与GridState,分别表示障碍物信息与物体信息,在碰撞检测时作为参数传递。
SnakeLogic类中包含了Wall类来表示墙壁,其中含有不同形状的墙壁作为障碍物,通过维护GridBlocked数组来判定蛇的碰撞。
## 2.2 画布绘制:
由于贪吃蛇属于即时类游戏,对于渲染效率要求相对较高,而画面中的物体占少数,整个游戏棋盘类似于一个“稀疏矩阵”,为了尽可能的提高渲染效率,我没有采取遍历画面中的格子逐个渲染,而是预先加载背景图片(草地),之后渲染时只将地图中的物体(鸡蛋、石头、墙壁、洞)所在位置分别渲染其对应的图片(同样已经预先处理为了Image对象),以及两条蛇的身体进行渲染。我在Food,Obstacle,Hole,SnakeEntity类中均重写了基类Entity中的PaintObject(Graphics g)方
法,在其对应位置画对应的图片,在SnakeLogic类的Paint()中只需分别调用地图中物体各自的绘画函数即可完成绘制,这样做可扩展性很强,加入新的物体只需要写好碰撞函数与绘制函数即可。
由于从文件中读取图片很慢,为了提高效率,我在初始化的时候预先将用到的图片加载到了bufferedImages类中作为其成员变量,在绘图的时候根据不同类型的物体选择对应的图片 drawImage即可。
# 三、络通信模块:SocketHandle
由于是网络对战版贪吃蛇,对网络通信的要求比较高,我先后尝试了两种架构的通信:
双方本地计算的方式:即为了最大化即时性,尽可能地减少数据传输量,双方只同步“上下左右”的操作信息,游戏逻辑均在服务器与客户端的本地进行,只要传输得到的操作信息一致,在初始地图一致的情况下,双方游戏内容必定是一致的。这样我个人认为相当于“双核”运转。但在完成之后实际测试时,发现这种通信方式的容错率几乎为零,一旦哪里传输出了问题,哪怕是一个信息没有到位,之后的游戏信息就完全不一样了。在我看来,维护游戏的即时性与游戏双方的一致性本就是一个tradeoff,不可能都做的很好,但一定不能有一方很差。考虑到贪吃蛇游戏比较简单,数据传输量本身不大,过于减少数据的传输反而极大地损害了游戏双方的一致性,有些得不偿失,于是我换用了下 main第二种方法。
服务器本地计算,客户端只负责向服务器发送操作信息、接受服务器的信息并根据信息完成绘图。实现的核心主要是信息传输的方式,这种架构下服务器需要向客户端传输足够多的信息来使客户端完成绘图。但由于我的SnakeLogic写的比较OOP,其实需要传的消息并不多。首先地图上的墙壁、障碍物、洞是不会改变的,只需要游戏开始时同步一次即可,游戏中需要发送给客户端的只有蛇的位置、属性信息与随机生成的蛋的信息。而查阅资料发现Java中支持传输对象,通过序列化与反序列化的方式,问题便迎刃而解。相比于人工编码为字符串再人工解码,这样的方式会快一些。只要有了蛇的信息与蛋的信息,由于绘图都是交由最底层完成的,客户端便可以很方便的完成绘图。服务器方面,每隔一定时间向客户端发送一个ConnectCheck信号,客户端收到信号后开始repaint()更新。可以保证客户端绘制的图片与服务器上当前的状态绝大多数情况是一致的(自己测试没有出现过不一致),极小的概率不一致(但总有一些很特殊的情况,应该很难避免)。
## UI与数据交互:
界面方面,界面只负责按钮的显示�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
UI界面部分,主要是为了实现不同界面之间的切换。包括了注册登陆窗口(loginFrame)与游戏主窗口(GameUI);游戏主窗口中含有游戏初始界面(InitPage)、游戏界面(GamePage)、排名界面(RankPage)、游戏帮助(规则)界面(HelpPage);为了实现聊天等功能,游戏界面中包含了三个部分
资源推荐
资源详情
资源评论
收起资源包目录
100011695-基于Java实现贪吃蛇大作战小游戏.zip (93个子文件)
helppage
GreedSnake.jar 50.16MB
LICENSE 1KB
大作业报告.pdf 2.49MB
GreedSnake
DirectionTrans.class 570B
SocketHandle$3.class 3KB
Str.class 383B
bufferedImages.class 1KB
HelpPage.java 2KB
SocketHandle.class 8KB
Obstacle.class 1KB
Hole.class 1KB
Snake$1.class 895B
music
music.wav 48.16MB
Run.java 253B
WallEntity.class 2KB
bufferedImages.java 955B
Entity.java 8KB
ChatPanel.java 3KB
SnakeLogic.class 9KB
ConnectPanel$3.class 3KB
SetPage.class 284B
image
music.png 112KB
egg.png 20KB
grass.jpg 229KB
stone.png 64KB
timg.jpg 84KB
header.png 101KB
wall.png 16KB
header2.png 1.27MB
data
rank.txt 40B
name.txt 31B
pass.txt 22B
ConnectPanel$4.class 895B
HelpPage.class 2KB
grass.jpg 229KB
Food.class 1KB
ChatPage.java 236B
HelpPage$1.class 848B
GameUI.java 2KB
ConnectPanel.java 12KB
GameUI.class 2KB
RankPage$1.class 876B
Snake.java 11KB
Snake.class 6KB
Entity.class 944B
HoriWall.class 1005B
chatPanel.class 4KB
RankPage.class 4KB
SnakeLogic$1.class 714B
SnakeLogic$2.class 716B
Wall.class 596B
timg.jpg 10KB
SetPage.java 197B
SnakeEntity.class 2KB
Message.class 393B
Login.class 4KB
ConnectPanel$6.class 627B
Ran.class 489B
ChatPage.class 341B
Animal.class 292B
InitPage$1.class 1KB
header.png 1.27MB
InitPage.class 3KB
Wall.java 5KB
DirectionTrans$1.class 953B
ConnectPanel$5.class 1KB
LoaderClass.class 202B
Str.java 193B
RankItem.class 339B
SocketHandle$2.class 2KB
VertWall.class 1005B
SocketHandler.java 24KB
Login$1.class 959B
ConnectPanel.class 8KB
InitPage.java 3KB
LoginFrame.java 6KB
EntityTrans.class 622B
EntityTrans$1.class 1KB
CircleWall.class 1KB
SnakeLogic.java 15KB
GamePage.class 1KB
RankPage.java 4KB
SocketHandle$1.class 3KB
AngleWall.class 1KB
SnakeLogic$3.class 716B
Run.class 340B
GamePage.java 2KB
ConnectPanel$2.class 895B
ConnectPanel$1.class 843B
ThreadTrans.java 2KB
ReadMe.txt 743B
大作业报告.pages 3.07MB
README.md 13KB
共 93 条
- 1
资源评论
神仙别闹
- 粉丝: 2680
- 资源: 7667
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功