科学教育

搜索
查看: 10052|回复: 47
打印 上一主题 下一主题

林奕锦1

[复制链接]

8

主题

62

帖子

184

积分

注册会员

Rank: 2

积分
184
跳转到指定楼层
楼主
发表于 2024-7-17 09:53:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请帮我设计一个网页贪吃蛇游戏,加上注释
回复

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
沙发
发表于 2024-7-17 09:54:27 | 只看该作者
当然可以!贪吃蛇游戏是一个很有趣的项目。我们可以使用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`处理键盘事件来改变蛇的移动方向。

希望这些解释能帮你更好地理解贪吃蛇游戏的实现!如果你还有其他问题或需要进一步的帮助,请告诉我。
回复 支持 反对

使用道具 举报

8

主题

62

帖子

184

积分

注册会员

Rank: 2

积分
184
板凳
 楼主| 发表于 2024-7-17 09:58:42 | 只看该作者
请用上css文件
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
地板
发表于 2024-7-17 09:59:06 | 只看该作者


好的!我们可以把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`就可以玩贪吃蛇游戏了。如果遇到问题或有其他需求,欢迎继续提问!
回复 支持 反对

使用道具 举报

8

主题

62

帖子

184

积分

注册会员

Rank: 2

积分
184
5#
 楼主| 发表于 2024-7-17 10:03:27 | 只看该作者
请帮我加上开始按钮和结束得分提示
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
6#
发表于 2024-7-17 10:04:28 | 只看该作者
林奕锦 发表于 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`就可以玩贪吃蛇游戏了。如果遇到问题或有其他需求,欢迎继续提问!
回复 支持 反对

使用道具 举报

8

主题

62

帖子

184

积分

注册会员

Rank: 2

积分
184
7#
 楼主| 发表于 2024-7-17 10:09:15 | 只看该作者
为什么我的网页的所有中文都无法显示?
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
8#
发表于 2024-7-17 10:10:33 | 只看该作者
林奕锦 发表于 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`,你就可以玩贪吃蛇游戏了,并且所有的中文字符应该能正常显示。如果还有其他问题或疑问,欢迎继续提问!
回复 支持 反对

使用道具 举报

8

主题

62

帖子

184

积分

注册会员

Rank: 2

积分
184
9#
 楼主| 发表于 2024-7-17 10:11:56 | 只看该作者
为什么还是无法显示?
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
10#
发表于 2024-7-17 10:12:38 | 只看该作者
林奕锦 发表于 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`文件。如果你仍然遇到问题,可以尝试换一个浏览器或者清除浏览器缓存,再次测试。如果还有其他疑问,请继续告诉我!
回复 支持 反对

使用道具 举报

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

本版积分规则

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