这是XJX用Java语言实现的一个贪吃蛇游戏。
- 游戏总的代码行数差不多是700行。
- 游戏中贪吃蛇的头部是一个红色方块,贪吃蛇的身体结点是渐变色的方块。食物是绿色的圆形。
- 您可以通过键盘上的方向键或者WASD键来控制蛇的移动。
- 在游戏界面按ESC键可以直接重新开始游戏,按空格键可以实现暂停和开始。
- 菜单栏的设置菜单可以设置网格以及边框是否可见。游戏界面右边会显示你的当前长度和当前所花时间。
- 吃到食物和死亡时都会有相应的音效。
- 右边会显示你的当前长度和所花时间。
- 游戏界面的宽度(横向的格子数)和高度(纵向的格子数)分别可以通过 Scene 类中的 width 和 height变量来设置,默认两者都是20。
截图如下:
demo1 | demo2 | demo3 |
---|---|---|
- 此版本更换了蛇的外形,包括蛇头以及蛇身。
- 加入了多种食物,每种食物对应的得分不同,不同分值的食物产生的概率不同,原则是分值越高的食物产生的概率越低。加入了记分功能。
- 每种食物在产生5秒时间内如果没有被吃掉就会自动移动或者消失。
-
本次对程序结构进行了一定的调整,调整后所有源程序在同一个包xjx下。
-
原来的SnakeDemo.java文件基本保持不变,做了一些修改。
-
主界面写在了另外一个源文件MainWindow.java中。
-
程序主界面进行了重大改变
- 蛇的活动范围增大了一些
- 加入了设置菜单,可以设置游戏背景,蛇身体,蛇头部,速度。
- 加入了背景图片,为了让背景显得简洁一点,可以选择是否显示网格。
- 菜单栏加入了游戏使用说明,以及关于游戏。
- 此版本相对上一版本加入了障碍物,障碍物随机产生,每隔一段时间自动随机移动,障碍物的长度也随机,排列也随机。
- 经过本人的相关测试,不排除游戏开始时障碍物出现在你面前导致来不及躲的情况,以及你加速中障碍物改变位置时也可能出现在你面前,所以加速不像上个版本那样,此版本加速有风险。
- 为了配合障碍物的出现,游戏加入了蛇发射子弹击毁前进道路上的障碍物的技能。目前每次只能发射一个子弹,不能连续发射多枚子弹。
- 子弹通过吃特定的食物获得,食物样子为一把枪。吃得枪每次增加一颗子弹,不增加得分,增加长度。
- 子弹产生的概率在所有食物中最低。按Shift键发射子弹。
- 对代码进行了一次重构。
- 修复部分bug。
- 代码量2000行左右。
- 对代码进行了一次彻底重构。
- 修复更换图片后,游戏界面刷新不及时的问题
- 修复打开“设置背景图片”面板时间比较长的问题
- 移除长按加速
- 移除食物自动刷新
- 移除障碍物自动刷新
- 加入AI🐍
- 游戏现在有三种模式
- 仅玩家蛇
- 仅AI蛇
- 玩家蛇和AI蛇同时存在
- 游戏地图从map目录下读取,你可以按照目录下的txt文件格式设计自己的地图,目录里面已经包含了三个地图
- 注意,每行的每个字符后面都有一个\t字符,不能包含任何空行。
- 其中,0表示这个位置是路,3表示是障碍物,不能有其他数字。
- 示例地图请参考 example map >
截图如下:
demo1 | demo2 | demo3 |
---|---|---|
注意:
- 由于AI蛇目前使用的是静态寻路算法,所以为了避免玩家蛇故意挡在AI蛇前面造成AI蛇死亡,游戏中允许AI蛇碰到玩家蛇,但是不允许玩家蛇头部碰到AI蛇。
- 如果玩家蛇吃掉了AI蛇的目标食物,AI蛇会自动寻找下一个距离它最近的食物,然后去吃掉。
- 目前AI蛇只有在2种情况下会死
- 进入一个凹形区域去吃里面的食物,然后发现出不来了。(玩家蛇可以使用子弹击毁障碍物出来,AI不可以发射子弹)
- 自己身体把自己的头包围起来了,然后也找不到出去的路了。
- AI蛇和玩家蛇死了游戏都会自动结束,按Esc键可以重新开始。
比如下面这种情况就是AI蛇进入凹形区域后发现出不来了,然后就只有选择goDie了🤣
before | after |
---|---|
- 程序结构调整
- AI寻路策略优化
调整之后的AI寻路策略为
void move(){
1.获取AI头部坐标head
2.获取界面上所有食物坐标food_pos_sets
3.判断从head出发,是否存在一条能够安全达到某个食物的路径(安全暂时定义为虚拟蛇吃完这个食物后还能找到自己的尾巴)
3.1如果存在多条这样的路径,则选其中最短的一条,让AI沿着这条路移动一步
3.2如果不存在这样的路径,则寻找一条能够到达自己尾巴的最长路径
3.2.1如果存在这样的路径,则沿着这条路移动一步
3.2.2如果不存在这样的路径,则死亡
}
如果你想设置自己的游戏地图,只需要按照上面的说明新建一个txt文件,例如demo.txt,然后修改下面的一个地方即可:
//主函数入口
public static void main(String[] args) {
System.out.println("Application starting...\t" + Util.getSysTime());
Scene game = new Scene();
game.mapFile = "demo.txt";//唯一需要修改的地方,如果你想更换地图的话
game.gameMode = 1;
game.loadGameMap(game.mapFile);//加载游戏地图
Util.PrintMap(game.getMap(),"debug//map.txt");//此处不需要修改
game.initUI();//初始化游戏界面
game.run();//开始游戏
System.out.println("\nGame start...\t" + Util.getSysTime());
}
有问题通过本人邮件联系我