1. 创建 HTML 文件
我们首先需要创建一个 HTML 文件,用于承载游戏界面和 JavaScript 代码。在该文件中,我们需要包含以下内容:
- 一个带有
id="canvas"属性的<canvas>元素,用于绘制游戏界面。 - 一个用于展示吃到食物数量的元素,比如一个带有
id="score"属性的<span>元素。 - 包含开始、结束、重新开始等按钮的元素。
- 一个用于加载 JavaScript 代码的
<script>元素,可以将其放在文件末尾。
下面是一个基本的 HTML 模板:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>贪吃蛇游戏</title>
<style>
#canvas {
border: 1px solid black;
}
</style>
</head>
<body>
<h1>贪吃蛇游戏</h1>
<p>吃到的数量:<span id="score">0</span></p>
<canvas id="canvas" width="300" height="300"></canvas>
<br>
<button id="startBtn">开始</button>
<button id="restartBtn">重新开始</button>
<button id="endBtn">结束</button>
<script src="snake.js"></script>
</body>
</html>
2. 编写 CSS 样式
接下来,我们需要编写一些 CSS 样式,用于美化游戏界面。这部分内容可以根据个人喜好进行定制,比如设置画布边框、蛇身颜色、食物颜色等。下面是一个简单的样式示例:
#canvas {
border: 1px solid black;
}
/* 蛇的颜色 */
.green {
background-color: green;
}
/* 食物的颜色 */
.red {
background-color: red;
}
3. 编写 JavaScript 代码
最重要的是编写 JavaScript 代码来实现贪吃蛇游戏。我们需要完成以下任务:
- 定义游戏中的一些变量和常量,比如画布的大小、蛇的初始状态、食物的初始位置等。
- 编写
render函数用于绘制游戏界面。 - 编写
update函数用于更新游戏状态。 - 处理键盘事件,改变蛇的方向。
- 编写开始、结束、重新开始等按钮的事件处理函数。
下面是一个简单的 JavaScript 示例:
document.addEventListener("DOMContentLoaded", () => {
// 获取元素
const canvas = document.getElementById("canvas");
const startBtn = document.getElementById("startBtn");
const restartBtn = document.getElementById("restartBtn");
const endBtn = document.getElementById("endBtn");
const scoreEl = document.getElementById("score");
const ctx = canvas.getContext("2d");
// 初始化游戏状态
let intervalId = null; // 游戏循环定时器ID
let isPlaying = false; // 是否正在游戏中
let score = 0; // 得分
const snake = [
// 蛇的初始状态,包括三个格子
{ x: 10, y: 10 },
{ x: 9, y: 10 },
{ x: 8, y: 10 },
];
let direction = "right"; // 蛇的初始方向
let food = getRandomFoodPosition(); // 食物的初始位置
// 绘制游戏界面
function render() {
// 清空画布
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 绘制蛇
ctx.fillStyle = "green";
snake.forEach((segment) => {
ctx.fillRect(segment.x * 10, segment.y * 10, 10, 10);
});
// 绘制食物
ctx.fillStyle = "red";
ctx.fillRect(food.x * 10, food.y * 10, 10, 10);
// 更新得分展示
scoreEl.textContent = score;
}
// 更新蛇的状态
function update() {
// 根据当前方向移动蛇头
const head = { x: snake[0].x, y: snake[0].y };
switch (direction) {
case "up":
head.y -= 1;
break;
case "down":
head.y += 1;
break;
case "left":
head.x -= 1;
break;
case "right":
head.x += 1;
break;
}
snake.unshift(head);
// 如果蛇吃到了食物,增加得分并生成新的食物
if (head.x === food.x && head.y === food.y) {
score += 1;
food = getRandomFoodPosition();
} else {
snake.pop();
}
// 如果蛇撞墙或自己的身体,游戏结束
if (
head.x < 0 ||
head.x >= canvas.width / 10 ||
head.y < 0 ||
head.y >= canvas.height / 10 ||
snake
.slice(1)
.some((segment) => segment.x === head.x && segment.y === head.y)
) {
endGame();
}
}
// 随机生成食物的位置
function getRandomFoodPosition() {
return {
x: Math.floor(Math.random() * (canvas.width / 10)),
y: Math.floor(Math.random() * (canvas.height / 10)),
};
}
// 开始游戏
function startGame() {
// 初始化游戏状态
isPlaying = true;
score = 0;
direction = "right";
snake.length = 3;
snake[0] = { x: 10, y: 10 };
snake[1] = { x: 9, y: 10 };
snake[2] = { x: 8, y: 10 };
food = getRandomFoodPosition();
// 开始游戏循环
intervalId = setInterval(() => {
update();
render();
}, 100);
}
// 结束游戏
function endGame() {
// 停止游戏循环
clearInterval(intervalId);
// 弹出提示框
alert("游戏结束");
// 更新游戏状态
isPlaying = false;
}
// 处理键盘按键事件,改变蛇的方向
document.addEventListener("keydown", (event) => {
if (!isPlaying) return;
switch (event.key) {
case "ArrowUp":
if (direction !== "down") direction = "up";
break;
case "ArrowDown":
if (direction !== "up") direction = "down";
break;
case "ArrowLeft":
if (direction !== "right") direction = "left";
break;
case "ArrowRight":
if (direction !== "left") direction = "right";
break;
}
});
// 绑定按钮点击事件
startBtn.addEventListener("click", () => {
if (isPlaying) return; // 如果正在游戏中,不做任何操作
// 开始游戏循环
intervalId = setInterval(() => {
update();
render();
}, 100);
// 更新游戏状态
isPlaying = true;
});
restartBtn.addEventListener("click", () => {
if (isPlaying) return; // 如果正在游戏中,不做任何操作
// 初始化游戏状态
snake.length = 3;
snake[0] = { x: 10, y: 10 };
snake[1] = { x: 9, y: 10 };
snake[2] = { x: 8, y: 10 };
direction = "right";
food = getRandomFoodPosition();
score = 0;
// 更新游戏界面
render();
});
endBtn.addEventListener("click", () => {
if (!isPlaying) return; // 如果没有在游戏中,不做任何操作
// 结束游戏
endGame();
});
// 初始化��戏界面
render();
});
tips:“用js写一个贪吃蛇游戏,需要有开始,结束按钮,吃到数量的展示,需要有重新开始游戏的按钮”