科学教育

搜索
查看: 8409|回复: 28
打印 上一主题 下一主题

贪吃蛇

[复制链接]

3

主题

41

帖子

137

积分

注册会员

Rank: 2

积分
137
跳转到指定楼层
楼主
发表于 2024-8-2 14:58:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
生成一段完整的贪吃蛇游戏
回复

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
沙发
发表于 2024-8-2 14:59:15 | 只看该作者
嘿,小朋友!咱们今天来做一个有趣的小游戏吧——贪吃蛇!这可是一个经典的游戏哦!我们会用到HTML、CSS和JavaScript来完成这个小项目。准备好了吗?让我们开始吧!

### 第一步:设置HTML结构
首先,我们需要一个简单的HTML文件来放置我们的游戏画布(canvas)。它就像是我们的“游戏舞台”。

创建一个新的HTML文件,命名为 `index.html`,并添加以下内容:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>贪吃蛇游戏</title>
  7.     <style>
  8.         canvas {
  9.             border: 1px solid black;
  10.             background-color: #f5f5f5;
  11.         }
  12.     </style>
  13. </head>
  14. <body>
  15.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  16.     <script src="script.js"></script>
  17. </body>
  18. </html>
复制代码


### 第二步:设置CSS样式
在上面的HTML文件中,我们已经加了简单的CSS样式,用来显示一个边框,并设置画布的背景颜色。

### 第三步:编写JavaScript
现在,我们要来写最重要的JavaScript部分。在HTML文件的最后一行,我们使用`<script>`标签引入了一个叫做 `script.js` 的文件。接下来,我们需要创建这个文件,并使用它来实现贪吃蛇游戏的逻辑。

新建一个文件,命名为 `script.js`,然后添加以下代码:

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

  3. let snake = [
  4.     { x: 150, y: 150 },
  5.     { x: 140, y: 150 },
  6.     { x: 130, y: 150 },
  7.     { x: 120, y: 150 },
  8.     { x: 110, y: 150 }
  9. ];

  10. let dx = 10;
  11. let dy = 0;

  12. function clearCanvas() {
  13.     ctx.fillStyle = "white";
  14.     ctx.strokeStyle = "black";
  15.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  16.     ctx.strokeRect(0, 0, canvas.width, canvas.height);
  17. }

  18. function drawSnake() {
  19.     snake.forEach(drawSnakePart);
  20. }

  21. function drawSnakePart(snakePart) {
  22.     ctx.fillStyle = 'lightgreen';
  23.     ctx.strokeStyle = 'darkgreen';

  24.     ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  25.     ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  26. }

  27. function moveSnake() {
  28.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  29.     snake.unshift(head);
  30.     snake.pop();
  31. }

  32. function main() {
  33.     setTimeout(function onTick() {
  34.         clearCanvas();
  35.         moveSnake();
  36.         drawSnake();
  37.         
  38.         main();
  39.     }, 100);
  40. }

  41. document.addEventListener("keydown", changeDirection);

  42. function changeDirection(event) {
  43.     const LEFT_KEY = 37;
  44.     const RIGHT_KEY = 39;
  45.     const UP_KEY = 38;
  46.     const DOWN_KEY = 40;

  47.     const keyPressed = event.keyCode;
  48.     const goingUp = dy === -10;
  49.     const goingDown = dy === 10;
  50.     const goingRight = dx === 10;
  51.     const goingLeft = dx === -10;

  52.     if (keyPressed === LEFT_KEY && !goingRight) {
  53.         dx = -10;
  54.         dy = 0;
  55.     }

  56.     if (keyPressed === UP_KEY && !goingDown) {
  57.         dx = 0;
  58.         dy = -10;
  59.     }

  60.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  61.         dx = 10;
  62.         dy = 0;
  63.     }

  64.     if (keyPressed === DOWN_KEY && !goingUp) {
  65.         dx = 0;
  66.         dy = 10;
  67.     }
  68. }

  69. main();
复制代码


### 解释一下代码:
1. **初始化贪吃蛇**:我们设定了初始的蛇身体位置,宽度和高度都为10个像素。
2. **画布清理函数**:每次更新蛇的位置前,我们需要清理画布。
3. **绘制蛇**:定义了如何绘制蛇的每一节。
4. **移动蛇**:蛇的每一节都会往前挪动一格。
5. **主循环(main)**:每100毫秒,我们会清理画布、移动蛇、再重新绘制。
6. **方向控制**:通过监听键盘事件,实现上下左右的控制。

这么一来,你就可以在浏览器中打开 `index.html` 文件,尽情享受你的贪吃蛇游戏了!加油,希望你玩得开心!
回复 支持 反对

使用道具 举报

3

主题

41

帖子

137

积分

注册会员

Rank: 2

积分
137
板凳
 楼主| 发表于 2024-8-2 15:11:39 | 只看该作者
你好,我的游戏需要出现蛇的食物,蛇吃了食物之后变长,当蛇碰壁后显示“游戏结束”及得分,出现“开始游戏”的按钮。
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
地板
发表于 2024-8-2 15:12:02 | 只看该作者
张复礼 发表于 2024-08-02 15:11
你好,我的游戏需要出现蛇的食物,蛇吃了食物之后变长 ...


好的,小朋友!我们来为贪吃蛇游戏添加食物、增加得分和游戏结束的功能吧!这是一个非常有趣的部分。下面我们逐步修改 `script.js` 文件。

### 修改后的 JavaScript 代码

在之前的代码基础上添加以下内容:

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

  3. let snake = [{ x: 50, y: 50 }];
  4. let food = { x: 0, y: 0 };
  5. let dx = 10;
  6. let dy = 0;
  7. let score = 0;
  8. let gameOver = false;

  9. document.addEventListener("keydown", changeDirection);

  10. function randomFoodPosition() {
  11.     const x = Math.floor(Math.random() * (canvas.width / 10)) * 10;
  12.     const y = Math.floor(Math.random() * (canvas.height / 10)) * 10;
  13.     return { x, y };
  14. }

  15. function clearCanvas() {
  16.     ctx.fillStyle = "white";
  17.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  18. }

  19. function drawSnake() {
  20.     snake.forEach(drawSnakePart);
  21. }

  22. function drawSnakePart(snakePart) {
  23.     ctx.fillStyle = 'lightgreen';
  24.     ctx.strokeStyle = 'darkgreen';
  25.     ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  26.     ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  27. }

  28. function drawFood() {
  29.     ctx.fillStyle = 'red';
  30.     ctx.fillRect(food.x, food.y, 10, 10);
  31. }

  32. function moveSnake() {
  33.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };

  34.     // 检测碰壁
  35.     if (head.x < 0 || head.x >= canvas.width || head.y < 0 || head.y >= canvas.height || collision(head)) {
  36.         gameOver = true;
  37.         return;
  38.     }

  39.     snake.unshift(head);

  40.     // 检查是否吃到食物
  41.     if (head.x === food.x && head.y === food.y) {
  42.         score++;
  43.         food = randomFoodPosition();
  44.     } else {
  45.         snake.pop();
  46.     }
  47. }

  48. function collision(head) {
  49.     for (let i = 1; i < snake.length; i++) {
  50.         if (snake[i].x === head.x && snake[i].y === head.y) {
  51.             return true;
  52.         }
  53.     }
  54.     return false;
  55. }

  56. function main() {
  57.     if (gameOver) {
  58.         displayGameOver();
  59.         return;
  60.     }

  61.     setTimeout(function onTick() {
  62.         clearCanvas();
  63.         drawFood();
  64.         moveSnake();
  65.         drawSnake();
  66.         main();
  67.     }, 100);
  68. }

  69. function changeDirection(event) {
  70.     const LEFT_KEY = 37;
  71.     const RIGHT_KEY = 39;
  72.     const UP_KEY = 38;
  73.     const DOWN_KEY = 40;

  74.     const keyPressed = event.keyCode;
  75.     const goingUp = dy === -10;
  76.     const goingDown = dy === 10;
  77.     const goingRight = dx === 10;
  78.     const goingLeft = dx === -10;

  79.     if (keyPressed === LEFT_KEY && !goingRight) {
  80.         dx = -10;
  81.         dy = 0;
  82.     }

  83.     if (keyPressed === UP_KEY && !goingDown) {
  84.         dx = 0;
  85.         dy = -10;
  86.     }

  87.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  88.         dx = 10;
  89.         dy = 0;
  90.     }

  91.     if (keyPressed === DOWN_KEY && !goingUp) {
  92.         dx = 0;
  93.         dy = 10;
  94.     }
  95. }

  96. // 显示游戏结束
  97. function displayGameOver() {
  98.     ctx.fillStyle = "black";
  99.     ctx.font = "30px Arial";
  100.     ctx.fillText("游戏结束!得分: " + score, canvas.width / 4, canvas.height / 2);
  101.     document.getElementById("startButton").style.display = "block";
  102. }

  103. function startGame() {
  104.     snake = [{ x: 50, y: 50 }];
  105.     score = 0;
  106.     dx = 10;
  107.     dy = 0;
  108.     gameOver = false;
  109.     food = randomFoodPosition();
  110.     main();
  111. }

  112. food = randomFoodPosition();
  113. main();
复制代码


### 修改后的 HTML 代码

在原有的 `index.html` 文件中,添加一个开始游戏的按钮:

  1. <!DOCTYPE html>
  2. <html lang="zh">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>贪吃蛇游戏</title>
  7.     <style>
  8.         canvas {
  9.             border: 1px solid black;
  10.             background-color: #f5f5f5;
  11.         }
  12.         #startButton {
  13.             display: none;
  14.             margin-top: 10px;
  15.         }
  16.     </style>
  17. </head>
  18. <body>
  19.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  20.     <button id="startButton" onclick="startGame()">开始游戏</button>
  21.     <script src="script.js"></script>
  22. </body>
  23. </html>
复制代码


### 解释修改的内容:

1. **生成食物**:使用 `randomFoodPosition()` 函数随机位置放置食物。
2. **增加得分**:每次蛇吃到食物时,得分加一,并重新生成食物。
3. **检测碰壁**:如果蛇的头部碰到边界或自己的身体,游戏结束。
4. **显示游戏结束信息**:当游戏结束时,显示得分和“开始游戏”按钮。
5. **重新开始游戏**:点击“开始游戏”按钮后,游戏会重置并开始。

现在你打开 `index.html` 文件,就可以玩这个完整的贪吃蛇游戏了!享受游戏吧!如果还有其他问题,随时问我哦!
回复 支持 反对

使用道具 举报

3

主题

41

帖子

137

积分

注册会员

Rank: 2

积分
137
5#
 楼主| 发表于 2024-8-2 15:34:13 | 只看该作者
为什么没有css文件
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
6#
发表于 2024-8-2 15:34:26 | 只看该作者
张复礼 发表于 2024-08-02 15:34
为什么没有css文件


抱歉忘记提到CSS文件了!来,我们为这个贪吃蛇游戏添加一些简单的样式,使它看起来更好。接下来,我们会创建一个 `style.css` 文件并添加相应的样式。

### 创建 CSS 文件

新建一个文件,命名为 `style.css`,然后添加以下内容:

  1. body {
  2.     display: flex;
  3.     flex-direction: column;
  4.     align-items: center;
  5.     justify-content: center;
  6.     height: 100vh;
  7.     background-color: #e0e0e0;
  8. }

  9. canvas {
  10.     border: 1px solid black;
  11.     background-color: #f5f5f5;
  12. }

  13. #startButton {
  14.     display: none; /* 默认隐藏 */
  15.     padding: 10px 20px;
  16.     font-size: 20px;
  17.     margin-top: 10px;
  18.     cursor: pointer;
  19.     background-color: #4CAF50; /* 绿色按钮 */
  20.     color: white;
  21.     border: none;
  22.     border-radius: 5px;
  23. }

  24. #startButton:hover {
  25.     background-color: #45a049; /* 更深的绿色 */
  26. }
复制代码


### 修改 HTML 文件以链接 CSS

确保在 `index.html` 文件的 `<head>` 部分连接这个 CSS 文件:

  1. <!DOCTYPE html>
  2. <html lang="zh">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>贪吃蛇游戏</title>
  7.     <link rel="stylesheet" href="style.css"> <!-- 添加这行 -->
  8. </head>
  9. <body>
  10.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  11.     <button id="startButton" onclick="startGame()">开始游戏</button>

  12.     <script src="script.js"></script>
  13. </body>
  14. </html>
复制代码


### 解释 CSS 样式:

1. **`body`**: 用 Flexbox 布局使画布和按钮居中,背景颜色为淡灰色。
2. **`canvas`**: 设置边框和背景颜色。
3. **`#startButton`**: 设置按钮的样式,包括颜色、大小以及鼠标悬停时的效果。

### 运行游戏

完成这些后,你可以在浏览器中打开 `index.html` 文件,使用“开始游戏”按钮来开始你的贪吃蛇游戏!希望你喜欢这些改动!如果还有其他问题,或者想进一步增加更多功能,随时告诉我哦!
回复 支持 反对

使用道具 举报

3

主题

41

帖子

137

积分

注册会员

Rank: 2

积分
137
7#
 楼主| 发表于 2024-8-6 14:17:33 | 只看该作者
游戏结束后,“开始游戏”的按钮出现在“游戏结束!”四个字下方。
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
8#
发表于 2024-8-6 14:18:01 | 只看该作者
张复礼 发表于 2024-08-06 14:17
游戏结束后,“开始游戏”的按钮出现在“游戏结束!” ...


好的,我们来调整一下按钮在“游戏结束!”文字下方的位置。为此,我们将进一步改进 HTML 和 CSS 代码,使布局更合理。

### 修改后的 HTML 代码

更新你的 `index.html` 文件,使其如下所示:

  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>贪吃蛇游戏</title>
  7.     <link rel="stylesheet" href="style.css">
  8. </head>
  9. <body>
  10.     <h1>贪吃蛇游戏</h1>
  11.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  12.     <div id="gameOverText" class="hidden">游戏结束!</div>
  13.     <button id="startButton" onclick="startGame()">开始游戏</button>
  14.     <script src="script.js"></script>
  15. </body>
  16. </html>
复制代码


这里我们添加了一个 `<div>` 标签,用于显示“游戏结束!”的信息。

### 修改后的 CSS 代码

更新你的 `style.css` 文件,使其如下所示:

  1. body {
  2.     display: flex;
  3.     flex-direction: column;
  4.     align-items: center;
  5.     justify-content: center;
  6.     height: 100vh;
  7.     background-color: #e0e0e0;
  8.     margin: 0;
  9. }

  10. canvas {
  11.     border: 1px solid black;
  12.     background-color: #f5f5f5;
  13. }

  14. #startButton {
  15.     display: none; /* 默认隐藏 */
  16.     padding: 10px 20px;
  17.     font-size: 20px;
  18.     margin-top: 10px;
  19.     cursor: pointer;
  20.     background-color: #4CAF50; /* 绿色按钮 */
  21.     color: white;
  22.     border: none;
  23.     border-radius: 5px;
  24. }

  25. #startButton:hover {
  26.     background-color: #45a049; /* 更深的绿色 */
  27. }

  28. #gameOverText {
  29.     font-size: 24px;
  30.     color: red;
  31.     margin-top: 20px;
  32.     display: none; /* 默认隐藏 */
  33. }

  34. .hidden {
  35.     display: none;
  36. }
复制代码


### 修改后的 JavaScript 代码

接下来,更新 `script.js` 文件,使其如下所示:

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

  3. let snake = [{ x: 50, y: 50 }];
  4. let food = { x: 0, y: 0 };
  5. let dx = 10;
  6. let dy = 0;
  7. let score = 0;
  8. let gameOver = false;

  9. document.addEventListener("keydown", changeDirection);

  10. function randomFoodPosition() {
  11.     const x = Math.floor(Math.random() * (canvas.width / 10)) * 10;
  12.     const y = Math.floor(Math.random() * (canvas.height / 10)) * 10;
  13.     return { x, y };
  14. }

  15. function clearCanvas() {
  16.     ctx.fillStyle = "white";
  17.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  18. }

  19. function drawSnake() {
  20.     snake.forEach(drawSnakePart);
  21. }

  22. function drawSnakePart(snakePart) {
  23.     ctx.fillStyle = 'lightgreen';
  24.     ctx.strokeStyle = 'darkgreen';
  25.     ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  26.     ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  27. }

  28. function drawFood() {
  29.     ctx.fillStyle = 'red';
  30.     ctx.fillRect(food.x, food.y, 10, 10);
  31. }

  32. function moveSnake() {
  33.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };

  34.     // 检测碰壁
  35.     if (head.x < 0 || head.x >= canvas.width || head.y < 0 || head.y >= canvas.height || collision(head)) {
  36.         gameOver = true;
  37.         return;
  38.     }

  39.     snake.unshift(head);

  40.     // 检查是否吃到食物
  41.     if (head.x === food.x && head.y === food.y) {
  42.         score++;
  43.         food = randomFoodPosition();
  44.     } else {
  45.         snake.pop();
  46.     }
  47. }

  48. function collision(head) {
  49.     for (let i = 1; i < snake.length; i++) {
  50.         if (snake[i].x === head.x && snake[i].y === head.y) {
  51.             return true;
  52.         }
  53.     }
  54.     return false;
  55. }

  56. function main() {
  57.     if (gameOver) {
  58.         displayGameOver();
  59.         return;
  60.     }

  61.     setTimeout(function onTick() {
  62.         clearCanvas();
  63.         drawFood();
  64.         moveSnake();
  65.         drawSnake();
  66.         main();
  67.     }, 100);
  68. }

  69. function changeDirection(event) {
  70.     const LEFT_KEY = 37;
  71.     const RIGHT_KEY = 39;
  72.     const UP_KEY = 38;
  73.     const DOWN_KEY = 40;

  74.     const keyPressed = event.keyCode;
  75.     const goingUp = dy === -10;
  76.     const goingDown = dy === 10;
  77.     const goingRight = dx === 10;
  78.     const goingLeft = dx === -10;

  79.     if (keyPressed === LEFT_KEY && !goingRight) {
  80.         dx = -10;
  81.         dy = 0;
  82.     }

  83.     if (keyPressed === UP_KEY && !goingDown) {
  84.         dx = 0;
  85.         dy = -10;
  86.     }

  87.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  88.         dx = 10;
  89.         dy = 0;
  90.     }

  91.     if (keyPressed === DOWN_KEY && !goingUp) {
  92.         dx = 0;
  93.         dy = 10;
  94.     }
  95. }

  96. // 显示游戏结束
  97. function displayGameOver() {
  98.     document.getElementById('gameOverText').classList.remove('hidden');
  99.     document.getElementById('startButton').style.display = 'block';
  100. }

  101. function startGame() {
  102.     snake = [{ x: 50, y: 50 }];
  103.     score = 0;
  104.     dx = 10;
  105.     dy = 0;
  106.     gameOver = false;
  107.     food = randomFoodPosition();
  108.     document.getElementById('gameOverText').classList.add('hidden');
  109.     document.getElementById('startButton').style.display = 'none';
  110.     main();
  111. }

  112. food = randomFoodPosition();
  113. main();
复制代码


### 解释调整内容:

1. **HTML**:
    - 添加了一个 `<div id="gameOverText" class="hidden">` 用于显示“游戏结束!”信息。
    - 更新了按钮的点击事件为 `onclick="startGame()"`。
   
2. **CSS**:
    - 更新了 `#gameOverText` 样式,确保它默认隐藏,并在需要的时候显示。
    - 确保 `#startButton` 和 `#gameOverText` 在样式上有合理的间距。

3. **JavaScript**:
    - 添加了 `displayGameOver` 函数来显示“游戏结束!”信息和按钮。
    - 更新了 `startGame` 函数以重置游戏状态并隐藏“游戏结束!”信息和按钮。

现在,游戏结束后,“开始游戏”按钮将显示在“游戏结束!”文字的下方。希望这些修改能满足你的需求!如果还有其他问题,尽管问我哦!
回复 支持 反对

使用道具 举报

3

主题

41

帖子

137

积分

注册会员

Rank: 2

积分
137
9#
 楼主| 发表于 2024-8-6 14:21:46 | 只看该作者
游戏结束后,显示“很遗憾!游戏结束”,并显示得分
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
10#
发表于 2024-8-6 14:23:20 | 只看该作者
张复礼 发表于 2024-08-06 14:21
游戏结束后,显示“很遗憾!游戏结束”,并显示得分 ...


好的,让我们在游戏结束时更清晰地显示“很遗憾!游戏结束”,并显示得分。我们会在HTML中添加一个用于显示游戏结束信息的元素,并在JavaScript中更新其内容。

### 修改后的 HTML 代码

首先,更新你的 `index.html` 文件,如下所示:

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>贪吃蛇游戏</title>
  7.     <link rel="stylesheet" href="style.css">
  8. </head>
  9. <body>
  10.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  11.     <div id="gameOverText" class="hidden">很遗憾!游戏结束<br>得分: <span id="score"></span></div>
  12.     <button id="startButton" onclick="startGame()">开始游戏</button>
  13.     <script src="script.js"></script>
  14. </body>
  15. </html>
复制代码


这里我们使用了 `<span id="score"></span>` 来动态显示得分。

### 修改后的 CSS 代码

更新你的 `style.css` 文件,使其如下所示(没有太大变化,只是确保样式合理):

  1. body {
  2.     display: flex;
  3.     flex-direction: column;
  4.     align-items: center;
  5.     justify-content: center;
  6.     height: 100vh;
  7.     background-color: #e0e0e0;
  8.     margin: 0;
  9. }

  10. canvas {
  11.     border: 1px solid black;
  12.     background-color: #f5f5f5;
  13. }

  14. #startButton {
  15.     display: none; /* 默认隐藏 */
  16.     padding: 10px 20px;
  17.     font-size: 20px;
  18.     margin-top: 10px;
  19.     cursor: pointer;
  20.     background-color: #4CAF50; /* 绿色按钮 */
  21.     color: white;
  22.     border: none;
  23.     border-radius: 5px;
  24. }

  25. #startButton:hover {
  26.     background-color: #45a049; /* 更深的绿色 */
  27. }

  28. #gameOverText {
  29.     font-size: 24px;
  30.     color: red;
  31.     text-align: center;
  32.     margin-top: 20px;
  33.     display: none; /* 默认隐藏 */
  34. }
复制代码


### 修改后的 JavaScript 代码

接下来,更新 `script.js` 文件,使其如下所示:

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

  3. let snake = [{ x: 150, y: 150 }, { x: 140, y: 150 }, { x: 130, y: 150 }, { x: 120, y: 150 }, { x: 110, y: 150 }];
  4. let food = { x: 0, y: 0 };
  5. let dx = 10;
  6. let dy = 0;
  7. let score = 0;
  8. let gameOver = false;

  9. document.addEventListener("keydown", changeDirection);

  10. function randomFoodPosition() {
  11.     const x = Math.floor(Math.random() * (canvas.width / 10)) * 10;
  12.     const y = Math.floor(Math.random() * (canvas.height / 10)) * 10;
  13.     return { x, y };
  14. }

  15. function clearCanvas() {
  16.     ctx.fillStyle = "white";
  17.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  18. }

  19. function drawSnake() {
  20.     snake.forEach(drawSnakePart);
  21. }

  22. function drawSnakePart(snakePart) {
  23.     ctx.fillStyle = 'lightgreen';
  24.     ctx.strokeStyle = 'darkgreen';
  25.     ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  26.     ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  27. }

  28. function drawFood() {
  29.     ctx.fillStyle = 'red';
  30.     ctx.fillRect(food.x, food.y, 10, 10);
  31. }

  32. function moveSnake() {
  33.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };

  34.     // 检测碰壁
  35.     if (head.x < 0 || head.x >= canvas.width || head.y < 0 || head.y >= canvas.height || collision(head)) {
  36.         gameOver = true;
  37.         return;
  38.     }

  39.     snake.unshift(head);

  40.     // 检查是否吃到食物
  41.     if (head.x === food.x && head.y === food.y) {
  42.         score++;
  43.         food = randomFoodPosition();
  44.     } else {
  45.         snake.pop();
  46.     }
  47. }

  48. function collision(head) {
  49.     for (let i = 1; i < snake.length; i++) {
  50.         if (snake[i].x === head.x && snake[i].y === head.y) {
  51.             return true;
  52.         }
  53.     }
  54.     return false;
  55. }

  56. function main() {
  57.     if (gameOver) {
  58.         displayGameOver();
  59.         return;
  60.     }

  61.     setTimeout(function onTick() {
  62.         clearCanvas();
  63.         drawFood();
  64.         moveSnake();
  65.         drawSnake();
  66.         main();
  67.     }, 100);
  68. }

  69. function changeDirection(event) {
  70.     const LEFT_KEY = 37;
  71.     const RIGHT_KEY = 39;
  72.     const UP_KEY = 38;
  73.     const DOWN_KEY = 40;

  74.     const keyPressed = event.keyCode;
  75.     const goingUp = dy === -10;
  76.     const goingDown = dy === 10;
  77.     const goingRight = dx === 10;
  78.     const goingLeft = dx === -10;

  79.     if (keyPressed === LEFT_KEY && !goingRight) {
  80.         dx = -10;
  81.         dy = 0;
  82.     }

  83.     if (keyPressed === UP_KEY && !goingDown) {
  84.         dx = 0;
  85.         dy = -10;
  86.     }

  87.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  88.         dx = 10;
  89.         dy = 0;
  90.     }

  91.     if (keyPressed === DOWN_KEY && !goingUp) {
  92.         dx = 0;
  93.         dy = 10;
  94.     }
  95. }

  96. // 显示游戏结束
  97. function displayGameOver() {
  98.     document.getElementById('gameOverText').classList.remove('hidden');
  99.     document.getElementById('score').innerText = score;
  100.     document.getElementById('startButton').style.display = 'block';
  101. }

  102. function startGame() {
  103.     snake = [{ x: 150, y: 150 }, { x: 140, y: 150 }, { x: 130, y: 150 }, { x: 120, y: 150 }, { x: 110, y: 150 }];
  104.     score = 0;
  105.     dx = 10;
  106.     dy = 0;
  107.     gameOver = false;
  108.     food = randomFoodPosition();
  109.     document.getElementById('gameOverText').classList.add('hidden');
  110.     document.getElementById('startButton').style.display = 'none';
  111.     main();
  112. }

  113. food = randomFoodPosition();
  114. main();
复制代码


### 解释调整内容:

1. **HTML**:
    - 添加了一个用于显示“很遗憾!游戏结束”和得分信息的 `<span id="score"></span>`。
   
2. **CSS**:
    - 添加了 `#gameOverText` 的样式,确保它在需要的时候显示,并且居中显示文本。

3. **JavaScript**:
    - 在 `displayGameOver` 函数中更新了 `gameOverText` 的内容以包含得分。
    - 确保游戏结束时,“游戏结束!”信息和按钮一同显示。

现在,当游戏结束时,会显示“很遗憾!游戏结束”并显示得分,同时“开始游戏”按钮也会出现在下方。希望这些修改能满足你的需求!如果还有其他问题,请随时告诉我哦!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表