科学教育

标题: 林奕锦1 [打印本页]

作者: 林奕锦    时间: 2024-7-17 09:53
标题: 林奕锦1
请帮我设计一个网页贪吃蛇游戏,加上注释
作者: kaia    时间: 2024-7-17 09:54
当然可以!贪吃蛇游戏是一个很有趣的项目。我们可以使用HTML、CSS和JavaScript来实现这个游戏。我会加上详细的注释,便于你理解每一部分的功能。

### 1. HTML 部分
首先,我们需要一个简单的HTML页面来容纳游戏画面及相关资源。

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>贪吃蛇游戏</title>
  6.     <style>
  7.         /* 设置画布和页面的样式 */
  8.         canvas {
  9.             background-color: #000;
  10.             display: block;
  11.             margin: 0 auto;
  12.         }
  13.     </style>
  14. </head>
  15. <body>
  16.     <!-- 游戏画布 -->
  17.     <canvas id="gameCanvas" width="400" height="400"></canvas>

  18.     <!-- 引入 JavaScript 文件 -->
  19.     <script src="snake_game.js"></script>
  20. </body>
  21. </html>
复制代码


### 2. JavaScript 部分
接下来是主要的游戏逻辑代码。我们将把它放在一个名为`snake_game.js`的文件中。

  1. // 获取画布并设置上下文
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');

  4. // 定义蛇的初始状态
  5. let snake = [
  6.     {x: 150, y: 150},
  7.     {x: 140, y: 150},
  8.     {x: 130, y: 150},
  9.     {x: 120, y: 150},
  10.     {x: 110, y: 150}
  11. ];

  12. // 初始化食物位置
  13. let foodX;
  14. let foodY;

  15. // 初始速度 - 蛇向右移动
  16. let dx = 10;
  17. let dy = 0;

  18. // 游戏运行标志
  19. let isGameRunning = true;

  20. // 创建游戏循环
  21. function main() {
  22.     if (isGameRunning) {
  23.         setTimeout(function onTick() {
  24.             clearCanvas();
  25.             moveSnake();
  26.             drawSnake();
  27.             drawFood();
  28.             checkGameOver();
  29.             main();
  30.         }, 100);
  31.     } else {
  32.         alert("游戏结束!");
  33.     }
  34. }

  35. // 清除画布
  36. function clearCanvas() {
  37.     ctx.fillStyle = "black";
  38.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  39. }

  40. // 绘制蛇
  41. function drawSnake() {
  42.     snake.forEach(snakePart => {
  43.         ctx.fillStyle = 'lightgreen';
  44.         ctx.strokestyle = 'darkgreen';
  45.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  46.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  47.     });
  48. }

  49. // 移动蛇
  50. function moveSnake() {
  51.     const head = {x: snake[0].x + dx, y: snake[0].y + dy};
  52.     snake.unshift(head);

  53.     // 检查蛇是否吃到食物
  54.     if (snake[0].x === foodX && snake[0].y === foodY) {
  55.         createFood();
  56.     } else {
  57.         snake.pop();
  58.     }
  59. }

  60. // 随机生成食物位置
  61. function createFood() {
  62.     foodX = Math.floor((Math.random() * canvas.width) / 10) * 10;
  63.     foodY = Math.floor((Math.random() * canvas.height) / 10) * 10;

  64.     // 确保食物不会生成在蛇身体上
  65.     snake.forEach(snakePart => {
  66.         if (snakePart.x === foodX && snakePart.y === foodY) {
  67.             createFood();
  68.         }
  69.     });
  70. }

  71. // 绘制食物
  72. function drawFood() {
  73.     ctx.fillStyle = 'red';
  74.     ctx.strokestyle = 'darkred';
  75.     ctx.fillRect(foodX, foodY, 10, 10);
  76.     ctx.strokeRect(foodX, foodY, 10, 10);
  77. }

  78. // 检查游戏是否结束
  79. function checkGameOver() {
  80.     for (let i = 4; i < snake.length; i++) {
  81.         if (snake[i].x === snake[0].x && snake[i].y === snake[0].y) {
  82.             isGameRunning = false;
  83.         }
  84.     }

  85.     const hitLeftWall = snake[0].x < 0;
  86.     const hitRightWall = snake[0].x >= canvas.width;
  87.     const hitTopWall = snake[0].y < 0;
  88.     const hitBottomWall = snake[0].y >= canvas.height;

  89.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) {
  90.         isGameRunning = false;
  91.     }
  92. }

  93. // 更改方向
  94. document.addEventListener("keydown", changeDirection);

  95. function changeDirection(event) {
  96.     const LEFT_KEY = 37;
  97.     const RIGHT_KEY = 39;
  98.     const UP_KEY = 38;
  99.     const DOWN_KEY = 40;

  100.     const keyPressed = event.keyCode;
  101.     const goingUp = dy === -10;
  102.     const goingDown = dy === 10;
  103.     const goingRight = dx === 10;
  104.     const goingLeft = dx === -10;

  105.     if (keyPressed === LEFT_KEY && !goingRight) {
  106.         dx = -10;
  107.         dy = 0;
  108.     }

  109.     if (keyPressed === UP_KEY && !goingDown) {
  110.         dx = 0;
  111.         dy = -10;
  112.     }

  113.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  114.         dx = 10;
  115.         dy = 0;
  116.     }

  117.     if (keyPressed === DOWN_KEY && !goingUp) {
  118.         dx = 0;
  119.         dy = 10;
  120.     }
  121. }

  122. // 开始游戏
  123. createFood();
  124. main();
复制代码


### 3. 解释每个部分
1. **HTML部分**:
   - `<canvas>`标签用于绘制游戏画面。
   - `<script>`标签引入JavaScript文件,控制游戏逻辑。

2. **JavaScript部分**:
   - 用于初始化游戏画布、定义蛇的初始位置及移动方向。
   - `main`函数是游戏循环,每隔100毫秒更新一次游戏状态。
   - `clearCanvas`函数清除画布,以便重新绘制。
   - `drawSnake`和`drawFood`分别用于绘制蛇和食物。
   - `moveSnake`控制蛇的移动,并检测是否吃到食物。
   - `createFood`用于生成随机的食物位置。
   - `checkGameOver`检测游戏是否结束。
   - `changeDirection`处理键盘事件来改变蛇的移动方向。

希望这些解释能帮你更好地理解贪吃蛇游戏的实现!如果你还有其他问题或需要进一步的帮助,请告诉我。
作者: 林奕锦    时间: 2024-7-17 09:58
请用上css文件

作者: kaia    时间: 2024-7-17 09:59
林奕锦 发表于 2024-07-17 09:58
请用上css文件


好的!我们可以把CSS样式单独放到一个文件中,以便更好地管理和维护。我们将分为三个部分:HTML、CSS和JavaScript。

### 1. HTML 部分
首先创建一个HTML文件,命名为`index.html`。
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>贪吃蛇游戏</title>
  6.     <link rel="stylesheet" href="styles.css"> <!-- 引入外部CSS文件 -->
  7. </head>
  8. <body>
  9.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  10.     <script src="snake_game.js"></script> <!-- 引入外部JavaScript文件 -->
  11. </body>
  12. </html>
复制代码


### 2. CSS 部分
接下来创建一个CSS文件,命名为`styles.css`。
  1. /* 设置画布和页面的样式 */
  2. canvas {
  3.     background-color: #000; /* 黑色背景 */
  4.     display: block; /* 画布作为块级元素 */
  5.     margin: 0 auto; /* 居中对齐 */
  6. }

  7. /* 添加一些基本的页面样式 */
  8. body {
  9.     display: flex;
  10.     justify-content: center;
  11.     align-items: center;
  12.     height: 100vh;
  13.     margin: 0;
  14. }
复制代码


### 3. JavaScript 部分
最后创建一个JavaScript文件,命名为`snake_game.js`。
  1. // 获取画布并设置上下文
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');

  4. // 定义蛇的初始状态
  5. let snake = [
  6.     { x: 150, y: 150 },
  7.     { x: 140, y: 150 },
  8.     { x: 130, y: 150 },
  9.     { x: 120, y: 150 },
  10.     { x: 110, y: 150 }
  11. ];

  12. // 初始化食物位置
  13. let foodX;
  14. let foodY;

  15. // 初始速度 - 蛇向右移动
  16. let dx = 10;
  17. let dy = 0;

  18. // 游戏运行标志
  19. let isGameRunning = true;

  20. // 创建游戏循环
  21. function main() {
  22.     if (isGameRunning) {
  23.         setTimeout(function onTick() {
  24.             clearCanvas();
  25.             moveSnake();
  26.             drawSnake();
  27.             drawFood();
  28.             checkGameOver();
  29.             main();
  30.         }, 100);
  31.     } else {
  32.         alert("游戏结束!");
  33.     }
  34. }

  35. // 清除画布
  36. function clearCanvas() {
  37.     ctx.fillStyle = "black";
  38.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  39. }

  40. // 绘制蛇
  41. function drawSnake() {
  42.     snake.forEach(snakePart => {
  43.         ctx.fillStyle = 'lightgreen';
  44.         ctx.strokestyle = 'darkgreen';
  45.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  46.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  47.     });
  48. }

  49. // 移动蛇
  50. function moveSnake() {
  51.     const head = {x: snake[0].x + dx, y: snake[0].y + dy};
  52.     snake.unshift(head);

  53.     // 检查蛇是否吃到食物
  54.     const didEatFood = snake[0].x === foodX && snake[0].y === foodY;
  55.     if (didEatFood) {
  56.         createFood();
  57.     } else {
  58.         snake.pop();
  59.     }
  60. }

  61. // 随机生成食物位置
  62. function createFood() {
  63.     foodX = Math.floor((Math.random() * canvas.width) / 10) * 10;
  64.     foodY = Math.floor((Math.random() * canvas.height) / 10) * 10;

  65.     // 确保食物不会生成在蛇身体上
  66.     snake.forEach(snakePart => {
  67.         if (snakePart.x === foodX && snakePart.y === foodY) {
  68.             createFood();
  69.         }
  70.     });
  71. }

  72. // 绘制食物
  73. function drawFood() {
  74.     ctx.fillStyle = 'red';
  75.     ctx.strokestyle = 'darkred';
  76.     ctx.fillRect(foodX, foodY, 10, 10);
  77.     ctx.strokeRect(foodX, foodY, 10, 10);
  78. }

  79. // 检查游戏是否结束
  80. function checkGameOver() {
  81.     for (let i = 4; i < snake.length; i++) {
  82.         if (snake[0].x === snake[i].x && snake[0].y === snake[i].y) {
  83.             isGameRunning = false;
  84.         }
  85.     }

  86.     const hitLeftWall = snake[0].x < 0;
  87.     const hitRightWall = snake[0].x >= canvas.width;
  88.     const hitTopWall = snake[0].y < 0;
  89.     const hitBottomWall = snake[0].y >= canvas.height;

  90.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) {
  91.         isGameRunning = false;
  92.     }
  93. }

  94. // 更改方向
  95. document.addEventListener("keydown", changeDirection);

  96. function changeDirection(event) {
  97.     const LEFT_KEY = 37;
  98.     const RIGHT_KEY = 39;
  99.     const UP_KEY = 38;
  100.     const DOWN_KEY = 40;

  101.     const keyPressed = event.keyCode;
  102.     const goingUp = dy === -10;
  103.     const goingDown = dy === 10;
  104.     const goingRight = dx === 10;
  105.     const goingLeft = dx === -10;

  106.     if (keyPressed === LEFT_KEY && !goingRight) {
  107.         dx = -10;
  108.         dy = 0;
  109.     }

  110.     if (keyPressed === UP_KEY && !goingDown) {
  111.         dx = 0;
  112.         dy = -10;
  113.     }

  114.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  115.         dx = 10;
  116.         dy = 0;
  117.     }

  118.     if (keyPressed === DOWN_KEY && !goingUp) {
  119.         dx = 0;
  120.         dy = 10;
  121.     }
  122. }

  123. // 开始游戏
  124. createFood();
  125. main();
复制代码


### 总结
你现在有三个文件:
- `index.html`:包含网页的结构和引入其他资源。
- `styles.css`:包含网页的样式配置,例如画布的颜色和定位。
- `snake_game.js`:包含贪吃蛇游戏的所有逻辑,用于绘制蛇、处理食物生成、检测游戏结束等。

将这三个文件放在同一文件夹中,然后在浏览器中打开`index.html`就可以玩贪吃蛇游戏了。如果遇到问题或有其他需求,欢迎继续提问!
作者: 林奕锦    时间: 2024-7-17 10:03
请帮我加上开始按钮和结束得分提示
作者: kaia    时间: 2024-7-17 10:04
林奕锦 发表于 2024-07-17 10:03
请帮我加上开始按钮和结束得分提示


好的!我们可以在网页上添加一个“开始游戏”按钮,并在游戏结束时显示得分提示。下面是如何修改HTML、CSS和JavaScript来实现这些功能。

### 1. 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.     <link rel="stylesheet" href="styles.css">
  8. </head>
  9. <body>
  10.     <h1>贪吃蛇游戏</h1>
  11.     <button id="startButton">开始游戏</button>
  12.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  13.     <div id="score">得分: 0</div>

  14.     <script src="snake_game.js"></script>
  15. </body>
  16. </html>
复制代码


### 2. CSS 部分
更新`styles.css`文件,添加按钮和得分的样式。
  1. /* 设置画布和页面的样式 */
  2. canvas {
  3.     background-color: #000; /* 黑色背景 */
  4.     display: block; /* 画布作为块级元素 */
  5.     margin: 0 auto; /* 居中对齐 */
  6. }

  7. /* 添加一些基本的页面样式 */
  8. body {
  9.     display: flex;
  10.     flex-direction: column;
  11.     align-items: center;
  12.     justify-content: center;
  13.     height: 100vh;
  14.     margin: 0;
  15. }

  16. h1 {
  17.     color: #333;
  18. }

  19. #startButton {
  20.     padding: 10px 20px;
  21.     font-size: 16px;
  22.     margin-bottom: 20px;
  23. }

  24. #score {
  25.     margin-top: 20px;
  26.     font-size: 20px;
  27.     color: #333;
  28. }
复制代码


### 3. JavaScript 部分
最后,更新`snake_game.js`文件,以包含初始化、得分计算和显示的逻辑。
  1. // 获取画布并设置上下文
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');
  4. const startButton = document.getElementById('startButton');
  5. const scoreDisplay = document.getElementById('score');

  6. // 定义蛇的初始状态
  7. let snake = [];
  8. let foodX;
  9. let foodY;
  10. let dx = 10;
  11. let dy = 0;
  12. let score = 0;
  13. let isGameRunning = false;

  14. // 创建游戏循环
  15. function main() {
  16.     if (isGameRunning) {
  17.         setTimeout(function onTick() {
  18.             clearCanvas();
  19.             moveSnake();
  20.             drawSnake();
  21.             drawFood();
  22.             checkGameOver();
  23.             main();
  24.         }, 100);
  25.     } else {
  26.         alert(`游戏结束!得分: ${score}`);
  27.     }
  28. }

  29. // 初始化游戏
  30. function startGame() {
  31.     snake = [{ x: 150, y: 150 }];
  32.     dx = 10;
  33.     dy = 0;
  34.     score = 0;
  35.     isGameRunning = true;
  36.     createFood();
  37.     scoreDisplay.innerText = `得分: ${score}`;
  38.     main();
  39. }

  40. // 清除画布
  41. function clearCanvas() {
  42.     ctx.fillStyle = "black";
  43.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  44. }

  45. // 绘制蛇
  46. function drawSnake() {
  47.     snake.forEach(snakePart => {
  48.         ctx.fillStyle = 'lightgreen';
  49.         ctx.strokestyle = 'darkgreen';
  50.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  51.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  52.     });
  53. }

  54. // 移动蛇
  55. function moveSnake() {
  56.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  57.     snake.unshift(head);
  58.     const didEatFood = snake[0].x === foodX && snake[0].y === foodY;
  59.     if (didEatFood) {
  60.         score += 10;
  61.         scoreDisplay.innerText = `得分: ${score}`;
  62.         createFood();
  63.     } else {
  64.         snake.pop();
  65.     }
  66. }

  67. // 随机生成食物位置
  68. function createFood() {
  69.     foodX = Math.floor((Math.random() * canvas.width) / 10) * 10;
  70.     foodY = Math.floor((Math.random() * canvas.height) / 10) * 10;

  71.     // 确保食物不会生成在蛇身体上
  72.     snake.forEach(snakePart => {
  73.         if (snakePart.x === foodX && snakePart.y === foodY) {
  74.             createFood();
  75.         }
  76.     });
  77. }

  78. // 绘制食物
  79. function drawFood() {
  80.     ctx.fillStyle = 'red';
  81.     ctx.strokestyle = 'darkred';
  82.     ctx.fillRect(foodX, foodY, 10, 10);
  83.     ctx.strokeRect(foodX, foodY, 10, 10);
  84. }

  85. // 检查游戏是否结束
  86. function checkGameOver() {
  87.     for (let i = 4; i < snake.length; i++) {
  88.         if (snake[i].x === snake[0].x && snake[i].y === snake[0].y) {
  89.             isGameRunning = false;
  90.         }
  91.     }

  92.     const hitLeftWall = snake[0].x < 0;
  93.     const hitRightWall = snake[0].x >= canvas.width;
  94.     const hitTopWall = snake[0].y < 0;
  95.     const hitBottomWall = snake[0].y >= canvas.height;

  96.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) {
  97.         isGameRunning = false;
  98.     }
  99. }

  100. // 更改方向
  101. document.addEventListener("keydown", changeDirection);

  102. function changeDirection(event) {
  103.     const LEFT_KEY = 37;
  104.     const RIGHT_KEY = 39;
  105.     const UP_KEY = 38;
  106.     const DOWN_KEY = 40;

  107.     const keyPressed = event.keyCode;
  108.     const goingUp = dy === -10;
  109.     const goingDown = dy === 10;
  110.     const goingRight = dx === 10;
  111.     const goingLeft = dx === -10;

  112.     if (keyPressed === LEFT_KEY && !goingRight) {
  113.         dx = -10;
  114.         dy = 0;
  115.     }

  116.     if (keyPressed === UP_KEY && !goingDown) {
  117.         dx = 0;
  118.         dy = -10;
  119.     }

  120.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  121.         dx = 10;
  122.         dy = 0;
  123.     }

  124.     if (keyPressed === DOWN_KEY && !goingUp) {
  125.         dx = 0;
  126.         dy = 10;
  127.     }
  128. }

  129. // 开始按钮点击事件
  130. startButton.addEventListener("click", startGame);
复制代码


### 总结
现在,你有更新后的三个文件:
1. `index.html`:包含网页结构和添加了“开始游戏”按钮及得分显示。
2. `styles.css`:包含网页的样式配置,包括按钮和得分显示的样式。
3. `snake_game.js`:添加了初始化、得分计算和显示的逻辑,点击“开始游戏”按钮即可开始游戏。

将这三个文件放在同一文件夹中,然后在浏览器中打开`index.html`就可以玩贪吃蛇游戏了。如果遇到问题或有其他需求,欢迎继续提问!
作者: 林奕锦    时间: 2024-7-17 10:09
为什么我的网页的所有中文都无法显示?
作者: kaia    时间: 2024-7-17 10:10
林奕锦 发表于 2024-07-17 10:09
为什么我的网页的所有中文都无法显示? ...


如果你的网页中的所有中文都无法显示,这通常是因为编码问题引起的。为了确保网页中的中文能够正确显示,我们需要将HTML文件的编码设置为UTF-8。

### 确保HTML文件使用UTF-8编码

在HTML文档的`<head>`部分中添加以下meta标签,以确保使用UTF-8编码:

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>贪吃蛇游戏</title>
  6.     <link rel="stylesheet" href="styles.css">
  7. </head>
  8. <body>
  9.     <h1>贪吃蛇游戏</h1>
  10.     <button id="startButton">开始游戏</button>
  11.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  12.     <div id="score">得分: 0</div>
  13.     <script src="snake_game.js"></script>
  14. </body>
  15. </html>
复制代码


以上代码已经加入了`<meta charset="UTF-8">`,这个声明告诉浏览器用UTF-8编码来解析HTML文档,从而确保中文字符能够正常显示。

### 检查文件保存格式

确保你的编辑器在保存文件时使用了UTF-8编码。如果你的编辑器支持选择文件编码格式,请确保选择的是UTF-8。

### 完整代码示例

为了确保所有中文字符都能正常显示,请参考以下完整的代码示例。

#### `index.html`

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>贪吃蛇游戏</title>
  6.     <link rel="stylesheet" href="styles.css">
  7. </head>
  8. <body>
  9.     <h1>贪吃蛇游戏</h1>
  10.     <button id="startButton">开始游戏</button>
  11.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  12.     <div id="score">得分: 0</div>
  13.     <script src="snake_game.js"></script>
  14. </body>
  15. </html>
复制代码


#### `styles.css`

  1. /* 设置画布和页面的样式 */
  2. canvas {
  3.     background-color: #000; /* 黑色背景 */
  4.     display: block; /* 画布作为块级元素 */
  5.     margin: 0 auto; /* 居中对齐 */
  6. }

  7. /* 添加一些基本的页面样式 */
  8. body {
  9.     display: flex;
  10.     flex-direction: column;
  11.     align-items: center;
  12.     justify-content: center;
  13.     height: 100vh;
  14.     margin: 0;
  15. }

  16. h1 {
  17.     color: #333;
  18. }

  19. #startButton {
  20.     padding: 10px 20px;
  21.     font-size: 16px;
  22.     margin-bottom: 20px;
  23. }

  24. #score {
  25.     margin-top: 20px;
  26.     font-size: 20px;
  27.     color: #333;
  28. }
复制代码


#### `snake_game.js`

  1. // 获取画布并设置上下文
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');
  4. const startButton = document.getElementById('startButton');
  5. const scoreDisplay = document.getElementById('score');

  6. // 定义蛇的初始状态
  7. let snake = [{ x: 150, y: 150 }];
  8. let foodX;
  9. let foodY;
  10. let dx = 10;
  11. let dy = 0;
  12. let score = 0;
  13. let isGameRunning = false;

  14. // 创建游戏循环
  15. function main() {
  16.     if (isGameRunning) {
  17.         setTimeout(function onTick() {
  18.             clearCanvas();
  19.             moveSnake();
  20.             drawSnake();
  21.             drawFood();
  22.             checkGameOver();
  23.             main();
  24.         }, 100);
  25.     } else {
  26.         alert(`游戏结束!得分: ${score}`);
  27.     }
  28. }

  29. // 初始化游戏
  30. function startGame() {
  31.     snake = [{ x: 150, y: 150 }];
  32.     dx = 10;
  33.     dy = 0;
  34.     score = 0;
  35.     isGameRunning = true;
  36.     createFood();
  37.     scoreDisplay.innerText = `得分: ${score}`;
  38.     main();
  39. }

  40. // 清除画布
  41. function clearCanvas() {
  42.     ctx.fillStyle = "black";
  43.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  44. }

  45. // 绘制蛇
  46. function drawSnake() {
  47.     snake.forEach(snakePart => {
  48.         ctx.fillStyle = 'lightgreen';
  49.         ctx.strokestyle = 'darkgreen';
  50.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  51.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  52.     });
  53. }

  54. // 移动蛇
  55. function moveSnake() {
  56.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  57.     snake.unshift(head);
  58.     const didEatFood = snake[0].x === foodX && snake[0].y === foodY;
  59.     if (didEatFood) {
  60.         score += 10;
  61.         scoreDisplay.innerText = `得分: ${score}`;
  62.         createFood();
  63.     } else {
  64.         snake.pop();
  65.     }
  66. }

  67. // 随机生成食物位置
  68. function createFood() {
  69.     foodX = Math.floor((Math.random() * canvas.width) / 10) * 10;
  70.     foodY = Math.floor((Math.random() * canvas.height) / 10) * 10;

  71.     // 确保食物不会生成在蛇身体上
  72.     snake.forEach(snakePart => {
  73.         if (snakePart.x === foodX && snakePart.y === foodY) {
  74.             createFood();
  75.         }
  76.     });
  77. }

  78. // 绘制食物
  79. function drawFood() {
  80.     ctx.fillStyle = 'red';
  81.     ctx.strokestyle = 'darkred';
  82.     ctx.fillRect(foodX, foodY, 10, 10);
  83.     ctx.strokeRect(foodX, foodY, 10, 10);
  84. }

  85. // 检查游戏是否结束
  86. function checkGameOver() {
  87.     for (let i = 4; i < snake.length; i++) {
  88.         if (snake[i].x === snake[0].x && snake[i].y === snake[0].y) {
  89.             isGameRunning = false;
  90.         }
  91.     }

  92.     const hitLeftWall = snake[0].x < 0;
  93.     const hitRightWall = snake[0].x >= canvas.width;
  94.     const hitTopWall = snake[0].y < 0;
  95.     const hitBottomWall = snake[0].y >= canvas.height;

  96.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) {
  97.         isGameRunning = false;
  98.     }
  99. }

  100. // 更改方向
  101. document.addEventListener("keydown", changeDirection);

  102. function changeDirection(event) {
  103.     const LEFT_KEY = 37;
  104.     const RIGHT_KEY = 39;
  105.     const UP_KEY = 38;
  106.     const DOWN_KEY = 40;

  107.     const keyPressed = event.keyCode;
  108.     const goingUp = dy === -10;
  109.     const goingDown = dy === 10;
  110.     const goingRight = dx === 10;
  111.     const goingLeft = dx === -10;

  112.     if (keyPressed === LEFT_KEY && !goingRight) {
  113.         dx = -10;
  114.         dy = 0;
  115.     }

  116.     if (keyPressed === UP_KEY && !goingDown) {
  117.         dx = 0;
  118.         dy = -10;
  119.     }

  120.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  121.         dx = 10;
  122.         dy = 0;
  123.     }

  124.     if (keyPressed === DOWN_KEY && !goingUp) {
  125.         dx = 0;
  126.         dy = 10;
  127.     }
  128. }

  129. // 开始按钮点击事件
  130. startButton.addEventListener("click", startGame);
复制代码


将这三个文件放在同一文件夹中,然后在浏览器中打开`index.html`,你就可以玩贪吃蛇游戏了,并且所有的中文字符应该能正常显示。如果还有其他问题或疑问,欢迎继续提问!
作者: 林奕锦    时间: 2024-7-17 10:11
为什么还是无法显示?
作者: kaia    时间: 2024-7-17 10:12
林奕锦 发表于 2024-07-17 10:11
为什么还是无法显示?


如果仍然无法显示中文,那么有可能是其他地方出现了问题。以下是一些常见的检查步骤,你可以逐一排查:

1. **确保文件保存为UTF-8编码格式**:在你的编辑器中,检查并确保所有文件都以UTF-8格式保存。有些编辑器可以直接设置默认编码格式为UTF-8。

2. **浏览器设置**:确保浏览器设置中没有禁用UTF-8编码的选项。

3. **文件路径和命名**:确保文件路径和文件名没有错误,确保所有文件在正确的位置且命名正确。

4. **CSS 和 JavaScript 文件是否被正确引用**:确保你在HTML中正确引用了CSS和JavaScript文件。

### 检查文件编码
确保你的编辑器保存文件时使用的UTF-8编码。不同的编辑器有不同的设置方式,以下是一些常用编辑器的操作方法:

#### VS Code
1. 打开文件后点击右下角的编码指示器(通常显示为UTF-8或其他),选择“Save with Encoding”。
2. 选择“UTF-8”编码保存文件。

#### Sublime Text
1. 打开文件后,点击菜单栏中的 File -> Save with Encoding。
2. 选择“UTF-8”编码保存文件。

### 确认文件内容
通过以下步骤重新确认文件的内容:

#### `index.html`
检查HTML文件的完整性和正确性,并包含正确的编码声明。

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8"> <!-- 确保使用UTF-8编码 -->
  5.     <title>贪吃蛇游戏</title>
  6.     <link rel="stylesheet" href="styles.css"> <!-- 引入CSS文件 -->
  7. </head>
  8. <body>
  9.     <h1>贪吃蛇游戏</h1>
  10.     <button id="startButton">开始游戏</button>
  11.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  12.     <div id="score">得分: 0</div>
  13.     <script src="snake_game.js"></script> <!-- 引入JavaScript文件 -->
  14. </body>
  15. </html>
复制代码


#### `styles.css`
确保CSS样式设置正确。

  1. /* 设置画布和页面的样式 */
  2. canvas {
  3.     background-color: #000; /* 黑色背景 */
  4.     display: block;        /* 画布作为块级元素 */
  5.     margin: 0 auto;        /* 居中对齐 */
  6. }

  7. /* 添加一些基本的页面样式 */
  8. body {
  9.     display: flex;
  10.     flex-direction: column;
  11.     align-items: center;
  12.     justify-content: center;
  13.     height: 100vh;
  14.     margin: 0;
  15. }

  16. h1 {
  17.     color: #333;
  18. }

  19. #startButton {
  20.     padding: 10px 20px;
  21.     font-size: 16px;
  22.     margin-bottom: 20px;
  23. }

  24. #score {
  25.     margin-top: 20px;
  26.     font-size: 20px;
  27.     color: #333;
  28. }
复制代码


#### `snake_game.js`
确保JavaScript代码也是从UTF-8编码保存,并且内容正确。

  1. // 获取画布并设置上下文
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');
  4. const startButton = document.getElementById('startButton');
  5. const scoreDisplay = document.getElementById('score');

  6. // 定义蛇的初始状态
  7. let snake = [{ x: 150, y: 150 }];
  8. let foodX;
  9. let foodY;
  10. let dx = 10;
  11. let dy = 0;
  12. let score = 0;
  13. let isGameRunning = false;

  14. // 创建游戏循环
  15. function main() {
  16.     if (isGameRunning) {
  17.         setTimeout(function onTick() {
  18.             clearCanvas();
  19.             moveSnake();
  20.             drawSnake();
  21.             drawFood();
  22.             checkGameOver();
  23.             main();
  24.         }, 100);
  25.     } else {
  26.         alert(`游戏结束!得分: ${score}`);
  27.     }
  28. }

  29. // 初始化游戏
  30. function startGame() {
  31.     snake = [{ x: 150, y: 150 }];
  32.     dx = 10;
  33.     dy = 0;
  34.     score = 0;
  35.     isGameRunning = true;
  36.     createFood();
  37.     scoreDisplay.innerText = `得分: ${score}`;
  38.     main();
  39. }

  40. // 清除画布
  41. function clearCanvas() {
  42.     ctx.fillStyle = "black";
  43.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  44. }

  45. // 绘制蛇
  46. function drawSnake() {
  47.     snake.forEach(snakePart => {
  48.         ctx.fillStyle = 'lightgreen';
  49.         ctx.strokestyle = 'darkgreen';
  50.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  51.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  52.     });
  53. }

  54. // 移动蛇
  55. function moveSnake() {
  56.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  57.     snake.unshift(head);
  58.     const didEatFood = snake[0].x === foodX && snake[0].y === foodY;
  59.     if (didEatFood) {
  60.         score += 10;
  61.         scoreDisplay.innerText = `得分: ${score}`;
  62.         createFood();
  63.     } else {
  64.         snake.pop();
  65.     }
  66. }

  67. // 随机生成食物位置
  68. function createFood() {
  69.     foodX = Math.floor((Math.random() * canvas.width) / 10) * 10;
  70.     foodY = Math.floor((Math.random() * canvas.height) / 10) * 10;

  71.     // 确保食物不会生成在蛇身体上
  72.     snake.forEach(snakePart => {
  73.         if (snakePart.x === foodX && snakePart.y === foodY) {
  74.             createFood();
  75.         }
  76.     });
  77. }

  78. // 绘制食物
  79. function drawFood() {
  80.     ctx.fillStyle = 'red';
  81.     ctx.strokestyle = 'darkred';
  82.     ctx.fillRect(foodX, foodY, 10, 10);
  83.     ctx.strokeRect(foodX, foodY, 10, 10);
  84. }

  85. // 检查游戏是否结束
  86. function checkGameOver() {
  87.     for (let i = 4; i < snake.length; i++) {
  88.         if (snake[0].x === snake[i].x && snake[0].y === snake[i].y) {
  89.             isGameRunning = false;
  90.         }
  91.     }

  92.     const hitLeftWall = snake[0].x < 0;
  93.     const hitRightWall = snake[0].x >= canvas.width;
  94.     const hitTopWall = snake[0].y < 0;
  95.     const hitBottomWall = snake[0].y >= canvas.height;

  96.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) {
  97.         isGameRunning = false;
  98.     }
  99. }

  100. // 更改方向
  101. document.addEventListener("keydown", changeDirection);

  102. function changeDirection(event) {
  103.     const LEFT_KEY = 37;
  104.     const RIGHT_KEY = 39;
  105.     const UP_KEY = 38;
  106.     const DOWN_KEY = 40;

  107.     const keyPressed = event.keyCode;
  108.     const goingUp = dy === -10;
  109.     const goingDown = dy === 10;
  110.     const goingRight = dx === 10;
  111.     const goingLeft = dx === -10;

  112.     if (keyPressed === LEFT_KEY && !goingRight) {
  113.         dx = -10;
  114.         dy = 0;
  115.     }

  116.     if (keyPressed === UP_KEY && !goingDown) {
  117.         dx = 0;
  118.         dy = -10;
  119.     }

  120.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  121.         dx = 10;
  122.         dy = 0;
  123.     }

  124.     if (keyPressed === DOWN_KEY && !goingUp) {
  125.         dx = 0;
  126.         dy = 10;
  127.     }
  128. }

  129. // 开始按钮点击事件
  130. startButton.addEventListener("click", startGame);
复制代码


确保所有文件都已保存,然后再在浏览器中打开`index.html`文件。如果你仍然遇到问题,可以尝试换一个浏览器或者清除浏览器缓存,再次测试。如果还有其他疑问,请继续告诉我!
作者: 林奕锦    时间: 2024-7-17 10:14
禁用UTF-8编码的选项在哪里?
作者: kaia    时间: 2024-7-17 10:15
林奕锦 发表于 2024-07-17 10:14
禁用UTF-8编码的选项在哪里?


字节序列的问题,UTF-8是一种非常普遍的字符编码,几乎所有现代浏览器都默认支持它。因此,一般来说不需要在浏览器中进行额外设置。但是,如果你在页面中添加了meta标签并且确保文件是以UTF-8编码保存的之后,仍然无法显示中文字符,那么可能会有以下几个原因:

1. **文件未实际被保存为UTF-8**:有时候,尽管你设置了编码,但文件管理器或编辑器没有实际地用UTF-8保存文件。

2. **缓存问题**:浏览器可能缓存了之前的文件内容,导致未采取最新的修改。可以尝试清除浏览器缓存或者在隐身模式下打开页面。

3. **其他编码声明干扰**:确保没有其他的编码声明与UTF-8冲突。

### 确保文件以UTF-8保存
在你使用的文本编辑器中,有多种方式确保文件是以UTF-8保存的。下面是一些常用编辑器的具体操作方法:

#### VS Code
1. 打开文件。
2. 在右下角查看当前文件的编码格式。如果不是UTF-8,可以点击编码格式。
3. 选择“Save with Encoding...”,然后选择“UTF-8”。

#### Sublime Text
1. 打开文件。
2. 点击菜单栏中的 `File -> Save with Encoding -> UTF-8`。

#### Notepad++
1. 打开文件。
2. 点击菜单栏中的 `Encoding -> Convert to UTF-8 (without BOM)`。

### 清除浏览器缓存
为了确保浏览器加载的是最新版本的文件,可以清除浏览器缓存。以下是几种常见浏览器的操作步骤:

#### Google Chrome
1. 打开浏览器设置。
2. 找到“隐私和安全”选项。
3. 点击“清除浏览数据”。
4. 选择“缓存的图片和文件”,然后点击“清除数据”。

#### Firefox
1. 打开浏览器设置。
2. 找到“隐私与安全”选项。
3. 在“Cookies 和站点数据”部分,点击“清除数据”。
4. 勾选“缓存的 Web 内容”,然后点击“清除”。

### 更新后的完整代码示例
确保以下三个文件内容正确,并保存为UTF-8编码:

#### `index.html`
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>贪吃蛇游戏</title>
  6.     <link rel="stylesheet" href="styles.css">
  7. </head>
  8. <body>
  9.     <h1>贪吃蛇游戏</h1>
  10.     <button id="startButton">开始游戏</button>
  11.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  12.     <div id="score">得分: 0</div>

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


#### `styles.css`
  1. /* 设置画布和页面的样式 */
  2. canvas {
  3.     background-color: #000; /* 黑色背景 */
  4.     display: block;        /* 画布作为块级元素 */
  5.     margin: 0 auto;        /* 居中对齐 */
  6. }

  7. /* 添加一些基本的页面样式 */
  8. body {
  9.     display: flex;
  10.     flex-direction: column;
  11.     align-items: center;
  12.     justify-content: center;
  13.     height: 100vh;
  14.     margin: 0;
  15. }

  16. h1 {
  17.     color: #333;
  18. }

  19. #startButton {
  20.     padding: 10px 20px;
  21.     font-size: 16px;
  22.     margin-bottom: 20px;
  23. }

  24. #score {
  25.     margin-top: 20px;
  26.     font-size: 20px;
  27.     color: #333;
  28. }
复制代码


#### `snake_game.js`
  1. // 获取画布并设置上下文
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');
  4. const startButton = document.getElementById('startButton');
  5. const scoreDisplay = document.getElementById('score');

  6. // 定义蛇的初始状态
  7. let snake = [{x: 200, y: 200}, {x: 190, y: 200}, {x: 180, y: 200}];
  8. let foodX;
  9. let foodY;
  10. let dx = 10;
  11. let dy = 0;
  12. let score = 0;
  13. let isGameRunning = false;

  14. // 创建游戏循环
  15. function main() {
  16.     if (isGameRunning) {
  17.         setTimeout(function onTick() {
  18.             clearCanvas();
  19.             moveSnake();
  20.             drawSnake();
  21.             drawFood();
  22.             checkGameOver();
  23.             main();
  24.         }, 100);
  25.     } else {
  26.         alert(`游戏结束!得分: ${score}`);
  27.     }
  28. }

  29. // 初始化游戏
  30. function startGame() {
  31.     snake = [{x: 200, y: 200}, {x: 190, y: 200}, {x: 180, y: 200}];
  32.     dx = 10;
  33.     dy = 0;
  34.     score = 0;
  35.     isGameRunning = true;
  36.     createFood();
  37.     scoreDisplay.innerText = `得分: ${score}`;
  38.     main();
  39. }

  40. // 清除画布
  41. function clearCanvas() {
  42.     ctx.fillStyle = "black";
  43.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  44. }

  45. // 绘制蛇
  46. function drawSnake() {
  47.     snake.forEach(snakePart => {
  48.         ctx.fillStyle = 'lightgreen';
  49.         ctx.strokestyle = 'darkgreen';
  50.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  51.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  52.     });
  53. }

  54. // 移动蛇
  55. function moveSnake() {
  56.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  57.     snake.unshift(head);
  58.     const didEatFood = snake[0].x === foodX && snake[0].y === foodY;
  59.     if (didEatFood) {
  60.         score += 10;
  61.         scoreDisplay.innerText = `得分: ${score}`;
  62.         createFood();
  63.     } else {
  64.         snake.pop();
  65.     }
  66. }

  67. // 随机生成食物位置
  68. function createFood() {
  69.     foodX = Math.floor((Math.random() * canvas.width) / 10) * 10;
  70.     foodY = Math.floor((Math.random() * canvas.height) / 10) * 10;

  71.     // 确保食物不会生成在蛇身体上
  72.     snake.forEach(snakePart => {
  73.         if (snakePart.x === foodX && snakePart.y === foodY) {
  74.             createFood();
  75.         }
  76.     });
  77. }

  78. // 绘制食物
  79. function drawFood() {
  80.     ctx.fillStyle = 'red';
  81.     ctx.strokestyle = 'darkred';
  82.     ctx.fillRect(foodX, foodY, 10, 10);
  83.     ctx.strokeRect(foodX, foodY, 10, 10);
  84. }

  85. // 检查游戏是否结束
  86. function checkGameOver() {
  87.     for (let i = 4; i < snake.length; i++) {
  88.         if (snake[0].x === snake[i].x && snake[0].y === snake[i].y) {
  89.             isGameRunning = false;
  90.         }
  91.     }

  92.     const hitLeftWall = snake[0].x < 0;
  93.     const hitRightWall = snake[0].x >= canvas.width;
  94.     const hitTopWall = snake[0].y < 0;
  95.     const hitBottomWall = snake[0].y >= canvas.height;

  96.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) {
  97.         isGameRunning = false;
  98.     }
  99. }

  100. // 更改方向
  101. document.addEventListener("keydown", changeDirection);

  102. function changeDirection(event) {
  103.     const LEFT_KEY = 37;
  104.     const RIGHT_KEY = 39;
  105.     const UP_KEY = 38;
  106.     const DOWN_KEY = 40;

  107.     const keyPressed = event.keyCode;
  108.     const goingUp = dy === -10;
  109.     const goingDown = dy === 10;
  110.     const goingRight = dx === 10;
  111.     const goingLeft = dx === -10;

  112.     if (keyPressed === LEFT_KEY && !goingRight) {
  113.         dx = -10;
  114.         dy = 0;
  115.     }

  116.     if (keyPressed === UP_KEY && !goingDown) {
  117.         dx = 0;
  118.         dy = -10;
  119.     }

  120.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  121.         dx = 10;
  122.         dy = 0;
  123.     }

  124.     if (keyPressed === DOWN_KEY && !goingUp) {
  125.         dx = 0;
  126.         dy = 10;
  127.     }
  128. }

  129. // 开始按钮点击事件
  130. startButton.addEventListener("click", startGame);
复制代码


将这三个文件放在同一文件夹中,然后在浏览器中打开`index.html`文件。如果你仍然遇到问题,可以尝试换一个浏览器或者清除浏览器缓存,再次测试。如果还有其他疑问,请继续告诉我!
作者: 林奕锦    时间: 2024-7-17 10:34
请帮我把游戏画布改为蓝色,该怎么改?
作者: kaia    时间: 2024-7-17 10:35
林奕锦 发表于 2024-07-17 10:34
请帮我把游戏画布改为蓝色,该怎么改? ...


好的!我们可以通过修改CSS文件中的样式来更改游戏画布的颜色。当前的画布背景色设置在`styles.css`文件中,通过调整相关属性,我们可以把画布背景色改为蓝色。

### 更新后的完整代码

#### `index.html`

以下是更新后的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="styles.css">
  8. </head>
  9. <body>
  10.     <h1>贪吃蛇游戏</h1>
  11.     <button id="startButton">开始游戏</button>
  12.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  13.     <div id="score">得分: 0</div>
  14.     <script src="snake_game.js"></script>
  15. </body>
  16. </html>
复制代码


#### `styles.css`

将画布的背景色改为蓝色,只需更新`styles.css`文件中的`canvas`样式:

  1. /* 设置画布和页面的样式 */
  2. canvas {
  3.     background-color: #0000FF; /* 蓝色背景 */
  4.     display: block;           /* 画布作为块级元素 */
  5.     margin: 0 auto;           /* 居中对齐 */
  6. }

  7. /* 添加一些基本的页面样式 */
  8. body {
  9.     display: flex;
  10.     flex-direction: column;
  11.     align-items: center;
  12.     justify-content: center;
  13.     height: 100vh;
  14.     margin: 0;
  15. }

  16. h1 {
  17.     color: #333;
  18. }

  19. #startButton {
  20.     padding: 10px 20px;
  21.     font-size: 16px;
  22.     margin-bottom: 20px;
  23. }

  24. #score {
  25.     margin-top: 20px;
  26.     font-size: 20px;
  27.     color: #333;
  28. }
复制代码


#### `snake_game.js`

JavaScript文件不需要修改,保持之前的内容即可。

  1. // 获取画布并设置上下文
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');
  4. const startButton = document.getElementById('startButton');
  5. const scoreDisplay = document.getElementById('score');

  6. // 定义蛇的初始状态
  7. let snake = [{ x: 50, y: 50 }];
  8. let foodX;
  9. let foodY;
  10. let dx = 10;
  11. let dy = 0;
  12. let score = 0;
  13. let isGameRunning = false;

  14. // 创建游戏循环
  15. function main() {
  16.     if (isGameRunning) {
  17.         setTimeout(function onTick() {
  18.             clearCanvas();
  19.             moveSnake();
  20.             drawSnake();
  21.             drawFood();
  22.             checkGameOver();
  23.             main();
  24.         }, 100);
  25.     } else {
  26.         alert(`游戏结束!得分: ${score}`);
  27.     }
  28. }

  29. // 初始化游戏
  30. function startGame() {
  31.     snake = [{ x: 50, y: 50 }];
  32.     dx = 10;
  33.     dy = 0;
  34.     score = 0;
  35.     isGameRunning = true;
  36.     createFood();
  37.     scoreDisplay.innerText = `得分: ${score}`;
  38.     main();
  39. }

  40. // 清除画布
  41. function clearCanvas() {
  42.     ctx.fillStyle = "black";
  43.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  44. }

  45. // 绘制蛇
  46. function drawSnake() {
  47.     snake.forEach(snakePart => {
  48.         ctx.fillStyle = 'lightgreen';
  49.         ctx.strokeStyle = 'darkgreen';
  50.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  51.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  52.     });
  53. }

  54. // 移动蛇
  55. function moveSnake() {
  56.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  57.     snake.unshift(head);
  58.     const didEatFood = snake[0].x === foodX && snake[0].y === foodY;
  59.     if (didEatFood) {
  60.         score += 10;
  61.         scoreDisplay.innerText = `得分: ${score}`;
  62.         createFood();
  63.     } else {
  64.         snake.pop();
  65.     }
  66. }

  67. // 随机生成食物位置
  68. function createFood() {
  69.     foodX = Math.floor((Math.random() * canvas.width / 10)) * 10;
  70.     foodY = Math.floor((Math.random() * canvas.height / 10)) * 10;

  71.     // 确保食物不会生成在蛇身体上
  72.     snake.forEach(snakePart => {
  73.         if (snakePart.x === foodX && snakePart.y === foodY) {
  74.             createFood();
  75.         }
  76.     });
  77. }

  78. // 绘制食物
  79. function drawFood() {
  80.     ctx.fillStyle = 'red';
  81.     ctx.strokeStyle = 'darkred';
  82.     ctx.fillRect(foodX, foodY, 10, 10);
  83.     ctx.strokeRect(foodX, foodY, 10, 10);
  84. }

  85. // 检查游戏是否结束
  86. function checkGameOver() {
  87.     for (let i = 4; i < snake.length; i++) {
  88.         const hasCollided = snake[i].x === snake[0].x && snake[i].y === snake[0].y;
  89.         if (hasCollided) {
  90.             isGameRunning = false;
  91.         }
  92.     }

  93.     const hitLeftWall = snake[0].x < 0;
  94.     const hitRightWall = snake[0].x >= canvas.width;
  95.     const hitTopWall = snake[0].y < 0;
  96.     const hitBottomWall = snake[0].y >= canvas.height;

  97.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) {
  98.         isGameRunning = false;
  99.     }
  100. }

  101. // 更改方向
  102. document.addEventListener("keydown", changeDirection);

  103. function changeDirection(event) {
  104.     const LEFT_KEY = 37;
  105.     const RIGHT_KEY = 39;
  106.     const UP_KEY = 38;
  107.     const DOWN_KEY = 40;

  108.     const keyPressed = event.keyCode;
  109.     const goingUp = dy === -10;
  110.     const goingDown = dy === 10;
  111.     const goingRight = dx === 10;
  112.     const goingLeft = dx === -10;

  113.     if (keyPressed === LEFT_KEY && !goingRight) {
  114.         dx = -10;
  115.         dy = 0;
  116.     }

  117.     if (keyPressed === UP_KEY && !goingDown) {
  118.         dx = 0;
  119.         dy = -10;
  120.     }

  121.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  122.         dx = 10;
  123.         dy = 0;
  124.     }

  125.     if (keyPressed === DOWN_KEY && !goingUp) {
  126.         dx = 0;
  127.         dy = 10;
  128.     }
  129. }

  130. // 开始按钮点击事件
  131. startButton.addEventListener("click", startGame);
复制代码


将这三个文件放在同一文件夹中,然后在浏览器中打开`index.html`文件,你就会看到蓝色背景的贪吃蛇游戏了。如果还有其他问题,请继续告诉我!
作者: 林奕锦    时间: 2024-7-17 10:38
如何将开始按钮调成蓝色
作者: kaia    时间: 2024-7-17 10:38
林奕锦 发表于 2024-07-17 10:38
如何将开始按钮调成蓝色


好的!我们可以通过修改CSS文件中的样式来更改“开始游戏”按钮的颜色。接下来,我会告诉你如何将按钮的背景色修改为蓝色,并根据需要提供其他样式的示例。

### 更新后的完整代码

#### `index.html`

以下是更新后的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="styles.css">
  8. </head>
  9. <body>
  10.     <h1>贪吃蛇游戏</h1>
  11.     <button id="startButton">开始游戏</button>
  12.     <div id="score">得分: 0</div>
  13.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  14.     <script src="snake_game.js"></script>
  15. </body>
  16. </html>
复制代码


#### `styles.css`

将按钮的背景色改为蓝色,同时进行一些样式优化:

  1. /* 设置画布和页面的样式 */
  2. canvas {
  3.     background-color: #000; /* 黑色背景 */
  4.     display: block;        /* 画布作为块级元素 */
  5.     margin: 0 auto;        /* 居中对齐 */
  6. }

  7. /* 添加一些基本的页面样式 */
  8. body {
  9.     display: flex;
  10.     flex-direction: column;
  11.     align-items: center;
  12.     justify-content: center;
  13.     height: 100vh;
  14.     margin: 0;
  15. }

  16. h1 {
  17.     color: #333;
  18. }

  19. #startButton {
  20.     padding: 10px 20px;
  21.     font-size: 16px;
  22.     margin-bottom: 20px;
  23.     background-color: #0000FF; /* 蓝色背景 */
  24.     color: white;              /* 文字颜色设为白色 */
  25.     border: none;               /* 无边框 */
  26.     border-radius: 5px;         /* 圆角 */
  27.     cursor: pointer;            /* 鼠标悬停时变成手势 */
  28. }

  29. #startButton:hover {
  30.     background-color: #0000cc; /* 鼠标悬停时背景颜色稍微变深 */
  31. }

  32. #score {
  33.     margin-top: 20px;
  34.     font-size: 20px;
  35.     color: #333;
  36. }
复制代码


#### `snake_game.js`

JavaScript文件不需要修改,保持之前的内容即可。

  1. // 获取画布并设置上下文
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');
  4. const startButton = document.getElementById('startButton');
  5. const scoreDisplay = document.getElementById('score');

  6. // 定义蛇的初始状态
  7. let snake = [{ x: 150, y: 150 }];
  8. let foodX;
  9. let foodY;
  10. let dx = 10;
  11. let dy = 0;
  12. let score = 0;
  13. let isGameRunning = false;

  14. // 创建游戏循环
  15. function main() {
  16.     if (isGameRunning) {
  17.         setTimeout(function onTick() {
  18.             clearCanvas();
  19.             moveSnake();
  20.             drawSnake();
  21.             drawFood();
  22.             checkGameOver();
  23.             main();
  24.         }, 100);
  25.     } else {
  26.         alert(`游戏结束!得分: ${score}`);
  27.     }
  28. }

  29. // 初始化游戏
  30. function startGame() {
  31.     snake = [{ x: 150, y: 150 }];
  32.     dx = 10;
  33.     dy = 0;
  34.     score = 0;
  35.     isGameRunning = true;
  36.     createFood();
  37.     scoreDisplay.innerText = `得分: ${score}`;
  38.     main();
  39. }

  40. // 清除画布
  41. function clearCanvas() {
  42.     ctx.fillStyle = "black";
  43.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  44. }

  45. // 绘制蛇
  46. function drawSnake() {
  47.     snake.forEach(snakePart => {
  48.         ctx.fillStyle = 'lightgreen';
  49.         ctx.strokeStyle = 'darkgreen';
  50.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  51.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  52.     });
  53. }

  54. // 移动蛇
  55. function moveSnake() {
  56.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  57.     snake.unshift(head);
  58.     const didEatFood = snake[0].x === foodX && snake[0].y === foodY;
  59.     if (didEatFood) {
  60.         score += 10;
  61.         scoreDisplay.innerText = `得分: ${score}`;
  62.         createFood();
  63.     } else {
  64.         snake.pop();
  65.     }
  66. }

  67. // 随机生成食物位置
  68. function createFood() {
  69.     foodX = Math.floor((Math.random() * canvas.width / 10)) * 10;
  70.     foodY = Math.floor((Math.random() * canvas.height / 10)) * 10;

  71.     // 确保食物不会生成在蛇身体上
  72.     snake.forEach(snakePart => {
  73.         if (snakePart.x === foodX && snakePart.y === foodY) {
  74.             createFood();
  75.         }
  76.     });
  77. }

  78. // 绘制食物
  79. function drawFood() {
  80.     ctx.fillStyle = 'red';
  81.     ctx.strokeStyle = 'darkred';
  82.     ctx.fillRect(foodX, foodY, 10, 10);
  83.     ctx.strokeRect(foodX, foodY, 10, 10);
  84. }

  85. // 检查游戏是否结束
  86. function checkGameOver() {
  87.     for (let i = 4; i < snake.length; i++) {
  88.         const hasCollided = snake[0].x === snake[i].x && snake[0].y === snake[i].y;
  89.         if (hasCollided) {
  90.             isGameRunning = false;
  91.         }
  92.     }

  93.     const hitLeftWall = snake[0].x < 0;
  94.     const hitRightWall = snake[0].x >= canvas.width;
  95.     const hitTopWall = snake[0].y < 0;
  96.     const hitBottomWall = snake[0].y >= canvas.height;

  97.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) {
  98.         isGameRunning = false;
  99.     }
  100. }

  101. // 更改方向
  102. document.addEventListener("keydown", changeDirection);

  103. function changeDirection(event) {
  104.     const LEFT_KEY = 37;
  105.     const RIGHT_KEY = 39;
  106.     const UP_KEY = 38;
  107.     const DOWN_KEY = 40;

  108.     const keyPressed = event.keyCode;
  109.     const goingUp = dy === -10;
  110.     const goingDown = dy === 10;
  111.     const goingRight = dx === 10;
  112.     const goingLeft = dx === -10;

  113.     if (keyPressed === LEFT_KEY && !goingRight) {
  114.         dx = -10;
  115.         dy = 0;
  116.     }

  117.     if (keyPressed === UP_KEY && !goingDown) {
  118.         dx = 0;
  119.         dy = -10;
  120.     }

  121.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  122.         dx = 10;
  123.         dy = 0;
  124.     }

  125.     if (keyPressed === DOWN_KEY && !goingUp) {
  126.         dx = 0;
  127.         dy = 10;
  128.     }
  129. }

  130. // 开始按钮点击事件
  131. startButton.addEventListener("click", startGame);
复制代码


将以上三个文件放在同一文件夹中,然后在浏览器中打开`index.html`文件,你就会看到蓝色背景的“开始游戏”按钮,以及正常运行的贪吃蛇游戏。如果还有其他问题,请继续告诉我!
作者: 林奕锦    时间: 2024-7-17 10:42
为什么蛇的速度会越来越快?
作者: kaia    时间: 2024-7-17 10:43
林奕锦 发表于 2024-07-17 10:42
为什么蛇的速度会越来越快?


蛇的速度在某些情况下会越来越快,可能是由于我们在每个游戏循环中重复设置了`setTimeout`,没有正常清除之前的计时器。为了确保蛇的速度保持一致,我们需要对游戏循环的控制进行一些调整。

下面是修复速度递增问题的解决方案:

### 完整的代码示例

#### `index.html`

确保你的HTML文件结构正确无误:

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>贪吃蛇游戏</title>
  6.     <link rel="stylesheet" href="styles.css">
  7. </head>
  8. <body>
  9.     <h1>贪吃蛇游戏</h1>
  10.     <button id="startButton">开始游戏</button>
  11.     <p id="score">得分: 0</p>
  12.     <canvas id="gameCanvas" width="400" height="400"></canvas>

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


#### `styles.css`

更新CSS样式:

  1. /* 设置画布和页面的样式 */
  2. canvas {
  3.     background-color: #0000FF; /* 蓝色背景 */
  4.     display: block;           /* 画布作为块级元素 */
  5.     margin: 0 auto;           /* 居中对齐 */
  6. }

  7. /* 添加一些基本的页面样式 */
  8. body {
  9.     display: flex;
  10.     flex-direction: column;
  11.     align-items: center;
  12.     justify-content: center;
  13.     height: 100vh;
  14.     margin: 0;
  15. }

  16. h1 {
  17.     color: #333;
  18. }

  19. #startButton {
  20.     padding: 10px 20px;
  21.     font-size: 16px;
  22.     margin-bottom: 20px;
  23.     background-color: #0000FF; /* 蓝色背景 */
  24.     color: white;              /* 文字颜色设为白色 */
  25.     border: none;              /* 无边框 */
  26.     border-radius: 5px;        /* 圆角 */
  27.     cursor: pointer;           /* 鼠标悬停时变成手势 */
  28. }

  29. #startButton:hover {
  30.     background-color: #0000cc; /* 鼠标悬停时背景颜色稍微变深 */
  31. }

  32. #score {
  33.     margin-top: 20px;
  34.     font-size: 20px;
  35.     color: #333;
  36. }
复制代码


#### `snake_game.js`

更新JavaScript文件,确保在每个游戏循环中只设置一个`setTimeout`:

  1. // 获取画布并设置上下文
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');
  4. const startButton = document.getElementById('startButton');
  5. const scoreDisplay = document.getElementById('score');

  6. // 定义初始状态
  7. let snake = [{x: 150, y: 150}]; // 初始蛇身
  8. let foodX;
  9. let foodY;
  10. let dx = 10;
  11. let dy = 0;
  12. let score = 0;
  13. let isGameRunning = false;
  14. let gameInterval;

  15. // 初始化游戏
  16. function startGame() {
  17.     snake = [{x: 150, y: 150}];
  18.     dx = 10;
  19.     dy = 0;
  20.     score = 0;
  21.     isGameRunning = true;
  22.     scoreDisplay.innerText = `得分: ${score}`;

  23.     createFood();
  24.     clearCanvas();
  25.     drawSnake();
  26.     drawFood();
  27.    
  28.     if (gameInterval) {
  29.         clearInterval(gameInterval);
  30.     }
  31.     gameInterval = setInterval(main, 100); // 使用 setInterval 代替 setTimeout
  32. }

  33. // 游戏主循环
  34. function main() {
  35.     if (isGameRunning) {
  36.         clearCanvas();
  37.         moveSnake();
  38.         drawSnake();
  39.         drawFood();
  40.         checkGameOver();
  41.     } else {
  42.         clearInterval(gameInterval);
  43.         alert(`游戏结束!得分: ${score}`);
  44.     }
  45. }

  46. // 清除画布
  47. function clearCanvas() {
  48.     ctx.fillStyle = "#0000FF"; // 即使画布已经是蓝色的,但为了以防万一,还是把背景颜色设置为蓝色
  49.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  50. }

  51. // 绘制蛇
  52. function drawSnake() {
  53.     snake.forEach(snakePart => {
  54.         ctx.fillStyle = 'lightgreen';
  55.         ctx.strokeStyle = 'darkgreen';
  56.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  57.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  58.     });
  59. }

  60. // 移动蛇
  61. function moveSnake() {
  62.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  63.     snake.unshift(head);
  64.     const didEatFood = snake[0].x === foodX && snake[0].y === foodY;
  65.     if (didEatFood) {
  66.         score += 10;
  67.         scoreDisplay.innerText = `得分: ${score}`;
  68.         createFood();
  69.     } else {
  70.         snake.pop();
  71.     }
  72. }

  73. // 随机生成食物位置
  74. function createFood() {
  75.     foodX = Math.floor(Math.random() * canvas.width / 10) * 10;
  76.     foodY = Math.floor(Math.random() * canvas.height / 10) * 10;

  77.     // 确保食物不会生成在蛇身体上
  78.     snake.forEach(function isFoodOnSnake(part) {
  79.         const foodIsOnSnake = part.x === foodX && part.y === foodY;
  80.         if (foodIsOnSnake) createFood();
  81.     });
  82. }

  83. // 绘制食物
  84. function drawFood() {
  85.     ctx.fillStyle = 'red';
  86.     ctx.strokeStyle = 'darkred';
  87.     ctx.fillRect(foodX, foodY, 10, 10);
  88.     ctx.strokeRect(foodX, foodY, 10, 10);
  89. }

  90. // 检查游戏是否结束
  91. function checkGameOver() {
  92.     for (let i = 4; i < snake.length; i++) {
  93.         const hasCollided = snake[i].x === snake[0].x && snake[i].y === snake[0].y;
  94.         if (hasCollided) isGameRunning = false;
  95.     }

  96.     const hitLeftWall = snake[0].x < 0;
  97.     const hitRightWall = snake[0].x >= canvas.width;
  98.     const hitTopWall = snake[0].y < 0;
  99.     const hitBottomWall = snake[0].y >= canvas.height;

  100.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) isGameRunning = false;
  101. }

  102. // 更改方向
  103. document.addEventListener("keydown", changeDirection);

  104. function changeDirection(event) {
  105.     const LEFT_KEY = 37;
  106.     const RIGHT_KEY = 39;
  107.     const UP_KEY = 38;
  108.     const DOWN_KEY = 40;

  109.     const keyPressed = event.keyCode;
  110.     const goingUp = dy === -10;
  111.     const goingDown = dy === 10;
  112.     const goingRight = dx === 10;
  113.     const goingLeft = dx === -10;

  114.     if (keyPressed === LEFT_KEY && !goingRight) {
  115.         dx = -10;
  116.         dy = 0;
  117.     }
  118.     if (keyPressed === UP_KEY && !goingDown) {
  119.         dx = 0;
  120.         dy = -10;
  121.     }
  122.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  123.         dx = 10;
  124.         dy = 0;
  125.     }
  126.     if (keyPressed === DOWN_KEY && !goingUp) {
  127.         dx = 0;
  128.         dy = 10;
  129.     }
  130. }

  131. // 开始按钮点击事件
  132. startButton.addEventListener("click", startGame);
复制代码


通过使用 `setInterval` 替换 `setTimeout`,并确保在启动新的循环之前停止已经存在的循环,我们可以确保蛇的速度保持一致,不会不断增加。你可以将以上三个文件放在同一文件夹中,然后在浏览器中打开 `index.html` 来测试游戏。如果还有其他问题,请继续告诉我!
作者: 林奕锦    时间: 2024-7-17 10:45
请帮我把代码中所有的中文改成英文
作者: kaia    时间: 2024-7-17 10:46
林奕锦 发表于 2024-07-17 10:45
请帮我把代码中所有的中文改成英文


好的!为了确保代码的可读性和一致性,我们可以将所有中文注释和文本替换为英文。以下是更新后的文件。

### 更新后的完整代码

#### `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>Snake Game</title>
  7.     <link rel="stylesheet" href="styles.css">
  8. </head>
  9. <body>
  10.     <h1>Snake Game</h1>
  11.     <button id="startButton">Start Game</button>
  12.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  13.     <p id="score">Score: 0</p>
  14.     <script src="snake_game.js"></script>
  15. </body>
  16. </html>
复制代码


#### `styles.css`

  1. /* Set canvas and page styles */
  2. canvas {
  3.     background-color: #0000FF; /* Blue background */
  4.     display: block;           /* Display canvas as block element */
  5.     margin: 0 auto;           /* Center align */
  6. }

  7. /* Add some basic page styles */
  8. body {
  9.     display: flex;
  10.     flex-direction: column;
  11.     align-items: center;
  12.     justify-content: center;
  13.     height: 100vh;
  14.     margin: 0;
  15. }

  16. h1 {
  17.     color: #333;
  18. }

  19. #startButton {
  20.     padding: 10px 20px;
  21.     font-size: 16px;
  22.     margin-bottom: 20px;
  23.     background-color: #0000FF; /* Blue background */
  24.     color: white;              /* Text color white */
  25.     border: none;              /* No border */
  26.     border-radius: 5px;        /* Rounded corners */
  27.     cursor: pointer;           /* Pointer cursor on hover */
  28. }

  29. #startButton:hover {
  30.     background-color: #0000cc; /* Darker blue on hover */
  31. }

  32. #score {
  33.     margin-top: 20px;
  34.     font-size: 20px;
  35.     color: #333;
  36. }
复制代码


#### `snake_game.js`

  1. // Get the canvas and set its context
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');
  4. const startButton = document.getElementById('startButton');
  5. const scoreDisplay = document.getElementById('score');

  6. // Define initial state
  7. let snake = [{ x: 200, y: 200 }]; // Initial snake body
  8. let foodX;
  9. let foodY;
  10. let dx = 10;
  11. let dy = 0;
  12. let score = 0;
  13. let isGameRunning = false;
  14. let gameInterval;

  15. // Initialize the game
  16. function startGame() {
  17.     snake = [{ x: 200, y: 200 }];
  18.     dx = 10;
  19.     dy = 0;
  20.     score = 0;
  21.     isGameRunning = true;
  22.     scoreDisplay.innerText = `Score: ${score}`;

  23.     createFood();
  24.     clearCanvas();
  25.     drawSnake();
  26.     drawFood();

  27.     if (gameInterval) {
  28.         clearInterval(gameInterval);
  29.     }
  30.     gameInterval = setInterval(main, 100); // Use setInterval instead of setTimeout
  31. }

  32. // Main game loop
  33. function main() {
  34.     if (isGameRunning) {
  35.         clearCanvas();
  36.         moveSnake();
  37.         drawSnake();
  38.         drawFood();
  39.         checkGameOver();
  40.     } else {
  41.         clearInterval(gameInterval);
  42.         alert(`Game Over! Score: ${score}`);
  43.     }
  44. }

  45. // Clear the canvas
  46. function clearCanvas() {
  47.     ctx.fillStyle = "#0000FF"; // Ensure canvas background is blue
  48.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  49. }

  50. // Draw the snake
  51. function drawSnake() {
  52.     snake.forEach(snakePart => {
  53.         ctx.fillStyle = 'lightgreen';
  54.         ctx.strokeStyle = 'darkgreen';
  55.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  56.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  57.     });
  58. }

  59. // Move the snake
  60. function moveSnake() {
  61.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  62.     snake.unshift(head);
  63.     const didEatFood = head.x === foodX && head.y === foodY;
  64.     if (didEatFood) {
  65.         score += 10;
  66.         scoreDisplay.innerText = `Score: ${score}`;
  67.         createFood();
  68.     } else {
  69.         snake.pop();
  70.     }
  71. }

  72. // Randomly generate food position
  73. function createFood() {
  74.     foodX = Math.floor(Math.random() * canvas.width / 10) * 10;
  75.     foodY = Math.floor(Math.random() * canvas.height / 10) * 10;

  76.     // Ensure food does not appear on the snake
  77.     snake.forEach(function isFoodOnSnake(part) {
  78.         const foodIsOnSnake = part.x === foodX && part.y === foodY;
  79.         if (foodIsOnSnake) createFood();
  80.     });
  81. }

  82. // Draw the food
  83. function drawFood() {
  84.     ctx.fillStyle = 'red';
  85.     ctx.strokeStyle = 'darkred';
  86.     ctx.fillRect(foodX, foodY, 10, 10);
  87.     ctx.strokeRect(foodX, foodY, 10, 10);
  88. }

  89. // Check if the game is over
  90. function checkGameOver() {
  91.     for (let i = 4; i < snake.length; i++) {
  92.         const hasCollided = snake[i].x === snake[0].x && snake[i].y === snake[0].y;
  93.         if (hasCollided) isGameRunning = false;
  94.     }

  95.     const hitLeftWall = snake[0].x < 0;
  96.     const hitRightWall = snake[0].x >= canvas.width;
  97.     const hitTopWall = snake[0].y < 0;
  98.     const hitBottomWall = snake[0].y >= canvas.height;

  99.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) isGameRunning = false;
  100. }

  101. // Change direction
  102. document.addEventListener('keydown', changeDirection);

  103. function changeDirection(event) {
  104.     const LEFT_KEY = 37;
  105.     const RIGHT_KEY = 39;
  106.     const UP_KEY = 38;
  107.     const DOWN_KEY = 40;

  108.     const keyPressed = event.keyCode;
  109.     const goingUp = dy === -10;
  110.     const goingDown = dy === 10;
  111.     const goingRight = dx === 10;
  112.     const goingLeft = dx === -10;

  113.     if (keyPressed === LEFT_KEY && !goingRight) {
  114.         dx = -10;
  115.         dy = 0;
  116.     }
  117.     if (keyPressed === UP_KEY && !goingDown) {
  118.         dx = 0;
  119.         dy = -10;
  120.     }
  121.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  122.         dx = 10;
  123.         dy = 0;
  124.     }
  125.     if (keyPressed === DOWN_KEY && !goingUp) {
  126.         dx = 0;
  127.         dy = 10;
  128.     }
  129. }

  130. // Start button click event
  131. startButton.addEventListener('click', startGame);
复制代码


将以上三个文件放在同一文件夹中,然后在浏览器中打开`index.html`文件,你就会看到英文版的贪吃蛇游戏。如果还有其他问题,请继续告诉我!
作者: 林奕锦    时间: 2024-7-17 11:02
请帮我将背景改为图片背景
作者: kaia    时间: 2024-7-17 11:03
林奕锦 发表于 2024-07-17 11:02
请帮我将背景改为图片背景


好的!我们可以将游戏画布和整个网页的背景修改为图片背景。我们将通过CSS来实现这一目标。假设我们有一张图片文件,名为`background.jpg`,我们将其设置为背景。

### 更新后的完整代码

#### `index.html`

确保你的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>Snake Game</title>
  7.     <link rel="stylesheet" href="styles.css">
  8. </head>
  9. <body>
  10.     <h1>Snake Game</h1>
  11.     <button id="startButton">Start Game</button>
  12.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  13.     <div id="score">Score: 0</div>
  14.     <script src="snake_game.js"></script>
  15. </body>
  16. </html>
复制代码


#### `styles.css`

在CSS文件中,我们将设置背景图片,并对画布添加样式以确保其背景透明,能够显示出背景图片。

  1. /* Set canvas and page styles */
  2. body {
  3.     display: flex;
  4.     flex-direction: column;
  5.     align-items: center;
  6.     justify-content: center;
  7.     height: 100vh;
  8.     margin: 0;
  9.     background: url('background.jpg') no-repeat center center fixed; /* Background image */
  10.     background-size: cover; /* Ensure the background covers the entire page */
  11. }

  12. h1 {
  13.     color: #ffffff; /* White text color for better contrast */
  14. }

  15. #startButton {
  16.     padding: 10px 20px;
  17.     font-size: 16px;
  18.     margin-bottom: 20px;
  19.     background-color: #0000FF; /* Blue background */
  20.     color: white;              /* Text color white */
  21.     border: none;              /* No border */
  22.     border-radius: 5px;        /* Rounded corners */
  23.     cursor: pointer;           /* Pointer cursor on hover */
  24. }

  25. #startButton:hover {
  26.     background-color: #0000cc; /* Darker blue on hover */
  27. }

  28. #gameCanvas {
  29.     background-color: transparent; /* Transparent background to show the image behind */
  30. }

  31. #score {
  32.     margin-top: 20px;
  33.     font-size: 20px;
  34.     color: #ffffff; /* White text color for better contrast */
  35. }
复制代码


#### `snake_game.js`

JavaScript代码无需修改,保持之前的内容即可。

  1. // Get the canvas and set its context
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');
  4. const startButton = document.getElementById('startButton');
  5. const scoreDisplay = document.getElementById('score');

  6. // Define initial state
  7. let snake = [{ x: 200, y: 200 }]; // Initial snake body
  8. let foodX;
  9. let foodY;
  10. let dx = 10;
  11. let dy = 0;
  12. let score = 0;
  13. let isGameRunning = false;
  14. let gameInterval;

  15. // Initialize the game
  16. function startGame() {
  17.     snake = [{ x: 200, y: 200 }];
  18.     dx = 10;
  19.     dy = 0;
  20.     score = 0;
  21.     isGameRunning = true;
  22.     scoreDisplay.innerText = `Score: ${score}`;

  23.     createFood();
  24.     clearCanvas();
  25.     drawSnake();
  26.     drawFood();

  27.     if (gameInterval) {
  28.         clearInterval(gameInterval);
  29.     }
  30.     gameInterval = setInterval(main, 100); // Use setInterval instead of setTimeout
  31. }

  32. // Main game loop
  33. function main() {
  34.     if (isGameRunning) {
  35.         clearCanvas();
  36.         moveSnake();
  37.         drawSnake();
  38.         drawFood();
  39.         checkGameOver();
  40.     } else {
  41.         clearInterval(gameInterval);
  42.         alert(`Game Over! Score: ${score}`);
  43.     }
  44. }

  45. // Clear the canvas
  46. function clearCanvas() {
  47.     ctx.clearRect(0, 0, canvas.width, canvas.height); // Clear the canvas completely
  48. }

  49. // Draw the snake
  50. function drawSnake() {
  51.     snake.forEach(snakePart => {
  52.         ctx.fillStyle = 'lightgreen';
  53.         ctx.strokeStyle = 'darkgreen';
  54.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  55.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  56.     });
  57. }

  58. // Move the snake
  59. function moveSnake() {
  60.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  61.     snake.unshift(head);
  62.     const didEatFood = head.x === foodX && head.y === foodY;
  63.     if (didEatFood) {
  64.         score += 10;
  65.         scoreDisplay.innerText = `Score: ${score}`;
  66.         createFood();
  67.     } else {
  68.         snake.pop();
  69.     }
  70. }

  71. // Randomly generate food position
  72. function createFood() {
  73.     foodX = Math.floor(Math.random() * (canvas.width / 10)) * 10;
  74.     foodY = Math.floor(Math.random() * (canvas.height / 10)) * 10;

  75.     // Ensure food does not appear on the snake
  76.     snake.forEach(function isFoodOnSnake(part) {
  77.         const foodIsOnSnake = part.x === foodX && part.y === foodY;
  78.         if (foodIsOnSnake) createFood();
  79.     });
  80. }

  81. // Draw the food
  82. function drawFood() {
  83.     ctx.fillStyle = 'red';
  84.     ctx.strokeStyle = 'darkred';
  85.     ctx.fillRect(foodX, foodY, 10, 10);
  86.     ctx.strokeRect(foodX, foodY, 10, 10);
  87. }

  88. // Check if the game is over
  89. function checkGameOver() {
  90.     for (let i = 4; i < snake.length; i++) {
  91.         const hasCollided = snake[0].x === snake[i].x && snake[0].y === snake[i].y;
  92.         if (hasCollided) isGameRunning = false;
  93.     }

  94.     const hitLeftWall = snake[0].x < 0;
  95.     const hitRightWall = snake[0].x >= canvas.width;
  96.     const hitTopWall = snake[0].y < 0;
  97.     const hitBottomWall = snake[0].y >= canvas.height;

  98.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) isGameRunning = false;
  99. }

  100. // Change direction
  101. document.addEventListener('keydown', changeDirection);

  102. function changeDirection(event) {
  103.     const LEFT_KEY = 37;
  104.     const RIGHT_KEY = 39;
  105.     const UP_KEY = 38;
  106.     const DOWN_KEY = 40;

  107.     const keyPressed = event.keyCode;
  108.     const goingUp = dy === -10;
  109.     const goingDown = dy === 10;
  110.     const goingRight = dx === 10;
  111.     const goingLeft = dx === -10;

  112.     if (keyPressed === LEFT_KEY && !goingRight) {
  113.         dx = -10;
  114.         dy = 0;
  115.     }
  116.     if (keyPressed === UP_KEY && !goingDown) {
  117.         dx = 0;
  118.         dy = -10;
  119.     }
  120.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  121.         dx = 10;
  122.         dy = 0;
  123.     }
  124.     if (keyPressed === DOWN_KEY && !goingUp) {
  125.         dx = 0;
  126.         dy = 10;
  127.     }
  128. }

  129. // Start button click event
  130. startButton.addEventListener('click', startGame);
复制代码


### 总结

将 `background.jpg` 图片放在与这三个文件相同的目录下,然后在浏览器中打开 `index.html` 文件,你就会看到带有图片背景的贪吃蛇游戏。如果你有任何其他问题或进一步需求,请继续告诉我!
作者: 林奕锦    时间: 2024-7-17 11:22
请将画布改为透明背景
作者: kaia    时间: 2024-7-17 11:22
林奕锦 发表于 2024-07-17 11:22
请将画布改为透明背景


好的,将画布改为透明背景可以使其与背景图片更好地融合。我们只需要调整CSS和JavaScript代码中的一些内容,确保画布的背景是透明的。

### 更新后的完整代码

#### `index.html`

以下是更新后的HTML文件内容:



   
   
    Snake Game
   



    Snake Game
    Start Game
   
    Score: 0
   
   

   


#### `styles.css`

在CSS中,我们将设置画布的背景为透明,并对整个网页设置背景图片:

  1. /* Set canvas and page styles */
  2. body {
  3.     display: flex;
  4.     flex-direction: column;
  5.     align-items: center;
  6.     justify-content: center;
  7.     height: 100vh;
  8.     margin: 0;
  9.     background: url('background.jpg') no-repeat center center fixed; /* Background image */
  10.     background-size: cover; /* Ensure the background covers the entire page */
  11. }

  12. h1 {
  13.     color: #ffffff; /* White text color for better contrast */
  14. }

  15. #startButton {
  16.     padding: 10px 20px;
  17.     font-size: 16px;
  18.     margin-bottom: 20px;
  19.     background-color: #0000FF; /* Blue background */
  20.     color: white;              /* Text color white */
  21.     border: none;              /* No border */
  22.     border-radius: 5px;        /* Rounded corners */
  23.     cursor: pointer;           /* Pointer cursor on hover */
  24. }

  25. #startButton:hover {
  26.     background-color: #0000cc; /* Darker blue on hover */
  27. }

  28. #gameCanvas {
  29.     background-color: transparent; /* Transparent background to show the image behind */
  30. }

  31. #score {
  32.     margin-top: 20px;
  33.     font-size: 20px;
  34.     color: #ffffff; /* White text color for better contrast */
  35. }
复制代码


#### `snake_game.js`

在JavaScript文件中,我们确保清除画布时不覆盖背景:

  1. // Get the canvas and set its context
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');
  4. const startButton = document.getElementById('startButton');
  5. const scoreDisplay = document.getElementById('score');

  6. // Define initial state
  7. let snake = [{ x: 150, y: 150 }, { x: 140, y: 150 }, { x: 130, y: 150 }, { x: 120, y: 150 }, { x: 110, y: 150 }];
  8. let foodX;
  9. let foodY;
  10. let dx = 10;
  11. let dy = 0;
  12. let score = 0;
  13. let isGameRunning = false;
  14. let gameInterval;

  15. // Initialize the game
  16. function startGame() {
  17.     snake = [{ x: 150, y: 150 }, { x: 140, y: 150 }, { x: 130, y: 150 }, { x: 120, y: 150 }, { x: 110, y: 150 }];
  18.     dx = 10;
  19.     dy = 0;
  20.     score = 0;
  21.     isGameRunning = true;
  22.     scoreDisplay.innerText = `Score: ${score}`;

  23.     createFood();
  24.     clearCanvas();
  25.     drawSnake();
  26.     drawFood();

  27.     if (gameInterval) {
  28.         clearInterval(gameInterval);
  29.     }
  30.     gameInterval = setInterval(main, 100); // Use setInterval instead of setTimeout
  31. }

  32. // Main game loop
  33. function main() {
  34.     if (isGameRunning) {
  35.         clearCanvas();
  36.         moveSnake();
  37.         drawSnake();
  38.         drawFood();
  39.         checkGameOver();
  40.     } else {
  41.         clearInterval(gameInterval);
  42.         alert(`Game Over! Score: ${score}`);
  43.     }
  44. }

  45. // Clear the canvas
  46. function clearCanvas() {
  47.     ctx.clearRect(0, 0, canvas.width, canvas.height); // Clear the canvas completely
  48. }

  49. // Draw the snake
  50. function drawSnake() {
  51.     snake.forEach(snakePart => {
  52.         ctx.fillStyle = 'lightgreen';
  53.         ctx.strokeStyle = 'darkgreen';
  54.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  55.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  56.     });
  57. }

  58. // Move the snake
  59. function moveSnake() {
  60.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  61.     snake.unshift(head);
  62.     const didEatFood = head.x === foodX && head.y === foodY;
  63.     if (didEatFood) {
  64.         score += 10;
  65.         scoreDisplay.innerText = `Score: ${score}`;
  66.         createFood();
  67.     } else {
  68.         snake.pop();
  69.     }
  70. }

  71. // Randomly generate food position
  72. function createFood() {
  73.     foodX = Math.floor(Math.random() * (canvas.width / 10)) * 10;
  74.     foodY = Math.floor(Math.random() * (canvas.height / 10)) * 10;

  75.     // Ensure food does not appear on the snake
  76.     snake.forEach(function isFoodOnSnake(part) {
  77.         const foodIsOnSnake = part.x === foodX && part.y === foodY;
  78.         if (foodIsOnSnake) createFood();
  79.     });
  80. }

  81. // Draw the food
  82. function drawFood() {
  83.     ctx.fillStyle = 'red';
  84.     ctx.strokeStyle = 'darkred';
  85.     ctx.fillRect(foodX, foodY, 10, 10);
  86.     ctx.strokeRect(foodX, foodY, 10, 10);
  87. }

  88. // Check if the game is over
  89. function checkGameOver() {
  90.     for (let i = 4; i < snake.length; i++) {
  91.         const hasCollided = snake[i].x === snake[0].x && snake[i].y === snake[0].y;
  92.         if (hasCollided) isGameRunning = false;
  93.     }

  94.     const hitLeftWall = snake[0].x < 0;
  95.     const hitRightWall = snake[0].x >= canvas.width;
  96.     const hitTopWall = snake[0].y < 0;
  97.     const hitBottomWall = snake[0].y >= canvas.height;

  98.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) isGameRunning = false;
  99. }

  100. // Change direction
  101. document.addEventListener('keydown', changeDirection);

  102. function changeDirection(event) {
  103.     const LEFT_KEY = 37;
  104.     const RIGHT_KEY = 39;
  105.     const UP_KEY = 38;
  106.     const DOWN_KEY = 40;

  107.     const keyPressed = event.keyCode;
  108.     const goingUp = dy === -10;
  109.     const goingDown = dy === 10;
  110.     const goingRight = dx === 10;
  111.     const goingLeft = dx === -10;

  112.     if (keyPressed === LEFT_KEY && !goingRight) {
  113.         dx = -10;
  114.         dy = 0;
  115.     }
  116.     if (keyPressed === UP_KEY && !goingDown) {
  117.         dx = 0;
  118.         dy = -10;
  119.     }
  120.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  121.         dx = 10;
  122.         dy = 0;
  123.     }
  124.     if (keyPressed === DOWN_KEY && !goingUp) {
  125.         dx = 0;
  126.         dy = 10;
  127.     }
  128. }

  129. // Start button click event
  130. startButton.addEventListener('click', startGame);
复制代码


### 总结

将 `background.jpg` 图片放在与这三个文件相同的目录下,然后在浏览器中打开 `index.html` 文件,你就会看到带有图片背景的贪吃蛇游戏,画布背景将是透明的,使其与背景图片更好地融合。如果你有任何其他问题或进一步需求,请继续告诉我!
作者: 林奕锦    时间: 2024-7-17 11:31
请帮我把背景图片改小一点
作者: 林奕锦    时间: 2024-7-17 11:31
请帮我把游戏边界绘制出来
作者: 林奕锦    时间: 2024-7-17 11:37
请帮我把游戏边界显示出来,并告诉我修改位置
作者: 林奕锦    时间: 2024-7-17 11:48
请帮我把画布改为白色
作者: 林奕锦    时间: 2024-7-18 12:43
在C++中显示 [错误] bits/stdc++.h: No such file or directory 是怎么回事?
作者: 林奕锦    时间: 2024-7-19 13:07
kaia 发表于 2024-7-17 10:46
好的!为了确保代码的可读性和一致性,我们可以将所有中文注释和文本替换为英文。以下是更新后的文件。

...

请帮我将注释改为中文
作者: kaia    时间: 2024-7-19 13:08
林奕锦 发表于 2024-07-19 13:07
请帮我将注释改为中文


好的,我会将注释翻译回中文,请查阅以下更新后的代码:

### `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.     <link rel="stylesheet" href="styles.css">
  8. </head>
  9. <body>
  10.     <h1>贪吃蛇游戏</h1>
  11.     <button id="startButton">开始游戏</button>
  12.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  13.     <div id="score">得分: 0</div>

  14.     <script src="snake_game.js"></script>
  15. </body>
  16. </html>
复制代码


### `styles.css`
  1. /* 设置画布和页面样式 */
  2. canvas {
  3.     background-color: #0000FF; /* 蓝色背景 */
  4.     display: block;           /* 将画布显示为块状元素 */
  5.     margin: 0 auto;           /* 居中对齐 */
  6. }

  7. /* 添加基本页面样式 */
  8. body {
  9.     display: flex;
  10.     flex-direction: column;
  11.     align-items: center;
  12.     justify-content: center;
  13.     height: 100vh;
  14.     margin: 0;
  15. }

  16. h1 {
  17.     color: #333;
  18. }

  19. #startButton {
  20.     padding: 10px 20px;
  21.     font-size: 16px;
  22.     margin-bottom: 20px;
  23.     background-color: #0000FF; /* 蓝色背景 */
  24.     color: white;              /* 白色文字 */
  25.     border: none;              /* 无边框 */
  26.     border-radius: 5px;        /* 圆角边框 */
  27.     cursor: pointer;           /* 鼠标悬停变成指针 */
  28. }

  29. #startButton:hover {
  30.     background-color: #0000cc; /* 鼠标悬停时颜色变深 */
  31. }

  32. #score {
  33.     margin-top: 20px;
  34.     font-size: 20px;
  35.     color: #333;
  36. }
复制代码


### `snake_game.js`
  1. // 获取画布并设置上下文
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');
  4. const startButton = document.getElementById('startButton');
  5. const scoreDisplay = document.getElementById('score');

  6. // 定义初始状态
  7. let snake = []; // 初始的蛇身体
  8. let foodX;
  9. let foodY;
  10. let dx = 10;
  11. let dy = 0;
  12. let score = 0;
  13. let isGameRunning = false;
  14. let gameInterval;

  15. // 初始化游戏
  16. function startGame() {
  17.     snake = [{x: 150, y: 150}];
  18.     dx = 10;
  19.     dy = 0;
  20.     score = 0;
  21.     isGameRunning = true;
  22.     scoreDisplay.innerText = `得分: ${score}`;

  23.     createFood();
  24.     clearCanvas();
  25.     drawSnake();
  26.     drawFood();

  27.     if (gameInterval) {
  28.         clearInterval(gameInterval);
  29.     }
  30.     gameInterval = setInterval(main, 100); // 使用setInterval代替setTimeout
  31. }

  32. // 游戏主循环
  33. function main() {
  34.     if (isGameRunning) {
  35.         clearCanvas();
  36.         moveSnake();
  37.         drawSnake();
  38.         drawFood();
  39.         checkGameOver();
  40.     } else {
  41.         clearInterval(gameInterval);
  42.         alert(`游戏结束!得分: ${score}`);
  43.     }
  44. }

  45. // 清除画布
  46. function clearCanvas() {
  47.     ctx.fillStyle = "#0000FF"; // 确保画布背景是蓝色
  48.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  49. }

  50. // 绘制蛇
  51. function drawSnake() {
  52.     snake.forEach(snakePart => {
  53.         ctx.fillStyle = 'lightgreen';
  54.         ctx.strokeStyle = 'darkgreen';
  55.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  56.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  57.     });
  58. }

  59. // 移动蛇
  60. function moveSnake() {
  61.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  62.     snake.unshift(head);
  63.     const didEatFood = head.x === foodX && head.y === foodY;
  64.     if (didEatFood) {
  65.         score += 10;
  66.         scoreDisplay.innerText = `得分: ${score}`;
  67.         createFood();
  68.     } else {
  69.         snake.pop();
  70.     }
  71. }

  72. // 随机生成食物位置
  73. function createFood() {
  74.     foodX = Math.floor(Math.random() * canvas.width / 10) * 10;
  75.     foodY = Math.floor(Math.random() * canvas.height / 10) * 10;

  76.     // 确保食物不会出现在蛇身上
  77.     snake.forEach(function isFoodOnSnake(part) {
  78.         const foodIsOnSnake = part.x === foodX && part.y === foodY;
  79.         if (foodIsOnSnake) createFood();
  80.     });
  81. }

  82. // 绘制食物
  83. function drawFood() {
  84.     ctx.fillStyle = 'red';
  85.     ctx.strokeStyle = 'darkred';
  86.     ctx.fillRect(foodX, foodY, 10, 10);
  87.     ctx.strokeRect(foodX, foodY, 10, 10);
  88. }

  89. // 检查游戏是否结束
  90. function checkGameOver() {
  91.     for (let i = 4; i < snake.length; i++) {
  92.         const hasCollided = snake[i].x === snake[0].x && snake[i].y === snake[0].y;
  93.         if (hasCollided) isGameRunning = false;
  94.     }

  95.     const hitLeftWall = snake[0].x < 0;
  96.     const hitRightWall = snake[0].x >= canvas.width;
  97.     const hitTopWall = snake[0].y < 0;
  98.     const hitBottomWall = snake[0].y >= canvas.height;

  99.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) isGameRunning = false;
  100. }

  101. // 改变方向
  102. document.addEventListener('keydown', changeDirection);

  103. function changeDirection(event) {
  104.     const LEFT_KEY = 37;
  105.     const RIGHT_KEY = 39;
  106.     const UP_KEY = 38;
  107.     const DOWN_KEY = 40;

  108.     const keyPressed = event.keyCode;
  109.     const goingUp = dy === -10;
  110.     const goingDown = dy === 10;
  111.     const goingRight = dx === 10;
  112.     const goingLeft = dx === -10;

  113.     if (keyPressed === LEFT_KEY && !goingRight) {
  114.         dx = -10;
  115.         dy = 0;
  116.     }
  117.     if (keyPressed === UP_KEY && !goingDown) {
  118.         dx = 0;
  119.         dy = -10;
  120.     }
  121.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  122.         dx = 10;
  123.         dy = 0;
  124.     }
  125.     if (keyPressed === DOWN_KEY && !goingUp) {
  126.         dx = 0;
  127.         dy = 10;
  128.     }
  129. }

  130. // 开始按钮点击事件
  131. startButton.addEventListener('click', startGame);
复制代码


将以上三个文件放在同一文件夹中,然后在浏览器中打开`index.html`文件,你就可以看到包含中文注释的贪吃蛇游戏了。如果有其他问题,请随时告诉我!
作者: 林奕锦    时间: 2024-7-19 13:10
请帮我将网页文本改为英文
作者: 林奕锦    时间: 2024-7-21 09:43
我想将画布改为浅蓝色,该怎么做? background-color: #0000FF
作者: 林奕锦    时间: 2024-7-21 09:52
kaia 发表于 2024-7-19 13:08
好的,我会将注释翻译回中文,请查阅以下更新后的代码:

### `index.html`

我想在CSS文件将画布改为浅蓝色,可以怎样改
作者: kaia    时间: 2024-7-21 09:52
林奕锦 发表于 2024-07-21 09:52
我想在CSS文件将画布改为浅蓝色,可以怎样改 ...


可以的!你只需要在CSS文件中修改`canvas`元素的背景颜色即可。我们将背景颜色改为浅蓝色(例如#ADD8E6),以下是更新后的`styles.css`文件:

### `styles.css`

  1. /* 设置画布和页面样式 */
  2. canvas {
  3.     background-color: #ADD8E6; /* 浅蓝色背景 */
  4.     display: block;           /* 将画布显示为块状元素 */
  5.     margin: 0 auto;           /* 居中对齐 */
  6. }

  7. /* 添加基本页面样式 */
  8. body {
  9.     display: flex;
  10.     flex-direction: column;
  11.     align-items: center;
  12.     justify-content: center;
  13.     height: 100vh;
  14.     margin: 0;
  15. }

  16. h1 {
  17.     color: #333;
  18. }

  19. #startButton {
  20.     padding: 10px 20px;
  21.     font-size: 16px;
  22.     margin-bottom: 20px;
  23.     background-color: #0000FF; /* 蓝色背景 */
  24.     color: white;              /* 白色文字 */
  25.     border: none;              /* 无边框 */
  26.     border-radius: 5px;        /* 圆角边框 */
  27.     cursor: pointer;           /* 鼠标悬停变成指针 */
  28. }

  29. #startButton:hover {
  30.     background-color: #0000cc; /* 鼠标悬停时颜色变深 */
  31. }

  32. #score {
  33.     margin-top: 20px;
  34.     font-size: 20px;
  35.     color: #333;
  36. }
复制代码


你只需要把原来的 CSS 文件中的 `canvas` 样式部分替换成上面的代码,即可将画布的背景颜色更改为浅蓝色。如果有任何其他问题,欢迎继续提问!
作者: 林奕锦    时间: 2024-7-21 09:59
kaia 发表于 2024-7-21 09:52
可以的!你只需要在CSS文件中修改`canvas`元素的背景颜色即可。我们将背景颜色改为浅蓝色(例如#ADD8E6) ...

我想将得分文本颜色改为金色,该怎么做?
作者: 林奕锦    时间: 2024-7-21 10:33
kaia 发表于 2024-7-21 09:52
可以的!你只需要在CSS文件中修改`canvas`元素的背景颜色即可。我们将背景颜色改为浅蓝色(例如#ADD8E6) ...

我想将结束游戏的界面更加生动,该如何修改?
作者: kaia    时间: 2024-7-21 10:33
林奕锦 发表于 2024-07-21 10:33
我想将结束游戏的界面更加生动,该如何修改? ...


当然可以!为了让游戏结束界面更加生动,我们可以添加一些动画效果和更具吸引力的文本显示。以下是一个示例,其中包含了更多的CSS样式和JavaScript来实现这一效果。

### 1. 修改HTML文件
我们需要为游戏结束界面添加一个隐藏的元素,用于显示结束信息。更新后的HTML如下:

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>贪吃蛇游戏</title>
  6.     <link rel="stylesheet" href="styles.css">
  7. </head>
  8. <body>
  9.     <h1>贪吃蛇游戏</h1>
  10.     <button id="startButton">开始游戏</button>
  11.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  12.     <div id="gameOver" class="hidden">
  13.         <h2>游戏结束!</h2>
  14.         <p>得分: <span id="finalScore"></span></p>
  15.         <button id="restartButton">重新开始</button>
  16.     </div>
  17.     <script src="snake_game.js"></script>
  18. </body>
  19. </html>
复制代码


### 2. 修改CSS文件
更新CSS文件,以添加结束游戏界面的样式和动画效果:

  1. /* 样式之前已设置 */
  2. canvas {
  3.     background-color: #ADD8E6; /* 浅蓝色背景 */
  4.     display: block;
  5.     margin: 0 auto;
  6. }

  7. /* 添加基本页面样式 */
  8. body {
  9.     display: flex;
  10.     flex-direction: column;
  11.     align-items: center;
  12.     justify-content: center;
  13.     height: 100vh;
  14.     margin: 0;
  15. }

  16. h1 {
  17.     color: #333;
  18. }

  19. #startButton, #restartButton {
  20.     padding: 10px 20px;
  21.     font-size: 16px;
  22.     margin-bottom: 20px;
  23.     background-color: #4CAF50; /* 绿色背景 */
  24.     color: white;
  25.     border: none;
  26.     border-radius: 5px;
  27.     cursor: pointer;
  28. }

  29. #startButton:hover, #restartButton:hover {
  30.     background-color: #45a049; /* 鼠标悬停时颜色变深 */
  31. }

  32. /* 结束游戏界面 */
  33. #gameOver {
  34.     position: absolute;
  35.     top: 50%;
  36.     left: 50%;
  37.     transform: translate(-50%, -50%);
  38.     text-align: center;
  39.     background-color: rgba(255, 255, 255, 0.9);
  40.     padding: 20px;
  41.     border: 2px solid #333;
  42.     border-radius: 10px;
  43.     box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
  44.     animation: fadeIn 1s;
  45. }

  46. .hidden {
  47.     display: none;
  48. }

  49. @keyframes fadeIn {
  50.     from {
  51.         opacity: 0;
  52.     }
  53.     to {
  54.         opacity: 1;
  55.     }
  56. }
复制代码


### 3. 修改JavaScript文件
在JavaScript文件中,我们需要添加一些代码来显示和隐藏结束游戏界面,并处理重新开始游戏的逻辑:

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

  3. let snake = [{x: 200, y: 200}];
  4. let foodX;
  5. let foodY;
  6. let dx = 10;
  7. let dy = 0;
  8. let isGameRunning = false; // 初始状态改为未运行
  9. let score = 0;

  10. // 获取页面元素
  11. const startButton = document.getElementById('startButton');
  12. const gameOverDiv = document.getElementById('gameOver');
  13. const finalScore = document.getElementById('finalScore');
  14. const restartButton = document.getElementById('restartButton');

  15. // 开始游戏按钮点击事件
  16. startButton.addEventListener('click', startGame);
  17. restartButton.addEventListener('click', startGame);

  18. function startGame() {
  19.     isGameRunning = true;
  20.     snake = [{x: 200, y: 200}];
  21.     dx = 10;
  22.     dy = 0;
  23.     score = 0;
  24.     createFood();
  25.     gameOverDiv.classList.add('hidden');
  26.     main();
  27. }

  28. // 主游戏循环
  29. function main() {
  30.     if (isGameRunning) {
  31.         setTimeout(function onTick() {
  32.             clearCanvas();
  33.             moveSnake();
  34.             drawSnake();
  35.             drawFood();
  36.             checkGameOver();
  37.             updateScore();
  38.             main();
  39.         }, 100);
  40.     }
  41. }

  42. // 清除画布
  43. function clearCanvas() {
  44.     ctx.fillStyle = "black";
  45.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  46. }

  47. // 绘制蛇
  48. function drawSnake() {
  49.     snake.forEach(snakePart => {
  50.         ctx.fillStyle = 'lightgreen';
  51.         ctx.strokestyle = 'darkgreen';
  52.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  53.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  54.     });
  55. }

  56. // 移动蛇
  57. function moveSnake() {
  58.     const head = {x: snake[0].x + dx, y: snake[0].y + dy};
  59.     snake.unshift(head);

  60.     if (snake[0].x === foodX && snake[0].y === foodY) {
  61.         score += 10;
  62.         createFood();
  63.     } else {
  64.         snake.pop();
  65.     }
  66. }

  67. // 随机生成食物位置
  68. function createFood() {
  69.     foodX = Math.floor((Math.random() * canvas.width) / 10) * 10;
  70.     foodY = Math.floor((Math.random() * canvas.height) / 10) * 10;

  71.     snake.forEach(snakePart => {
  72.         if (snakePart.x === foodX && snakePart.y === foodY) {
  73.             createFood();
  74.         }
  75.     });
  76. }

  77. // 绘制食物
  78. function drawFood() {
  79.     ctx.fillStyle = 'red';
  80.     ctx.strokestyle = 'darkred';
  81.     ctx.fillRect(foodX, foodY, 10, 10);
  82.     ctx.strokeRect(foodX, foodY, 10, 10);
  83. }

  84. // 检查游戏是否结束
  85. function checkGameOver() {
  86.     for (let i = 4; i < snake.length; i++) {
  87.         if (snake[0].x === snake[i].x && snake[0].y === snake[i].y) {
  88.             endGame();
  89.         }
  90.     }

  91.     const hitLeftWall = snake[0].x < 0;
  92.     const hitRightWall = snake[0].x >= canvas.width;
  93.     const hitTopWall = snake[0].y < 0;
  94.     const hitBottomWall = snake[0].y >= canvas.height;

  95.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) {
  96.         endGame();
  97.     }
  98. }

  99. // 处理游戏结束
  100. function endGame() {
  101.     isGameRunning = false;
  102.     finalScore.textContent = score;
  103.     gameOverDiv.classList.remove('hidden');
  104. }

  105. // 更改方向
  106. document.addEventListener("keydown", changeDirection);

  107. function changeDirection(event) {
  108.     const LEFT_KEY = 37;
  109.     const RIGHT_KEY = 39;
  110.     const UP_KEY = 38;
  111.     const DOWN_KEY = 40;

  112.     const keyPressed = event.keyCode;
  113.     const goingUp = dy === -10;
  114.     const goingDown = dy === 10;
  115.     const goingRight = dx === 10;
  116.     const goingLeft = dx === -10;

  117.     if (keyPressed === LEFT_KEY && !goingRight) {
  118.         dx = -10;
  119.         dy = 0;
  120.     }

  121.     if (keyPressed === UP_KEY && !goingDown) {
  122.         dx = 0;
  123.         dy = -10;
  124.     }

  125.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  126.         dx = 10;
  127.         dy = 0;
  128.     }

  129.     if (keyPressed === DOWN_KEY && !goingUp) {
  130.         dx = 0;
  131.         dy = 10;
  132.     }
  133. }

  134. // 更新分数显示
  135. function updateScore() {
  136.     document.getElementById('score').textContent = '得分: ' + score;
  137. }

  138. // 初始化游戏
  139. createFood();
复制代码


### 解释
- **HTML部分**:增加了一个隐藏的`gameOver` div,当游戏结束时会显示。
- **CSS部分**:为游戏结束界面添加了样式,使其居中并带有淡入动画效果。
- **JavaScript部分**:增加了`startGame`函数,用于初始化游戏,处理开始和重新开始游戏的逻辑。`endGame`函数用于处理游戏结束显示和分数更新。

你可以按上述步骤将新样式和代码添加到你的项目中,以使游戏结束界面更加生动。如果你有其它问题或需要进一步帮助,请告诉我!
作者: 林奕锦    时间: 2024-7-21 10:38
kaia 发表于 2024-7-21 10:33
当然可以!为了让游戏结束界面更加生动,我们可以添加一些动画效果和更具吸引力的文本显示。以下是一个示 ...

请改为英文
作者: 林奕锦    时间: 2024-7-21 10:41
请将网页改为英文,谢谢
作者: 林奕锦    时间: 2024-7-23 15:45
kaia 发表于 2024-7-21 09:52
可以的!你只需要在CSS文件中修改`canvas`元素的背景颜色即可。我们将背景颜色改为浅蓝色(例如#ADD8E6) ...

请将网页文本改为英文
作者: kaia    时间: 2024-7-23 15:46
林奕锦 发表于 2024-07-23 15:45
请将网页文本改为英文


好的!我会将你的网页文本改为英文。

### 1. 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>Snake Game</title>
  7.     <link rel="stylesheet" href="styles.css">
  8. </head>
  9. <body>
  10.     <h1>Snake Game</h1>
  11.     <button id="startButton">Start Game</button>
  12.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  13.     <div id="score">Score: 0</div>
  14.     <script src="snake_game.js"></script>
  15. </body>
  16. </html>
复制代码


### 2. JavaScript 部分
我们不需要对逻辑部分做大改动,只需要确保提示信息是英文的。例如,游戏结束时的提示:

  1. // 获取画布并设置上下文
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');

  4. // 定义蛇的初始状态
  5. let snake = [
  6.     {x: 150, y: 150},
  7.     {x: 140, y: 150},
  8.     {x: 130, y: 150},
  9.     {x: 120, y: 150},
  10.     {x: 110, y: 150}
  11. ];

  12. // 初始化食物位置
  13. let foodX;
  14. let foodY;

  15. // 初始速度 - 蛇向右移动
  16. let dx = 10;
  17. let dy = 0;

  18. // 游戏运行标志
  19. let isGameRunning = true;

  20. // 创建游戏循环
  21. function main() {
  22.     if (isGameRunning) {
  23.         setTimeout(function onTick() {
  24.             clearCanvas();
  25.             moveSnake();
  26.             drawSnake();
  27.             drawFood();
  28.             checkGameOver();
  29.             main();
  30.         }, 100);
  31.     } else {
  32.         alert("Game Over!");
  33.     }
  34. }

  35. // 清除画布
  36. function clearCanvas() {
  37.     ctx.fillStyle = "black";
  38.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  39. }

  40. // 绘制蛇
  41. function drawSnake() {
  42.     snake.forEach(snakePart => {
  43.         ctx.fillStyle = 'lightgreen';
  44.         ctx.strokestyle = 'darkgreen';
  45.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  46.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  47.     });
  48. }

  49. // 移动蛇
  50. function moveSnake() {
  51.     const head = {x: snake[0].x + dx, y: snake[0].y + dy};
  52.     snake.unshift(head);

  53.     // 检查蛇是否吃到食物
  54.     if (snake[0].x === foodX && snake[0].y === foodY) {
  55.         createFood();
  56.     } else {
  57.         snake.pop();
  58.     }
  59. }

  60. // 随机生成食物位置
  61. function createFood() {
  62.     foodX = Math.floor((Math.random() * canvas.width) / 10) * 10;
  63.     foodY = Math.floor((Math.random() * canvas.height) / 10) * 10;

  64.     // 确保食物不会生成在蛇身体上
  65.     snake.forEach(snakePart => {
  66.         if (snakePart.x === foodX && snakePart.y === foodY) {
  67.             createFood();
  68.         }
  69.     });
  70. }

  71. // 绘制食物
  72. function drawFood() {
  73.     ctx.fillStyle = 'red';
  74.     ctx.strokestyle = 'darkred';
  75.     ctx.fillRect(foodX, foodY, 10, 10);
  76.     ctx.strokeRect(foodX, foodY, 10, 10);
  77. }

  78. // 检查游戏是否结束
  79. function checkGameOver() {
  80.     for (let i = 4; i < snake.length; i++) {
  81.         if (snake[0].x === snake[i].x && snake[0].y === snake[i].y) {
  82.             isGameRunning = false;
  83.         }
  84.     }

  85.     const hitLeftWall = snake[0].x < 0;
  86.     const hitRightWall = snake[0].x >= canvas.width;
  87.     const hitTopWall = snake[0].y < 0;
  88.     const hitBottomWall = snake[0].y >= canvas.height;

  89.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) {
  90.         isGameRunning = false;
  91.     }
  92. }

  93. // 更改方向
  94. document.addEventListener("keydown", changeDirection);

  95. function changeDirection(event) {
  96.     const LEFT_KEY = 37;
  97.     const RIGHT_KEY = 39;
  98.     const UP_KEY = 38;
  99.     const DOWN_KEY = 40;

  100.     const keyPressed = event.keyCode;
  101.     const goingUp = dy === -10;
  102.     const goingDown = dy === 10;
  103.     const goingRight = dx === 10;
  104.     const goingLeft = dx === -10;

  105.     if (keyPressed === LEFT_KEY && !goingRight) {
  106.         dx = -10;
  107.         dy = 0;
  108.     }

  109.     if (keyPressed === UP_KEY && !goingDown) {
  110.         dx = 0;
  111.         dy = -10;
  112.     }

  113.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  114.         dx = 10;
  115.         dy = 0;
  116.     }

  117.     if (keyPressed === DOWN_KEY && !goingUp) {
  118.         dx = 0;
  119.         dy = 10;
  120.     }
  121. }

  122. // 开始游戏
  123. createFood();
  124. main();
复制代码


### 3. CSS 部分
我们之前已经修改了背景颜色,这里再重复一下,以确保你有完整的代码:

  1. /* 设置画布和页面样式 */
  2. canvas {
  3.     background-color: #ADD8E6; /* 浅蓝色背景 */
  4.     display: block;           /* 将画布显示为块状元素 */
  5.     margin: 0 auto;           /* 居中对齐 */
  6. }

  7. /* 添加基本页面样式 */
  8. body {
  9.     display: flex;
  10.     flex-direction: column;
  11.     align-items: center;
  12.     justify-content: center;
  13.     height: 100vh;
  14.     margin: 0;
  15. }

  16. h1 {
  17.     color: #333;
  18. }

  19. #startButton {
  20.     padding: 10px 20px;
  21.     font-size: 16px;
  22.     margin-bottom: 20px;
  23.     background-color: #0000FF; /* 蓝色背景 */
  24.     color: white;              /* 白色文字 */
  25.     border: none;              /* 无边框 */
  26.     border-radius: 5px;        /* 圆角边框 */
  27.     cursor: pointer;           /* 鼠标悬停变成指针 */
  28. }

  29. #startButton:hover {
  30.     background-color: #0000cc; /* 鼠标悬停时颜色变深 */
  31. }

  32. #score {
  33.     margin-top: 20px;
  34.     font-size: 20px;
  35.     color: #333;
  36. }
复制代码


以上就是将生成的网页文本都改为英文后的代码。如果你还有其他的问题或者需要进一步的帮助,请告诉我!
作者: 林奕锦    时间: 2024-7-23 15:51
kaia 发表于 2024-7-23 15:46
好的!我会将你的网页文本改为英文。

### 1. HTML 部分

为什么代码被修改了?还没点击按钮游戏就直接开始了
作者: 林奕锦    时间: 2024-7-23 16:12
我想在蛇吃东西的时候发出声音,音频名称:eat,请问该如何修改代码?
作者: 林奕锦    时间: 2024-7-23 16:14
kaia 发表于 2024-7-21 09:52
可以的!你只需要在CSS文件中修改`canvas`元素的背景颜色即可。我们将背景颜色改为浅蓝色(例如#ADD8E6) ...

我想在蛇吃东西的时候发出声音,请问该如何修改代码?
作者: kaia    时间: 2024-7-23 16:16
林奕锦 发表于 2024-07-23 16:14
我想在蛇吃东西的时候发出声音,请问该如何修改代码? ...


要在蛇吃到食物时发出声音,你可以使用HTML5音频API。在这里简单介绍一下流程:

1. 准备一个音频文件,比如`eat.mp3`,并将其放在你项目的目录中。
2. 用JavaScript在适当的时候播放这个音频文件。

以下是更新后的代码,可以帮助你添加这个功能:

### 1. HTML 部分
我们需要在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.     <link rel="stylesheet" href="styles.css">
  8. </head>
  9. <body>
  10.     <h1>贪吃蛇游戏</h1>
  11.     <button id="startButton">开始游戏</button>
  12.     <canvas id="gameCanvas" width="400" height="400"></canvas>
  13.     <p id="score">分数: 0</p>
  14.    
  15.     <!-- 引入音频文件 -->
  16.     <audio id="eatSound" src="eat.mp3"></audio>

  17.     <!-- 引入游戏逻辑的脚本 -->
  18.     <script src="snake_game.js"></script>
  19. </body>
  20. </html>
复制代码


### 2. JavaScript 部分
在蛇吃到食物时播放音频。

  1. // 获取画布并设置上下文
  2. const canvas = document.getElementById('gameCanvas');
  3. const ctx = canvas.getContext('2d');

  4. // 获取音频元素
  5. const eatSound = document.getElementById('eatSound');

  6. // 定义蛇的初始状态
  7. let snake = [
  8.     {x: 150, y: 150},
  9.     {x: 140, y: 150},
  10.     {x: 130, y: 150},
  11.     {x: 120, y: 150},
  12.     {x: 110, y: 150}
  13. ];

  14. // 初始化食物位置
  15. let foodX;
  16. let foodY;

  17. // 初始速度 - 蛇向右移动
  18. let dx = 10;
  19. let dy = 0;

  20. // 游戏运行标志
  21. let isGameRunning = true;

  22. // 创建游戏循环
  23. function main() {
  24.     if (isGameRunning) {
  25.         setTimeout(function onTick() {
  26.             clearCanvas();
  27.             moveSnake();
  28.             drawSnake();
  29.             drawFood();
  30.             checkGameOver();
  31.             main();
  32.         }, 100);
  33.     } else {
  34.         alert("游戏结束!");
  35.     }
  36. }

  37. // 清除画布
  38. function clearCanvas() {
  39.     ctx.fillStyle = "black";
  40.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  41. }

  42. // 绘制蛇
  43. function drawSnake() {
  44.     snake.forEach(snakePart => {
  45.         ctx.fillStyle = 'lightgreen';
  46.         ctx.strokestyle = 'darkgreen';
  47.         ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
  48.         ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
  49.     });
  50. }

  51. // 移动蛇
  52. function moveSnake() {
  53.     const head = {x: snake[0].x + dx, y: snake[0].y + dy};
  54.     snake.unshift(head);

  55.     // 检查蛇是否吃到食物
  56.     if (snake[0].x === foodX && snake[0].y === foodY) {
  57.         eatSound.play(); // 播放吃东西的声音
  58.         createFood();
  59.     } else {
  60.         snake.pop();
  61.     }
  62. }

  63. // 随机生成食物位置
  64. function createFood() {
  65.     foodX = Math.floor((Math.random() * canvas.width) / 10) * 10;
  66.     foodY = Math.floor((Math.random() * canvas.height) / 10) * 10;

  67.     // 确保食物不会生成在蛇身体上
  68.     snake.forEach(snakePart => {
  69.         if (snakePart.x === foodX && snakePart.y === foodY) {
  70.             createFood();
  71.         }
  72.     });
  73. }

  74. // 绘制食物
  75. function drawFood() {
  76.     ctx.fillStyle = 'red';
  77.     ctx.strokestyle = 'darkred';
  78.     ctx.fillRect(foodX, foodY, 10, 10);
  79.     ctx.strokeRect(foodX, foodY, 10, 10);
  80. }

  81. // 检查游戏是否结束
  82. function checkGameOver() {
  83.     for (let i = 4; i < snake.length; i++) {
  84.         if (snake[0].x === snake[i].x && snake[0].y === snake[i].y) {
  85.             isGameRunning = false;
  86.         }
  87.     }

  88.     const hitLeftWall = snake[0].x < 0;
  89.     const hitRightWall = snake[0].x >= canvas.width;
  90.     const hitTopWall = snake[0].y < 0;
  91.     const hitBottomWall = snake[0].y >= canvas.height;

  92.     if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) {
  93.         isGameRunning = false;
  94.     }
  95. }

  96. // 更改方向
  97. document.addEventListener("keydown", changeDirection);

  98. function changeDirection(event) {
  99.     const LEFT_KEY = 37;
  100.     const RIGHT_KEY = 39;
  101.     const UP_KEY = 38;
  102.     const DOWN_KEY = 40;

  103.     const keyPressed = event.keyCode;
  104.     const goingUp = dy === -10;
  105.     const goingDown = dy === 10;
  106.     const goingRight = dx === 10;
  107.     const goingLeft = dx === -10;

  108.     if (keyPressed === LEFT_KEY && !goingRight) {
  109.         dx = -10;
  110.         dy = 0;
  111.     }

  112.     if (keyPressed === UP_KEY && !goingDown) {
  113.         dx = 0;
  114.         dy = -10;
  115.     }

  116.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  117.         dx = 10;
  118.         dy = 0;
  119.     }

  120.     if (keyPressed === DOWN_KEY && !goingUp) {
  121.         dx = 0;
  122.         dy = 10;
  123.     }
  124. }

  125. // 开始游戏
  126. createFood();
  127. main();
复制代码


### 解释
1. **HTML**:
    - 添加了 `<audio>` 标签,用于引用`eat.mp3`音频文件。
  
2. **JavaScript**:
    - 获取音频元素:`const eatSound = document.getElementById('eatSound');`
    - 每当蛇吃到食物时调用 `eatSound.play();` 播放音频。

通过这些修改,当蛇吃到食物时,网页会发出声音。记得确保你的浏览器允许自动播放音频,有些浏览器可能会默认禁用此功能。
作者: 林奕锦    时间: 2024-7-23 16:25
我想在游戏结束的时候播放音频,名称:gua,该如何修改?
作者: 林奕锦    时间: 2024-7-23 16:31
我想在开始按钮被点击以后,重复播放tan音频,该怎么做?




欢迎光临 科学教育 (http://www.sci-edu.net/) Powered by Discuz! X3.2