【源码+文档】贪吃蛇大作战小游戏

一、模块的设计与实现思路

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即可。

 源码和文档都托管在了【WRITE-BUG数字空间】上面了,有需要的可自取~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值