高难度 100行Java代码实现贪吃蛇游戏,不需要第三方依赖

本文发表于入职啦(公众号: 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行的目标

过程中我们的老师也互相挑战,代码是否还能持续优化,发现结对编程的优势:能让人更快的找到解法

对比PythonJavascript而言,Java代码更加让人容易懂,因为没有特别复杂的语法,一切都非常的直观,但是缺少语法糖让一些简单的遍历、赋值等操作略显繁琐(相比Python

Java还是非常适合初学者的,因为它的语法非常的直观,而且有很多的库可以使用,但是对于一些高级的功能,可能就需要更多的代码量了

交流

我们构建了一个100行代码项目的实战群,大家可以扫码加入,一起学习编程
入群学习

也可以访问入职啦学习更多的编程实战

关注公众号入职啦,每日分享有趣的知识

所有的代码都在github上开源:100-line-code 欢迎Star 👏

大家有感兴趣的项目以及想要实现的语言,可以评论区留言哦,我们会尽量安排上的,语言选择:go,java,rust,python,js

  • 31
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个使用原生JavaScript实现的高级难度贪吃蛇游戏: HTML代码: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>贪吃蛇游戏</title> <style> #canvas { border: 1px solid black; } </style> </head> <body> <canvas id="canvas" width="800" height="600"></canvas> <script src="snake.js"></script> </body> </html> ``` JavaScript代码: ``` var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); // 定义蛇的初始位置和大小 var snakeSize = 20; var snakeX = 0; var snakeY = 0; var snakeBody = [ {x: snakeX, y: snakeY}, {x: snakeX + snakeSize, y: snakeY}, {x: snakeX + snakeSize * 2, y: snakeY}, {x: snakeX + snakeSize * 3, y: snakeY}, {x: snakeX + snakeSize * 4, y: snakeY} ]; // 定义食物的初始位置和大小 var foodSize = 20; var foodX = Math.floor(Math.random() * (canvas.width - foodSize)); var foodY = Math.floor(Math.random() * (canvas.height - foodSize)); // 定义蛇的移动速度和方向 var speed = 100; var direction = "right"; // 定义游戏是否结束和分数 var gameOver = false; var score = 0; // 监听键盘事件 document.addEventListener("keydown", function(event) { if (event.keyCode == 37 && direction != "right") { // left arrow direction = "left"; } else if (event.keyCode == 38 && direction != "down") { // up arrow direction = "up"; } else if (event.keyCode == 39 && direction != "left") { // right arrow direction = "right"; } else if (event.keyCode == 40 && direction != "up") { // down arrow direction = "down"; } }); // 游戏循环 function gameLoop() { // 清空画布 ctx.clearRect(0, 0, canvas.width, canvas.height); // 绘制食物 ctx.fillStyle = "red"; ctx.fillRect(foodX, foodY, foodSize, foodSize); // 绘制蛇 for (var i = 0; i < snakeBody.length; i++) { ctx.fillStyle = "green"; ctx.fillRect(snakeBody[i].x, snakeBody[i].y, snakeSize, snakeSize); } // 移动蛇 var headX = snakeBody[snakeBody.length - 1].x; var headY = snakeBody[snakeBody.length - 1].y; if (direction == "left") { headX -= snakeSize; } else if (direction == "up") { headY -= snakeSize; } else if (direction == "right") { headX += snakeSize; } else if (direction == "down") { headY += snakeSize; } // 检查蛇是否碰到边界 if (headX >= canvas.width || headX < 0 || headY >= canvas.height || headY < 0) { gameOver = true; } // 检查蛇是否碰到自己的身体 for (var i = 0; i < snakeBody.length - 1; i++) { if (headX == snakeBody[i].x && headY == snakeBody[i].y) { gameOver = true; } } // 检查蛇是否吃到了食物 if (headX == foodX && headY == foodY) { score++; foodX = Math.floor(Math.random() * (canvas.width - foodSize)); foodY = Math.floor(Math.random() * (canvas.height - foodSize)); } else { snakeBody.shift(); } // 更新蛇的身体 snakeBody.push({x: headX, y: headY}); // 更新游戏分数 document.getElementById("score").innerHTML = "分数:" + score; // 如果游戏结束,停止循环 if (gameOver) { clearInterval(interval); alert("游戏结束,你的得分是:" + score); } } // 启动游戏循环 var interval = setInterval(gameLoop, speed); ``` 这个游戏具有以下特点: 1. 使用Canvas绘制游戏画面 2. 蛇和食物都可以在任意位置生成 3. 可以通过键盘控制蛇的移动方向 4. 蛇碰到边界或自己的身体会导致游戏结束 5. 每吃到一个食物得分加一,并且生成新的食物 6. 游戏结束后会显示得分并停止循环

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值