在浏览器中打造属于你的贪吃蛇游戏:HTML+CSS+JS实现
2023-10-17 08:52:39
贪吃蛇游戏简介
贪吃蛇是一款经典的街机游戏,玩家控制一条贪吃蛇在游戏世界中吃食物,同时避免撞到墙或自身。每当贪吃蛇吃到一个食物,它就会变长一点。随着游戏进行,游戏速度会逐渐加快,难度也会增加。贪吃蛇是一款非常容易上手但很难精通的游戏,它考验玩家的反应速度和手眼协调能力。
创建游戏画布
首先,我们需要创建一个游戏画布。游戏画布是一个HTML元素,它将用作游戏的显示区域。我们可以使用<canvas>
元素来创建游戏画布。<canvas>
元素是一个非常强大的HTML元素,它允许我们使用JavaScript来绘制图形。
<canvas id="game-canvas" width="400" height="400"></canvas>
在上面的代码中,我们创建了一个<canvas>
元素,并为其设置了宽和高。<canvas>
元素的ID是“game-canvas”,我们将在JavaScript中使用这个ID来获取画布元素。
绘制贪吃蛇
接下来,我们需要绘制贪吃蛇。贪吃蛇的身体由多个方块组成,每个方块都是一个10像素乘10像素的正方形。我们可以使用JavaScript中的fillRect()
方法来绘制这些方块。
function drawSnake() {
for (var i = 0; i < snake.length; i++) {
context.fillStyle = "green";
context.fillRect(snake[i].x, snake[i].y, 10, 10);
}
}
在上面的代码中,我们首先定义了一个drawSnake()
函数。这个函数将负责绘制贪吃蛇。在函数中,我们使用一个for
循环来遍历贪吃蛇的身体。对于身体的每个方块,我们使用context.fillStyle
属性来设置方块的颜色,然后使用context.fillRect()
方法来绘制方块。
生成食物
接下来,我们需要生成食物。食物是一个10像素乘10像素的正方形,它可以出现在游戏画布的任何位置。我们可以使用JavaScript中的Math.random()
函数来随机生成食物的位置。
function generateFood() {
food = {
x: Math.floor(Math.random() * 40) * 10,
y: Math.floor(Math.random() * 40) * 10
};
}
在上面的代码中,我们首先定义了一个generateFood()
函数。这个函数将负责生成食物。在函数中,我们使用Math.random()
函数来随机生成食物的x坐标和y坐标。我们使用Math.floor()
函数来确保食物的坐标是整数。
处理用户输入
接下来,我们需要处理用户输入。贪吃蛇可以使用方向键来控制。我们可以使用JavaScript中的addEventListener()
方法来监听方向键的按下事件。
document.addEventListener("keydown", function(event) {
if (event.keyCode === 37) {
snakeDirection = "left";
} else if (event.keyCode === 38) {
snakeDirection = "up";
} else if (event.keyCode === 39) {
snakeDirection = "right";
} else if (event.keyCode === 40) {
snakeDirection = "down";
}
});
在上面的代码中,我们使用document.addEventListener()
方法来监听方向键的按下事件。当方向键被按下时,我们使用event.keyCode
属性来获取方向键的键码。然后,我们根据键码来设置贪吃蛇的方向。
检测游戏结束条件
接下来,我们需要检测游戏结束条件。贪吃蛇有两种情况会游戏结束:撞到墙或撞到自身。我们可以使用JavaScript中的if
语句来检测这两种情况。
function checkGameOver() {
if (snake[0].x < 0 || snake[0].x > 390 || snake[0].y < 0 || snake[0].y > 390) {
gameover = true;
}
for (var i = 4; i < snake.length; i++) {
if (snake[0].x === snake[i].x && snake[0].y === snake[i].y) {
gameover = true;
}
}
}
在上面的代码中,我们首先定义了一个checkGameOver()
函数。这个函数将负责检测游戏结束条件。在函数中,我们使用if
语句来检测贪吃蛇是否撞到了墙。如果贪吃蛇撞到了墙,我们把gameover
变量设置为true
。然后,我们使用一个for
循环来遍历贪吃蛇的身体。对于身体的每个方块,我们检查它是否与贪吃蛇的头部的坐标相同。如果相同,我们把gameover
变量设置为true
。
完整游戏源码
现在,我们已经完成了贪吃蛇游戏的全部代码。你可以将以下代码复制到一个HTML文件中,然后在浏览器中运行它。
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<canvas id="game-canvas" width="400" height="400"></canvas>
<script>
var canvas = document.getElementById("game-canvas");
var context = canvas.getContext("2d");
var snake = [
{x: 200, y: 200},
{x: 190, y: 200},
{x: 180, y: 200},
{x: 170, y: 200},
{x: 160, y: 200}
];
var food = {x: 100, y: 100};
var snakeDirection = "right";
var gameover = false;
function drawSnake() {
for (var i = 0; i < snake.length; i++) {
context.fillStyle = "green";
context.fillRect(snake[i].x, snake[i].y, 10, 10);
}
}
function generateFood() {
food = {
x: Math.floor(Math.random() * 40) * 10,
y: Math.floor(Math.random() * 40) * 10
};
}
function moveSnake() {
var head = {
x: snake[0].x + 10 * (snakeDirection === "right" ? 1 : snakeDirection === "left" ? -1 : 0),
y: snake[0].y + 10 * (snakeDirection === "down" ? 1 : snakeDirection === "up" ? -1 : 0)
};
snake.unshift(head);
if (head.x === food.x && head.y === food.y) {
generateFood();
} else {
snake.pop();
}
}
function drawFood() {
context.fillStyle = "red";
context.fillRect(food.x, food.y, 10, 10);
}
function checkGameOver() {
if (snake[0].x < 0 || snake[0].x > 390 || snake[0].y < 0 || snake[0].y > 390) {
gameover = true;
}
for (var i = 4; i < snake.length; i++) {
if (snake[0].x === snake[i].x && snake[0].y === snake[i].y) {
gameover = true;
}
}
}
function draw() {
context.clearRect(0, 0, 400, 400);
drawSnake();
drawFood();
if (!gameover) {
moveSnake();
checkGameOver();
setTimeout(draw, 100);
}
}
draw();
document.addEventListener("keydown", function(event) {
if (event.keyCode