返回
基于原生js打造贪吃蛇游戏:品味经典,重温乐趣
前端
2022-11-03 03:42:38
在现代浏览器中重现贪吃蛇:使用原生JavaScript重温经典
一、构建项目
我们从头开始,一步步构建贪吃蛇游戏。
首先,创建一个 HTML 文件(index.html)并添加以下代码:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<canvas id="canvas" width="500" height="500"></canvas>
<script src="script.js"></script>
</body>
</html>
接下来,创建一个 JavaScript 文件(script.js)并添加以下代码:
// 获取画布元素
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
// 设置画布尺寸
canvas.width = 500;
canvas.height = 500;
// 定义贪吃蛇的初始位置
const snake = [
{ x: 200, y: 200 },
{ x: 190, y: 200 },
{ x: 180, y: 200 },
{ x: 170, y: 200 },
{ x: 160, y: 200 },
];
// 定义食物的初始位置
let food = {
x: Math.floor(Math.random() * 490),
y: Math.floor(Math.random() * 490),
};
// 定义游戏状态
let gameStatus = "playing";
// 添加键盘事件监听器
document.addEventListener("keydown", (e) => {
switch (e.keyCode) {
case 37: // 左
snakeDirection = "left";
break;
case 38: // 上
snakeDirection = "up";
break;
case 39: // 右
snakeDirection = "right";
break;
case 40: // 下
snakeDirection = "down";
break;
}
});
// 定义游戏循环函数
function gameLoop() {
// 清除画布
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 绘制食物
ctx.fillStyle = "red";
ctx.fillRect(food.x, food.y, 10, 10);
// 绘制贪吃蛇
ctx.fillStyle = "green";
for (let i = 0; i < snake.length; i++) {
ctx.fillRect(snake[i].x, snake[i].y, 10, 10);
}
// 更新贪吃蛇的位置
for (let i = snake.length - 1; i > 0; i--) {
snake[i].x = snake[i - 1].x;
snake[i].y = snake[i - 1].y;
}
// 根据键盘事件监听器中的snakeDirection值更新贪吃蛇头的位置
switch (snakeDirection) {
case "left":
snake[0].x -= 10;
break;
case "up":
snake[0].y -= 10;
break;
case "right":
snake[0].x += 10;
break;
case "down":
snake[0].y += 10;
break;
}
// 判断贪吃蛇是否吃到食物
if (snake[0].x === food.x && snake[0].y === food.y) {
// 贪吃蛇吃到食物,食物的位置随机改变,贪吃蛇的长度增加
food.x = Math.floor(Math.random() * 490);
food.y = Math.floor(Math.random() * 490);
snake.push({ x: snake[snake.length - 1].x, y: snake[snake.length - 1].y });
}
// 判断贪吃蛇是否撞到自己或撞到墙上
if (
snake[0].x < 0 ||
snake[0].x > canvas.width - 10 ||
snake[0].y < 0 ||
snake[0].y > canvas.height - 10 ||
snake.some((segment, i) => i !== 0 && segment.x === snake[0].x && segment.y === snake[0].y)
) {
// 贪吃蛇撞到自己或撞到墙上,游戏结束
gameStatus = "over";
}
// 判断游戏状态,如果是"over"则结束游戏,否则继续游戏循环
if (gameStatus === "over") {
alert("游戏结束!");
return;
}
// 继续游戏循环
requestAnimationFrame(gameLoop);
}
// 启动游戏循环
requestAnimationFrame(gameLoop);
二、运行游戏
- 将 index.html 和 script.js 文件保存到你的电脑上。
- 使用浏览器打开 index.html 文件。
- 按下键盘上的任意方向键开始游戏。
三、深入探索
贪吃蛇是一个简单的游戏,但它可以用原生 JavaScript 轻松创建。通过理解游戏的基本机制,你可以根据自己的喜好对其进行修改和定制。
四、常见问题解答
-
我可以修改贪吃蛇的长度吗?
- 当然可以!在
snake
数组中添加或删除元素以增加或减少贪吃蛇的长度。
- 当然可以!在
-
我可以更改贪吃蛇的颜色吗?
- 绝对可以!修改
fillStyle
属性以设置贪吃蛇的任何你喜欢的颜色。
- 绝对可以!修改
-
我可以设置更高的游戏难度吗?
- 可以!尝试增加贪吃蛇移动的速度或减少食物出现的频率。
-
我可以添加障碍物吗?
- 当然可以!创建静态或动态障碍物,让游戏更具挑战性。
-
我可以使用 CSS 样式自定义游戏吗?
- 完全可以!通过应用 CSS 类或内联样式,为画布和游戏元素添加视觉效果。