记录一次GPT贪吃蛇小游戏

415 阅读3分钟

WX20230330-184759.png

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写一个贪吃蛇游戏,需要有开始,结束按钮,吃到数量的展示,需要有重新开始游戏的按钮”