如何在 Swing 中制作贪吃蛇游戏

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

首先,我们将定义游戏中使用的常量。


 private final int B_WIDTH = 300;
private final int B_HEIGHT = 300;
private final int DOT_SIZE = 10;
private final int ALL_DOTS = 900;
private final int RAND_POS = 29;
private final int DELAY = 140;

B_WIDTH B_HEIGHT 常量决定了棋盘的大小。 DOT_SIZE 是苹果的大小和蛇的点。


ALL_DOTS 常量定义板上可能的最大点数 (900 = (300*300)/(10*10))。 RAND_POS 常量用于计算苹果的随机位置。 DELAY 常量决定了游戏的速度。


 private final int B_WIDTH = 300;
private final int B_HEIGHT = 300;
private final int DOT_SIZE = 10;
private final int ALL_DOTS = 900;
private final int RAND_POS = 29;
private final int DELAY = 140;

这两个数组存储了蛇所有关节的 x 和 y 坐标。


 private final int B_WIDTH = 300;
private final int B_HEIGHT = 300;
private final int DOT_SIZE = 10;
private final int ALL_DOTS = 900;
private final int RAND_POS = 29;
private final int DELAY = 140;

loadImages() 方法中,我们获取游戏的图像。 ImageIcon 类用于显示 PNG 图像。


 private final int B_WIDTH = 300;
private final int B_HEIGHT = 300;
private final int DOT_SIZE = 10;
private final int ALL_DOTS = 900;
private final int RAND_POS = 29;
private final int DELAY = 140;

initGame() 方法中,我们创建了蛇,在棋盘上随机定位一个苹果,并启动计时器。


 private final int B_WIDTH = 300;
private final int B_HEIGHT = 300;
private final int DOT_SIZE = 10;
private final int ALL_DOTS = 900;
private final int RAND_POS = 29;
private final int DELAY = 140;

如果苹果与头部发生碰撞,我们会增加蛇的关节数。我们调用 locateApple() 方法随机定位一个新的苹果对象。

move() 方法中,我们有游戏的关键算法。要了解它,请查看蛇的移动方式。我们控制蛇的头。我们可以用光标键改变它的方向。其余关节向上移动一个位置。第二个关节移动到第一个关节所在的位置,第三个关节移动到第二个关节所在的位置,依此类推。


 private final int B_WIDTH = 300;
private final int B_HEIGHT = 300;
private final int DOT_SIZE = 10;
private final int ALL_DOTS = 900;
private final int RAND_POS = 29;
private final int DELAY = 140;

此代码将关节向上移动链。


 private final int B_WIDTH = 300;
private final int B_HEIGHT = 300;
private final int DOT_SIZE = 10;
private final int ALL_DOTS = 900;
private final int RAND_POS = 29;
private final int DELAY = 140;

这条线将头部向左移动。

checkCollision() 方法中,我们确定蛇是撞到自己还是撞到其中一堵墙。


 private final int B_WIDTH = 300;
private final int B_HEIGHT = 300;
private final int DOT_SIZE = 10;
private final int ALL_DOTS = 900;
private final int RAND_POS = 29;
private final int DELAY = 140;

如果蛇用头撞到其中一个关节,游戏就结束了。


 private final int B_WIDTH = 300;
private final int B_HEIGHT = 300;
private final int DOT_SIZE = 10;
private final int ALL_DOTS = 900;
private final int RAND_POS = 29;
private final int DELAY = 140;

如果蛇撞到棋盘底部,游戏就结束了。


完整源代码: http://geekonjava.blogspot.com/2015/07/make-snake-game-in-swing.html