📜  如何在 html css js 中创建蛇游戏 - Javascript (1)

📅  最后修改于: 2023-12-03 14:52:18.681000             🧑  作者: Mango

如何在 HTML/CSS/JS 中创建蛇游戏 - JavaScript

介绍

蛇游戏是一种经典的小游戏,它可以帮助程序员熟悉 HTML/CSS/JS 的使用。本文将介绍如何使用 JavaScript 在 HTML/CSS 中创建蛇游戏。

准备工作

在开始之前,需要先准备好以下工具:

  • 一个文本编辑器,例如 VSCode。
  • 一个现代浏览器,例如 Google Chrome。
创建 HTML 文件

首先,我们需要创建一个 HTML 文件,并在其中添加游戏所需的元素。以下是一个简单的 HTML 文件示例:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Snake Game</title>
  <style>
    /* 这里添加 CSS 样式 */
  </style>
</head>
<body>
  <canvas id="gameCanvas"></canvas>
  <script src="snake.js"></script>
</body>
</html>

可以看到,这个 HTML 文件中有一个 <canvas> 元素,该元素将被用来绘制游戏的画面。同时,我们还添加了一个 <script> 元素,用来加载 JavaScript 文件。

编写 JavaScript

在 HTML 文件中加载的 JavaScript 文件将负责控制游戏的逻辑。以下是一个简单的 JavaScript 文件示例,用于创建蛇游戏:

const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');

const snakeSize = 10;
let score = 0;

// 初始化蛇的位置
let snake = [
  { x: canvas.width/2, y: canvas.height/2 },
  { x: canvas.width/2 - snakeSize, y: canvas.height/2 },
  { x: canvas.width/2 - snakeSize*2, y: canvas.height/2 },
];

// 蛇的方向
let direction = 'right';

// 生成食物的位置
let food = {
  x: Math.floor(Math.random() * canvas.width / snakeSize) * snakeSize,
  y: Math.floor(Math.random() * canvas.height / snakeSize) * snakeSize
};

// 绘制蛇
function drawSnake() {
  for (let i=0; i<snake.length; i++) {
    ctx.fillStyle = 'white';
    ctx.fillRect(snake[i].x, snake[i].y, snakeSize, snakeSize);
  }
}

// 移动蛇的位置
function moveSnake() {
  // 记录蛇头的位置
  let snakeX = snake[0].x;
  let snakeY = snake[0].y;

  // 根据蛇的方向移动蛇头的位置
  if (direction === 'right') snakeX += snakeSize;
  else if (direction === 'left') snakeX -= snakeSize;
  else if (direction === 'up') snakeY -= snakeSize;
  else if (direction === 'down') snakeY += snakeSize;

  // 判断蛇是否吃到了食物
  if (snakeX === food.x && snakeY === food.y) {
    score++;
    food = {
      x: Math.floor(Math.random() * canvas.width / snakeSize) * snakeSize,
      y: Math.floor(Math.random() * canvas.height / snakeSize) * snakeSize
    };
  } else {
    snake.pop();
  }

  // 在蛇头的位置添加新的蛇身体
  let newHead = {
    x: snakeX,
    y: snakeY
  };
  snake.unshift(newHead);
}

// 检查游戏是否结束
function checkGameEnd() {
  for (let i=1; i<snake.length; i++) {
    // 如果蛇头碰到了身体,则游戏结束
    if (snake[0].x === snake[i].x && snake[0].y === snake[i].y) {
      return true;
    }
  }

  // 如果蛇头碰到了边缘,则游戏结束
  return (
    snake[0].x < 0 || snake[0].x > canvas.width - snakeSize ||
    snake[0].y < 0 || snake[0].y > canvas.height - snakeSize
  );
}

// 绘制分数
function drawScore() {
  ctx.fillStyle = 'white';
  ctx.font = '15px Arial';
  ctx.fillText('Score: ' + score, 10, 20);
}

// 绘制食物
function drawFood() {
  ctx.fillStyle = 'red';
  ctx.fillRect(food.x, food.y, snakeSize, snakeSize);
}

// 渲染游戏
function render() {
  if (checkGameEnd()) {
    clearInterval(gameInterval);
    alert('Game Over!');
  } else {
    // 清除画布
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    moveSnake();
    drawSnake();
    drawFood();
    drawScore();
  }
}

// 监听键盘事件,改变蛇的方向
document.addEventListener('keydown', function(event) {
  if (event.code === 'ArrowRight' && direction !== 'left') {
    direction = 'right';
  } else if (event.code === 'ArrowLeft' && direction !== 'right') {
    direction = 'left';
  } else if (event.code === 'ArrowUp' && direction !== 'down') {
    direction = 'up';
  } else if (event.code === 'ArrowDown' && direction !== 'up') {
    direction = 'down';
  }
});

// 每隔一段时间渲染游戏
let gameInterval = setInterval(render, 100);

以上 JavaScript 代码实现了蛇游戏的基本逻辑:控制蛇的移动、绘制蛇和食物、检查游戏是否结束等。你可以将这段代码复制到名为 snake.js 的文件中,并放在与 HTML 文件相同的文件夹中。

添加样式

最后,还需要添加 CSS 样式来美化游戏界面。以下是一个简单的 CSS 文件示例:

body {
  background-color: black;
}

canvas {
  border: 1px solid white;
}

.alert {
  display: none;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background-color: rgba(255, 255, 255, 0.8);
  padding: 20px;
  border-radius: 10px;
  font-size: 30px;
  font-weight: bold;
  color: red;
  text-align: center;
}

.alert.show {
  display: block;
}

这个 CSS 文件中定义了游戏界面的背景颜色、画布边框等样式,以及游戏结束提示框的样式。你可以在 HTML 文件的 <style> 元素中添加这些 CSS 定义。

运行游戏

现在,你已经将 HTML、CSS、JS 文件都创建好了。接下来,在浏览器中打开 HTML 文件,你就可以开始运行蛇游戏了!

代码片段:

const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');

const snakeSize = 10;
let score = 0;

// 初始化蛇的位置
let snake = [
  { x: canvas.width/2, y: canvas.height/2 },
  { x: canvas.width/2 - snakeSize, y: canvas.height/2 },
  { x: canvas.width/2 - snakeSize*2, y: canvas.height/2 },
];

// 蛇的方向
let direction = 'right';

// 生成食物的位置
let food = {
  x: Math.floor(Math.random() * canvas.width / snakeSize) * snakeSize,
  y: Math.floor(Math.random() * canvas.height / snakeSize) * snakeSize
};

// 绘制蛇
function drawSnake() {
  for (let i=0; i<snake.length; i++) {
    ctx.fillStyle = 'white';
    ctx.fillRect(snake[i].x, snake[i].y, snakeSize, snakeSize);
  }
}

// 移动蛇的位置
function moveSnake() {
  // 记录蛇头的位置
  let snakeX = snake[0].x;
  let snakeY = snake[0].y;

  // 根据蛇的方向移动蛇头的位置
  if (direction === 'right') snakeX += snakeSize;
  else if (direction === 'left') snakeX -= snakeSize;
  else if (direction === 'up') snakeY -= snakeSize;
  else if (direction === 'down') snakeY += snakeSize;

  // 判断蛇是否吃到了食物
  if (snakeX === food.x && snakeY === food.y) {
    score++;
    food = {
      x: Math.floor(Math.random() * canvas.width / snakeSize) * snakeSize,
      y: Math.floor(Math.random() * canvas.height / snakeSize) * snakeSize
    };
  } else {
    snake.pop();
  }

  // 在蛇头的位置添加新的蛇身体
  let newHead = {
    x: snakeX,
    y: snakeY
  };
  snake.unshift(newHead);
}

// 检查游戏是否结束
function checkGameEnd() {
  for (let i=1; i<snake.length; i++) {
    // 如果蛇头碰到了身体,则游戏结束
    if (snake[0].x === snake[i].x && snake[0].y === snake[i].y) {
      return true;
    }
  }

  // 如果蛇头碰到了边缘,则游戏结束
  return (
    snake[0].x < 0 || snake[0].x > canvas.width - snakeSize ||
    snake[0].y < 0 || snake[0].y > canvas.height - snakeSize
  );
}

// 绘制分数
function drawScore() {
  ctx.fillStyle = 'white';
  ctx.font = '15px Arial';
  ctx.fillText('Score: ' + score, 10, 20);
}

// 绘制食物
function drawFood() {
  ctx.fillStyle = 'red';
  ctx.fillRect(food.x, food.y, snakeSize, snakeSize);
}

// 渲染游戏
function render() {
  if (checkGameEnd()) {
    clearInterval(gameInterval);
    alert('Game Over!');
  } else {
    // 清除画布
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    moveSnake();
    drawSnake();
    drawFood();
    drawScore();
  }
}

// 监听键盘事件,改变蛇的方向
document.addEventListener('keydown', function(event) {
  if (event.code === 'ArrowRight' && direction !== 'left') {
    direction = 'right';
  } else if (event.code === 'ArrowLeft' && direction !== 'right') {
    direction = 'left';
  } else if (event.code === 'ArrowUp' && direction !== 'down') {
    direction = 'up';
  } else if (event.code === 'ArrowDown' && direction !== 'up') {
    direction = 'down';
  }
});

// 每隔一段时间渲染游戏
let gameInterval = setInterval(render, 100);