返回

基于原生js打造贪吃蛇游戏:品味经典,重温乐趣

前端

在现代浏览器中重现贪吃蛇:使用原生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);

二、运行游戏

  1. 将 index.html 和 script.js 文件保存到你的电脑上。
  2. 使用浏览器打开 index.html 文件。
  3. 按下键盘上的任意方向键开始游戏。

三、深入探索

贪吃蛇是一个简单的游戏,但它可以用原生 JavaScript 轻松创建。通过理解游戏的基本机制,你可以根据自己的喜好对其进行修改和定制。

四、常见问题解答

  1. 我可以修改贪吃蛇的长度吗?

    • 当然可以!在 snake 数组中添加或删除元素以增加或减少贪吃蛇的长度。
  2. 我可以更改贪吃蛇的颜色吗?

    • 绝对可以!修改 fillStyle 属性以设置贪吃蛇的任何你喜欢的颜色。
  3. 我可以设置更高的游戏难度吗?

    • 可以!尝试增加贪吃蛇移动的速度或减少食物出现的频率。
  4. 我可以添加障碍物吗?

    • 当然可以!创建静态或动态障碍物,让游戏更具挑战性。
  5. 我可以使用 CSS 样式自定义游戏吗?

    • 完全可以!通过应用 CSS 类或内联样式,为画布和游戏元素添加视觉效果。