一
我们可以使用HTML、CSS和JavaScript来编写一个网页版的贪吃蛇游戏。下面是一个基本的项目结构层级以及相应的代码文件:
项目文件结构:
- index.html
- css/
- style.css
- js/
- snake.js
各个文件的示例代码如下:
- index.html:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<canvas id="game-board" width="600" height="600"></canvas>
<script src="js/snake.js"></script>
</body>
</html>
- style.css:
body {
background-color: #000;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
overflow: hidden;
}
#game-board {
background-color: #fff;
}
- snake.js:
这是一个简化版的贪吃蛇游戏逻辑,为了简化,我们没有包括碰撞检测或者游戏结束条件:
let canvas = document.getElementById('game-board');
let context = canvas.getContext('2d');
let box = 20;
let snake = [];
snake[0] = {
x: 10 * box,
y: 10 * box
}
let direction = "right";
function createBackground() {
context.fillStyle = "lightgreen";
context.fillRect(0, 0, 30*box, 30*box);
}
function createSnake() {
for(i = 0; i < snake.length; i++) {
context.fillStyle = "green";
context.fillRect(snake[i].x, snake[i].y, box, box);
}
}
function updateSnake() {
let snakeX = snake[0].x;
let snakeY = snake[0].y;
if(direction == "right") snakeX += box;
if(direction == "left") snakeX -= box;
if(direction == "up") snakeY -= box;
if(direction == "down") snakeY += box;
snake.pop();
let newHead = {
x: snakeX,
y: snakeY
}
snake.unshift(newHead);
}
function drawGame() {
createBackground();
createSnake();
updateSnake();
}
let game = setInterval(drawGame, 100);
这个游戏的工作原理是通过JavaScript来控制一个canvas元素,用来绘制贪吃蛇和游戏背景。游戏的主循环是drawGame
函数,它每100毫秒执行一次,用来更新屏幕上的贪吃蛇的位置。根据方向,蛇的头部位置将更新,尾部的位置将被移除,头部的新位置将被加入到蛇的数组。
请注意,这只是一个基本的贪吃蛇游戏,你可能还需要添加更多的功能,例如检测碰撞、添加食物、增加游戏结束的条件等等。
二
对,这个简单的贪吃蛇游戏示例没有包含方向控制的代码。为了能够使用键盘控制蛇的方向,我们需要添加一个键盘事件监听器来改变direction
变量的值。
在 snake.js
文件的代码中,你可以添加如下的代码:
document.addEventListener('keydown', updateDirection);
function updateDirection(event) {
if(event.keyCode == 37 && direction != "right") direction = "left";
if(event.keyCode == 38 && direction != "down") direction = "up";
if(event.keyCode == 39 && direction != "left") direction = "right";
if(event.keyCode == 40 && direction != "up") direction = "down";
}
这段代码监听键盘的按键事件,当按下左(37)、上(38)、右(39)或下(40)箭头键时,它会更新 direction
变量的值。我们还要检查当前的方向,以防止蛇直接反向运动。例如,如果蛇正在向右移动,我们不希望用户能直接让蛇向左移动,因为这将导致蛇立即碰到自己的身体。
添加了这段代码之后,你应该能够使用箭头键来控制贪吃蛇的方向了。
三
确实,我们还没有在游戏中添加食物。让我们来添加一些食物,这样蛇就有东西可以吃了。
在 snake.js
文件的代码中,我们可以添加一个食物的对象,并且在游戏的主循环中绘制食物。同时,我们还需要在 updateSnake
函数中检查蛇是否吃到了食物。如果吃到了,就增加蛇的长度,并在随机位置生成新的食物。
以下是更新后的 snake.js
文件:
let canvas = document.getElementById('game-board');
let context = canvas.getContext('2d');
let box = 20;
let snake = [];
snake[0] = {
x: 10 * box,
y: 10 * box
}
let food = {
x: Math.floor(Math.random() * 30) * box,
y: Math.floor(Math.random() * 30) * box
}
let direction = "right";
function createBackground() {
context.fillStyle = "lightgreen";
context.fillRect(0, 0, 30*box, 30*box);
}
function createSnake() {
for(i = 0; i < snake.length; i++) {
context.fillStyle = "green";
context.fillRect(snake[i].x, snake[i].y, box, box);
}
}
function drawFood() {
context.fillStyle = "red";
context.fillRect(food.x, food.y, box, box);
}
document.addEventListener('keydown', updateDirection);
function updateDirection(event) {
if(event.keyCode == 37 && direction != "right") direction = "left";
if(event.keyCode == 38 && direction != "down") direction = "up";
if(event.keyCode == 39 && direction != "left") direction = "right";
if(event.keyCode == 40 && direction != "up") direction = "down";
}
function updateSnake() {
let snakeX = snake[0].x;
let snakeY = snake[0].y;
if(direction == "right") snakeX += box;
if(direction == "left") snakeX -= box;
if(direction == "up") snakeY -= box;
if(direction == "down") snakeY += box;
if(snakeX != food.x || snakeY != food.y) {
snake.pop();
} else {
food.x = Math.floor(Math.random() * 30) * box;
food.y = Math.floor(Math.random() * 30) * box;
}
let newHead = {
x: snakeX,
y: snakeY
}
snake.unshift(newHead);
}
function drawGame() {
createBackground();
createSnake();
drawFood();
updateSnake();
}
let game = setInterval(drawGame, 100);
现在,每次蛇吃到食物时,食物就会在画布的随机位置重新出现,同时蛇的长度也会增加。