首页 > 技术文章 > Java实现贪吃蛇游戏

nullxjx 2017-07-15 01:28 原文

相信很多人大学时候都学过Java这门语言吧,这门课一般最后有一个大作业,就是用Java写一个小软件,比方说简单的聊天软件、贪吃蛇、计算器等等。这个游戏就是我自己刚学习Java的时候写的,当然刚开始都是边百度边写,很多功能当时就是只考虑了如何实现,而没有考虑这样实现合不合理。所以一开始的代码是写的非常烂的,主要是当时自己也才开始学习Java不久,所以对Java的很多语法和特性并不熟悉。后来自己闲得无聊的时候又对程序更改过很多次了,其中有过对程序结构的调整,接口的重新设计,以及很多不合理代码的改写。所以放在这里,也是给那些或许需要学习Java的同学一点参考吧。

作为以前诺基亚手机上的经典游戏,贪吃蛇和俄罗斯方块一样,都曾经在我们的童年给我们带来了很多乐趣。世间万物斗转星移,诺基亚曾经作为手机业的龙头老大,现如今也一步步走向衰落,被收购,最后都退出手机业务了,而贪吃蛇这款游戏也基本上没人玩了,甚至在新一代人的印象中都已毫无记忆。但是,作为Java初学者,这款游戏其实还是非常适合去自己实现一下的。毕竟贪吃蛇游戏规则非常简单,游戏界面也非常简单,你不需要去花费时间去设计游戏的玩法和游戏UI如何设计,也不需要去为这个游戏需要很多素材。在一定程度上也能锻炼初学者的编程能力,熟悉Java的语法。 

 

初版(2017年7月15号)游戏界面如下:

        

初版代码了大约是700行。事实上初版的界面和代码我后来都做了一定的修改,因为刚开始的代码实在太烂了,我都不好意思发出来误导新人。

第一版整体界面很简单,因为当时就是想先快速实现出来看看效果,能玩就行。这一版本的蛇没有用图片,而是直接用Java自带的函数画出来的。所以游戏启动非常快,不需要加载图片资源。

设置里能把周围彩色的边框去掉,加上去只是让玩家知道边界在哪。同时网格线也能去掉。这一版玩家只有碰到周围的墙才会死,碰到自己是不会死的。游戏界面按空格键可以暂停和开始,按ESC键可以重新开始。

 这一版游戏界面的宽度(横向的格子数)和高度(纵向的格子数)分别通过Scene类里面的 width 和 height 的值来指定,我现在界面上是设置成了width= 20,height=20。

这里需要提醒大家一点的是:二维数组中的一个坐标(x, y)和 Java界面上显示的坐标(y, x)刚好是相反的,所以在产生坐标的时候不要搞反了。

 

最新版本(2020年12月15号)游戏界面如下:

 

 

 

 

 

 

 

这一版本是第6版,代码量大约是2000行。

 

可以看到,第6版游戏界面丰富了许多,具体包括:

1. 游戏界面是背景图片,而不是之前的纯白色,并且能在设置菜单里面进行更换。

2. 贪吃蛇也不是方块了,头部和身体结点都是图片,并且都可以在设置菜单进行更换。

3. 界面上有障碍物(墙)了。玩家碰到障碍物是会死的。这一版本玩家碰到自己也会死的。

4. 界面上食物有好几种类别,不同类别食物对应的分数不一样,出现概率也不一样,每次界面上的食物被吃光时会产生新的食物。

5. 玩家蛇可以发射子弹来击毁前面的障碍物,通过吃到特定的食物来获取子弹。

6. 玩家蛇的速度是可以在设置里面设置的,默认是“行走”速度,和AI蛇一样。

7. 加入了AI蛇,AI蛇每次都是找到距离自己最近的食物,再去吃掉它,图中的黑色箭头是它找到的到距离自己最近的食物的路径。

8. 由于AI蛇用的是静态寻路算法,就是它找到自己的目标后是不会察觉周围路况变化的,为了防止玩家蛇刻意挡在AI蛇前面造成AI蛇死亡,目前的规则是AI蛇可以穿过玩家蛇,但是玩家蛇的头不能碰到AI蛇。

9. 玩家蛇在吃掉了AI蛇的目标食物后,AI蛇会自动寻找下一个距离自己最近的食物去吃掉。

10. AI蛇有可能走进死胡同里或者自己把自己缠死,这样的话游戏也会自动结束,其他情况下AI蛇一般不会死。

11. 玩家蛇的速度默认和AI蛇保持一致(行走),玩家蛇若和AI蛇保持相同的速度,相同时间内,长度可能没有AI蛇长,如果玩家蛇速度比AI快,并且每次都去抢AI的食物,AI就比不过玩家。

12. 游戏地图是可以通过map文件夹下的txt文件进行设置的,详细设置规则可以参考GitHub。

 

第5版中存在的一些功能在第6版中被我去掉了,包括以下部分:

1. 长按方向键可以加速

2. 障碍物每隔一定时间会自动移动和变化形状

3. 食物每隔一段时间会自动刷新

 

 

由于代码比较多,为了方便阅读,游戏各个版本的代码和相关文件都放到了我的

推荐阅读