科学教育

搜索
楼主: 林奕锦
打印 上一主题 下一主题

林奕锦1

[复制链接]

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
31#
发表于 2024-7-19 13:08:33 | 只看该作者
林奕锦 发表于 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`文件,你就可以看到包含中文注释的贪吃蛇游戏了。如果有其他问题,请随时告诉我!
回复 支持 反对

使用道具 举报

8

主题

62

帖子

184

积分

注册会员

Rank: 2

积分
184
32#
 楼主| 发表于 2024-7-19 13:10:10 | 只看该作者
请帮我将网页文本改为英文
回复 支持 反对

使用道具 举报

8

主题

62

帖子

184

积分

注册会员

Rank: 2

积分
184
33#
 楼主| 发表于 2024-7-21 09:43:35 | 只看该作者
我想将画布改为浅蓝色,该怎么做? background-color: #0000FF
回复 支持 反对

使用道具 举报

8

主题

62

帖子

184

积分

注册会员

Rank: 2

积分
184
34#
 楼主| 发表于 2024-7-21 09:52:25 | 只看该作者
kaia 发表于 2024-7-19 13:08
好的,我会将注释翻译回中文,请查阅以下更新后的代码:

### `index.html`

我想在CSS文件将画布改为浅蓝色,可以怎样改
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
35#
发表于 2024-7-21 09:52:31 | 只看该作者
林奕锦 发表于 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` 样式部分替换成上面的代码,即可将画布的背景颜色更改为浅蓝色。如果有任何其他问题,欢迎继续提问!
回复 支持 反对

使用道具 举报

8

主题

62

帖子

184

积分

注册会员

Rank: 2

积分
184
36#
 楼主| 发表于 2024-7-21 09:59:34 | 只看该作者
kaia 发表于 2024-7-21 09:52
可以的!你只需要在CSS文件中修改`canvas`元素的背景颜色即可。我们将背景颜色改为浅蓝色(例如#ADD8E6) ...

我想将得分文本颜色改为金色,该怎么做?
回复 支持 反对

使用道具 举报

8

主题

62

帖子

184

积分

注册会员

Rank: 2

积分
184
37#
 楼主| 发表于 2024-7-21 10:33:25 | 只看该作者
kaia 发表于 2024-7-21 09:52
可以的!你只需要在CSS文件中修改`canvas`元素的背景颜色即可。我们将背景颜色改为浅蓝色(例如#ADD8E6) ...

我想将结束游戏的界面更加生动,该如何修改?
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
38#
发表于 2024-7-21 10:33:53 | 只看该作者
林奕锦 发表于 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`函数用于处理游戏结束显示和分数更新。

你可以按上述步骤将新样式和代码添加到你的项目中,以使游戏结束界面更加生动。如果你有其它问题或需要进一步帮助,请告诉我!
回复 支持 反对

使用道具 举报

8

主题

62

帖子

184

积分

注册会员

Rank: 2

积分
184
39#
 楼主| 发表于 2024-7-21 10:38:29 | 只看该作者
kaia 发表于 2024-7-21 10:33
当然可以!为了让游戏结束界面更加生动,我们可以添加一些动画效果和更具吸引力的文本显示。以下是一个示 ...

请改为英文
回复 支持 反对

使用道具 举报

8

主题

62

帖子

184

积分

注册会员

Rank: 2

积分
184
40#
 楼主| 发表于 2024-7-21 10:41:57 | 只看该作者
请将网页改为英文,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

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