本文发表于入职啦(公众号: ruzhila) 大家可以访问入职啦学习更多的编程实战。
🎉 ‼️ Java要实现精简的100行代码难度极大‼️ 但是还是完成了!👏 🎉
用100行代码实现了一个贪吃蛇游戏,不需要任何第三方依赖,只需要Java的标准库就可以运行,图形化版本!
项目地址
代码已经开源, snake-java 👏 欢迎Star
代码运行效果:
所有的项目都在github上开源:100-line-code 欢迎Star 👏
用100行代码的不同语言(Java、Python、Go、Javascript、Rust)实现项目,通过讲解项目的实现,帮助大家学习编程
我们会定期在群里分享最新的项目实战代码,包括不同语言的实现
老师还会详细讲解代码优化的思路,扫码加入实战群:
Java图形库实现游戏开发
整个代码的思路:
贪吃蛇游戏规则
贪吃蛇相比较其他游戏,规则比较简单,主要规则如下:
- 贪吃蛇是一个由一条蛇和食物组成的游戏
- 蛇可以通过键盘控制上下左右移动
- 吃到食物后,重新生成食物
- 蛇碰到墙壁或者自己的身体,游戏结束
绘制思路:
- 使用JFrame绘制游戏窗口
- 蛇是一个数组组成身体,设置一个移动方向,让身体的每个元素都移动到前一个元素的位置
- 创建一个Timer, 用来检查游戏状态和移动蛇的身体
- 每次移动,判断是否吃到食物,如果吃到食物,重新生成食物
直接上代码
代码解析
SnameGame.java 是一个独立的文件,主要是依赖了Java的图形库Swing来实现游戏的绘制
数据结构抽象
整个游戏的绘制仍然是按照Grid的方式绘制,每个格子的大小是25x25,蛇和食物都是一个Rectangle对象,通过Graphics对象来绘制
其中蛇是一个x,y坐标的数组,每次移动都是将蛇的身体的每个元素移动到前一个元素的位置
而苹果是一个随机生成的appleX,appleY坐标,每次吃到苹果后重新生成
事件处理
这个游戏只需要处理方向移动即可,不同于俄罗斯方块,贪吃蛇每次修改方向之后,会保持运动方向,直到碰到墙壁或者自己的身体
所以我们需要设置一个direction变量,来记录当前的方向:
并且在绘制的过程中修改蛇身体每个元素的坐标,来实现蛇的移动
UI绘制
游戏的主要逻辑就是通过Timer来不断的绘制游戏的UI,每次的间隔150毫秒
- 代码43行: 蛇的每个每个元素移动到前一个元素的位置,是从后往前移动
- 47-55行: 然后第0个元素根据direction来计算新的位置
- 代码76行: 蛇的头部(x[0])和appleX,appleY是否碰撞就能判断是否吃到苹果
- 81-85行: 头部不能碰到身体的任何一个元素,否则游戏结束
- 代码86行: 不能碰到墙壁,否则游戏结束
总结
一开始写了将近200行的代码,按照Java的面向对象实现了基本的功能
然后在保证可阅读的情况下开始精简代码,发现在往下可能就要牺牲功能和可阅读,但是仍然达到了100行的目标
过程中我们的老师也互相挑战,代码是否还能持续优化,发现结对编程的优势:能让人更快的找到解法
对比Python和Javascript而言,Java代码更加让人容易懂,因为没有特别复杂的语法,一切都非常的直观,但是缺少语法糖让一些简单的遍历、赋值等操作略显繁琐(相比Python)
Java还是非常适合初学者的,因为它的语法非常的直观,而且有很多的库可以使用,但是对于一些高级的功能,可能就需要更多的代码量了
交流
我们构建了一个100行代码项目的实战群,大家可以扫码加入,一起学习编程
也可以访问入职啦学习更多的编程实战
所有的代码都在github上开源:100-line-code 欢迎Star 👏