科学教育

搜索
查看: 6738|回复: 23
打印 上一主题 下一主题

廖晗瑞

[复制链接]

5

主题

31

帖子

86

积分

注册会员

Rank: 2

积分
86
跳转到指定楼层
楼主
发表于 2024-8-14 18:58:38 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
帮我做一个完善的贪吃蛇游戏
回复

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
24#
发表于 2024-8-14 22:18:14 | 只看该作者
廖晗瑞 发表于 2024-08-14 22:17
我不想要音效,能不能帮我去除音效


当然可以!我们来移除音效相关的内容。下面是去除音效后的代码:

### 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.     <style>
  8.         body {
  9.             display: flex;
  10.             justify-content: center;
  11.             align-items: center;
  12.             height: 100vh;
  13.             margin: 0;
  14.             font-family: Arial, sans-serif;
  15.             background-color: #f0f0f0;
  16.         }
  17.         #gameCanvas {
  18.             border: 1px solid #000;
  19.             background-color: #fff;
  20.         }
  21.     </style>
  22. </head>
  23. <body>
  24.    
  25.     <canvas id="gameCanvas" width="400" height="400"></canvas>

  26.     <script src="snake.js"></script>
  27. </body>
  28. </html>
复制代码


### JavaScript文件
修改JavaScript代码,去除与音效相关的逻辑:

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

  3. const box = 20; // 每个格子的大小
  4. let snake, food, direction, score, game, gameInterval, timeCounter;
  5. let highScore = localStorage.getItem('highScore') || 0; // 从localStorage读取最高得分
  6. let timeElapsed = 0;

  7. const difficultySettings = {
  8.     easy: 150,
  9.     normal: 100,
  10.     hard: 50
  11. };

  12. const skins = {
  13.     default: { snake: 'black', food: 'red' },
  14.     blue: { snake: 'blue', food: 'lightblue' },
  15.     red: { snake: 'red', food: 'orange' }
  16. };

  17. // 定义多个地图的障碍物位置
  18. const maps = {
  19.     map1: [],
  20.     map2: [],
  21.     map3: []
  22. };

  23. let obstacles = [];

  24. document.getElementById('startButton').addEventListener('click', startGame);
  25. document.getElementById('pauseButton').addEventListener('click', pauseGame);

  26. function startGame() {
  27.     document.getElementById('startButton').style.display = 'none';
  28.     document.getElementById('pauseButton').style.display = 'block';
  29.     document.getElementById('gameCanvas').style.display = 'block';

  30.     resetGame();
  31.     const difficulty = document.getElementById('difficulty').value;
  32.     gameInterval = difficultySettings[difficulty];
  33.     game = setInterval(drawGame, gameInterval);
  34.     timeCounter = setInterval(updateTime, 1000); // 每秒更新一次时间
  35. }

  36. function pauseGame() {
  37.     if (game) {
  38.         clearInterval(game);
  39.         clearInterval(timeCounter);
  40.         game = null;
  41.         timeCounter = null;
  42.         document.getElementById('pauseButton').innerText = '继续';
  43.     } else {
  44.         const difficulty = document.getElementById('difficulty').value;
  45.         gameInterval = difficultySettings[difficulty];
  46.         game = setInterval(drawGame, gameInterval);
  47.         timeCounter = setInterval(updateTime, 1000); // 每秒更新一次时间
  48.         document.getElementById('pauseButton').innerText = '暂停';
  49.     }
  50. }

  51. function resetGame() {
  52.     snake = [{ x: 9 * box, y: 10 * box }];
  53.     food = generateFood();
  54.     score = 0;
  55.     direction = undefined;
  56.     timeElapsed = 0;
  57.     document.getElementById('time').innerText = timeElapsed;
  58.     loadMap(); // 加载选中的地图
  59. }

  60. document.addEventListener('keydown', changeDirection);

  61. function changeDirection(event) {
  62.     const keyPressed = event.keyCode;
  63.     if (keyPressed === 37 && direction !== 'RIGHT') direction = 'LEFT';
  64.     if (keyPressed === 38 && direction !== 'DOWN') direction = 'UP';
  65.     if (keyPressed === 39 && direction !== 'LEFT') direction = 'RIGHT';
  66.     if (keyPressed === 40 && direction !== 'UP') direction = 'DOWN';
  67. }

  68. function drawGame() {
  69.     context.clearRect(0, 0, canvas.width, canvas.height);

  70.     const skin = document.getElementById('skin').value;
  71.     const colors = skins[skin];

  72.     for (let i = 0; i < snake.length; i++) {
  73.         context.fillStyle = i === 0 ? 'green' : colors.snake;
  74.         context.fillRect(snake[i].x, snake[i].y, box, box);
  75.     }

  76.     context.fillStyle = colors.food;
  77.     context.fillRect(food.x, food.y, box, box);

  78.     drawObstacles();

  79.     let snakeX = snake[0].x;
  80.     let snakeY = snake[0].y;

  81.     if (direction === 'LEFT') snakeX -= box;
  82.     if (direction === 'UP') snakeY -= box;
  83.     if (direction === 'RIGHT') snakeX += box;
  84.     if (direction === 'DOWN') snakeY += box;

  85.     if (snakeX === food.x && snakeY === food.y) {
  86.         score++;
  87.         updateHighScore();
  88.         food = generateFood();
  89.     } else {
  90.         snake.pop();
  91.     }

  92.     let newHead = { x: snakeX, y: snakeY };

  93.     if (snakeX < 0) snakeX = canvas.width - box;
  94.     if (snakeY < 0) snakeY = canvas.height - box;
  95.     if (snakeX >= canvas.width) snakeX = 0;
  96.     if (snakeY >= canvas.height) snakeY = 0;

  97.     if (collision(newHead, snake) || collision(newHead, obstacles)) {
  98.         clearInterval(game);
  99.         clearInterval(timeCounter);
  100.         alert('游戏结束');
  101.         return;
  102.     }

  103.     snake.unshift(newHead);

  104.     context.fillStyle = 'black';
  105.     context.font = '20px Arial';
  106.     context.fillText(`得分: ${score}`, 5, canvas.height - 5);
  107. }

  108. function collision(head, array) {
  109.     for (let i = 0; i < array.length; i++) {
  110.         if (head.x === array[i].x && head.y === array[i].y) {
  111.             return true;
  112.         }
  113.     }
  114.     return false;
  115. }

  116. function updateHighScore() {
  117.     if (score > highScore) {
  118.         highScore = score;
  119.         localStorage.setItem('highScore', highScore); // 保存最高得分到localStorage
  120.         document.getElementById('highScore').innerText = highScore;
  121.     }
  122. }

  123. function updateTime() {
  124.     timeElapsed++;
  125.     document.getElementById('time').innerText = timeElapsed;
  126. }

  127. function generateFood() {
  128.     let newFood;
  129.     do {
  130.         newFood = {
  131.             x: Math.floor(Math.random() * 19 + 1) * box,
  132.             y: Math.floor(Math.random() * 19 + 1) * box
  133.         };
  134.     } while (collision(newFood, snake) || collision(newFood, obstacles));
  135.     return newFood;
  136. }

  137. function loadMap() {
  138.     const selectedMap = document.getElementById('map').value;
  139.     obstacles = maps[selectedMap] ? [...maps[selectedMap]] : [];
  140. }

  141. function drawObstacles() {
  142.     context.fillStyle = 'grey';
  143.     for (let i = 0; i < obstacles.length; i++) {
  144.         context.fillRect(obstacles[i].x, obstacles[i].y, box, box);
  145.     }
  146. }
复制代码


### 总结

通过删除HTML和JavaScript中与音效相关的代码,你现在有了一个不带音效的贪吃蛇游戏。如果你有其他问题或需要进一步的帮助,请随时告诉我!享受编程的乐趣吧!
回复 支持 反对

使用道具 举报

5

主题

31

帖子

86

积分

注册会员

Rank: 2

积分
86
23#
 楼主| 发表于 2024-8-14 22:17:33 | 只看该作者
kaia 发表于 2024-8-14 19:26
好的,我们来详细讲解一下如何添加音效到贪吃蛇游戏中。

### 第一步:准备音效文件

我不想要音效,能不能帮我去除音效
回复 支持 反对

使用道具 举报

5

主题

31

帖子

86

积分

注册会员

Rank: 2

积分
86
22#
 楼主| 发表于 2024-8-14 22:01:22 | 只看该作者
可不可以再帮我整合一下
回复 支持 反对

使用道具 举报

5

主题

31

帖子

86

积分

注册会员

Rank: 2

积分
86
21#
 楼主| 发表于 2024-8-14 21:48:50 | 只看该作者
帮我把地图扩大一点
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
20#
发表于 2024-8-14 19:29:03 | 只看该作者
廖晗瑞 发表于 2024-08-14 19:28
我不想要音效,能不能帮我去除音效


当然可以,我们可以移除音效相关的代码和元素。下面是没有音效的版本。

### HTML部分




   
   
    贪吃蛇游戏
   



    贪吃蛇游戏
   
        开始游戏
        暂停
        难度:
        
            简单
            普通
            困难
        
        地图:
        
            地图1
            地图2
            地图3
        
        皮肤:
        
            默认
            蓝色
            红色
        
   
   
    最高得分: 0
    时间: 0 秒
   
   
   
   


### CSS部分(style.css)

  1. body {
  2.     display: flex;
  3.     flex-direction: column;
  4.     justify-content: center;
  5.     align-items: center;
  6.     height: 100vh;
  7.     margin: 0;
  8.     font-family: Arial, sans-serif;
  9.     background-color: #f0f0f0;
  10. }

  11. #gameCanvas {
  12.     border: 2px solid #000;
  13.     background-color: #fff;
  14. }

  15. .controls {
  16.     margin-bottom: 20px;
  17. }

  18. button {
  19.     padding: 10px 20px;
  20.     font-size: 16px;
  21.     margin: 5px;
  22.     cursor: pointer;
  23. }
复制代码


### JavaScript部分(snake.js)

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

  3. const box = 20; // 每个格子的大小
  4. let snake, food, direction, score, game, gameInterval, timeCounter;
  5. let highScore = localStorage.getItem('highScore') || 0; // 从localStorage读取最高得分
  6. let timeElapsed = 0;

  7. const difficultySettings = {
  8.     easy: 150,
  9.     normal: 100,
  10.     hard: 50
  11. };

  12. const skins = {
  13.     default: { snake: 'black', food: 'red' },
  14.     blue: { snake: 'blue', food: 'lightblue' },
  15.     red: { snake: 'red', food: 'orange' }
  16. };

  17. // 定义多个地图的障碍物位置
  18. const maps = {
  19.     map1: [
  20.         {x: 4 * box, y: 4 * box},
  21.         {x: 5 * box, y: 4 * box},
  22.         {x: 6 * box, y: 4 * box},
  23.         {x: 7 * box, y: 4 * box}
  24.     ],
  25.     map2: [
  26.         {x: 10 * box, y: 10 * box},
  27.         {x: 11 * box, y: 10 * box},
  28.         {x: 12 * box, y: 10 * box}
  29.     ],
  30.     map3: [
  31.         {x: 15 * box, y: 15 * box},
  32.         {x: 16 * box, y: 15 * box}
  33.     ]
  34. };

  35. let obstacles = [];

  36. document.getElementById('startButton').addEventListener('click', startGame);
  37. document.getElementById('pauseButton').addEventListener('click', pauseGame);

  38. function startGame() {
  39.     document.getElementById('startButton').style.display = 'none';
  40.     document.getElementById('pauseButton').style.display = 'block';
  41.     document.getElementById('gameCanvas').style.display = 'block';

  42.     resetGame();
  43.     const difficulty = document.getElementById('difficulty').value;
  44.     gameInterval = difficultySettings[difficulty];
  45.     game = setInterval(drawGame, gameInterval);
  46.     timeCounter = setInterval(updateTime, 1000); // 每秒更新一次时间
  47. }

  48. function pauseGame() {
  49.     if (game) {
  50.         clearInterval(game);
  51.         clearInterval(timeCounter);
  52.         game = null;
  53.         timeCounter = null;
  54.         document.getElementById('pauseButton').innerText = '继续';
  55.     } else {
  56.         const difficulty = document.getElementById('difficulty').value;
  57.         gameInterval = difficultySettings[difficulty];
  58.         game = setInterval(drawGame, gameInterval);
  59.         timeCounter = setInterval(updateTime, 1000); // 每秒更新一次时间
  60.         document.getElementById('pauseButton').innerText = '暂停';
  61.     }
  62. }

  63. function resetGame() {
  64.     snake = [{ x: 9 * box, y: 10 * box }];
  65.     food = generateFood();
  66.     score = 0;
  67.     direction = undefined;
  68.     timeElapsed = 0;
  69.     document.getElementById('time').innerText = timeElapsed;
  70.     loadMap(); // 加载选中的地图
  71. }

  72. document.addEventListener('keydown', changeDirection);

  73. function changeDirection(event) {
  74.     const keyPressed = event.keyCode;
  75.     if (keyPressed === 37 && direction !== 'RIGHT') direction = 'LEFT';
  76.     if (keyPressed === 38 && direction !== 'DOWN') direction = 'UP';
  77.     if (keyPressed === 39 && direction !== 'LEFT') direction = 'RIGHT';
  78.     if (keyPressed === 40 && direction !== 'UP') direction = 'DOWN';
  79. }

  80. function drawGame() {
  81.     context.clearRect(0, 0, canvas.width, canvas.height);

  82.     const skin = document.getElementById('skin').value;
  83.     const colors = skins[skin];

  84.     for (let i = 0; i < snake.length; i++) {
  85.         context.fillStyle = i === 0 ? 'green' : colors.snake;
  86.         context.fillRect(snake[i].x, snake[i].y, box, box);
  87.     }

  88.     context.fillStyle = colors.food;
  89.     context.fillRect(food.x, food.y, box, box);

  90.     drawObstacles();

  91.     let snakeX = snake[0].x;
  92.     let snakeY = snake[0].y;

  93.     if (direction === 'LEFT') snakeX -= box;
  94.     if (direction === 'UP') snakeY -= box;
  95.     if (direction === 'RIGHT') snakeX += box;
  96.     if (direction === 'DOWN') snakeY += box;

  97.     if (snakeX === food.x && snakeY === food.y) {
  98.         score++;
  99.         updateHighScore();
  100.         food = generateFood();
  101.     } else {
  102.         snake.pop();
  103.     }

  104.     let newHead = { x: snakeX, y: snakeY };

  105.     if (snakeX < 0) snakeX = canvas.width - box;
  106.     if (snakeY < 0) snakeY = canvas.height - box;
  107.     if (snakeX >= canvas.width) snakeX = 0;
  108.     if (snakeY >= canvas.height) snakeY = 0;

  109.     if (collision(newHead, snake) || collision(newHead, obstacles)) {
  110.         clearInterval(game);
  111.         clearInterval(timeCounter);
  112.         alert('游戏结束');
  113.         return;
  114.     }

  115.     snake.unshift(newHead);

  116.     context.fillStyle = 'black';
  117.     context.font = '20px Arial';
  118.     context.fillText(`得分: ${score}`, 5, canvas.height - 5);
  119. }

  120. function collision(head, array) {
  121.     for (let i = 0; i < array.length; i++) {
  122.         if (head.x === array[i].x && head.y === array[i].y) {
  123.             return true;
  124.         }
  125.     }
  126.     return false;
  127. }

  128. function updateHighScore() {
  129.     if (score > highScore) {
  130.         highScore = score;
  131.         localStorage.setItem('highScore', highScore); // 保存最高得分到localStorage
  132.         document.getElementById('highScore').innerText = highScore;
  133.     }
  134. }

  135. function updateTime() {
  136.     timeElapsed++;
  137.     document.getElementById('time').innerText = timeElapsed;
  138. }

  139. function generateFood() {
  140.     let newFood;
  141.     do {
  142.         newFood = {
  143.             x: Math.floor(Math.random() * 19 + 1) * box,
  144.             y: Math.floor(Math.random() * 19 + 1) * box
  145.         };
  146.     } while (collision(newFood, snake) || collision(newFood, obstacles));
  147.     return newFood;
  148. }

  149. function loadMap() {
  150.     const selectedMap = document.getElementById('map').value;
  151.     obstacles = maps[selectedMap] ? [...maps[selectedMap]] : [];
  152. }

  153. function drawObstacles() {
  154.     context.fillStyle = 'grey';
  155.     for (let i = 0; i < obstacles.length; i++) {
  156.         context.fillRect(obstacles[i].x, obstacles[i].y, box, box);
  157.     }
  158. }
复制代码

### 运行游戏

1. **创建项目文件**:在一个新文件夹内创建三个文件:`index.html`, `style.css`, 和 `snake.js`。
2. **运行游戏**:用你的浏览器打开 `index.html` 文件,即可运行完整的贪吃蛇游戏。

通过这些步骤,你应该已经能够运行一个具有多地图、皮肤选择而且没有音效的完整贪吃蛇游戏。如果有任何问题或进一步的需求,请随时告诉我!享受编程和游戏的乐趣吧!
回复 支持 反对

使用道具 举报

5

主题

31

帖子

86

积分

注册会员

Rank: 2

积分
86
19#
 楼主| 发表于 2024-8-14 19:28:33 | 只看该作者
kaia 发表于 2024-8-14 19:23
当然可以!我会将三个部分(多地图、皮肤选择和音效)整合到一个完整的项目中,并确保代码清晰可读。我们 ...

我不想要音效,能不能帮我去除音效
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
18#
发表于 2024-8-14 19:26:19 | 只看该作者


好的,我们来详细讲解一下如何添加音效到贪吃蛇游戏中。

### 第一步:准备音效文件

我们需要两个音效文件:
1. `eat.mp3` - 当蛇吃到食物时播放。
2. `crash.mp3` - 当蛇撞墙或撞到身体时播放。

将这两个音效文件放到你的项目根目录中。

### 第二步:在HTML中引入音效文件

我们需要在HTML文件中通过`audio`标签引入这两个音效文件。




   
   
    贪吃蛇游戏
   




    贪吃蛇游戏
   
        开始游戏
        暂停
        难度:
   

            简单
            普通
            困难
        
        地图:
   

            地图1
            地图2
            地图3
        
        皮肤:
   

            默认
            蓝色
            红色
        
   
   
    最高得分: 0
    时间: 0 秒
   
    <!-- 引入音效文件 -->
    <audio id="eatSound" src="eat.mp3"></audio>
    <audio id="crashSound" src="crash.mp3"></audio>
   

   



### 第三步:修改JavaScript代码,播放音效

修改JavaScript代码,在适当的位置添加音效播放逻辑。

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

  3. const box = 20; // 每个格子的大小
  4. let snake, food, direction, score, game, gameInterval, timeCounter;
  5. let highScore = localStorage.getItem('highScore') || 0; // 从localStorage读取最高得分
  6. let timeElapsed = 0;

  7. const difficultySettings = {
  8.     easy: 150,
  9.     normal: 100,
  10.     hard: 50
  11. };

  12. const skins = {
  13.     default: { snake: 'black', food: 'red' },
  14.     blue: { snake: 'blue', food: 'lightblue' },
  15.     red: { snake: 'red', food: 'orange' }
  16. };

  17. // 定义多个地图的障碍物位置
  18. const maps = {
  19.     map1: [],
  20.     map2: [
  21.         { x: 5 * box, y: 5 * box },
  22.         { x: 15 * box, y: 15 * box }
  23.     ],
  24.     map3: [
  25.         { x: 7 * box, y: 7 * box },
  26.         { x: 13 * box, y: 13 * box },
  27.         { x: 9 * box, y: 9 * box }
  28.     ]
  29. };

  30. let obstacles = [];

  31. document.getElementById('startButton').addEventListener('click', startGame);
  32. document.getElementById('pauseButton').addEventListener('click', pauseGame);

  33. function startGame() {
  34.     document.getElementById('startButton').style.display = 'none';
  35.     document.getElementById('pauseButton').style.display = 'block';
  36.     document.getElementById('gameCanvas').style.display = 'block';

  37.     resetGame();
  38.     const difficulty = document.getElementById('difficulty').value;
  39.     gameInterval = difficultySettings[difficulty];
  40.     game = setInterval(drawGame, gameInterval);
  41.     timeCounter = setInterval(updateTime, 1000); // 每秒更新一次时间
  42. }

  43. function pauseGame() {
  44.     if (game) {
  45.         clearInterval(game);
  46.         clearInterval(timeCounter);
  47.         game = null;
  48.         timeCounter = null;
  49.         document.getElementById('pauseButton').innerText = '继续';
  50.     } else {
  51.         const difficulty = document.getElementById('difficulty').value;
  52.         gameInterval = difficultySettings[difficulty];
  53.         game = setInterval(drawGame, gameInterval);
  54.         timeCounter = setInterval(updateTime, 1000); // 每秒更新一次时间
  55.         document.getElementById('pauseButton').innerText = '暂停';
  56.     }
  57. }

  58. function resetGame() {
  59.     snake = [{ x: 9 * box, y: 10 * box }];
  60.     food = generateFood();
  61.     score = 0;
  62.     direction = undefined;
  63.     timeElapsed = 0;
  64.     document.getElementById('time').innerText = timeElapsed;
  65.     loadMap(); // 加载选中的地图
  66. }

  67. document.addEventListener('keydown', changeDirection);

  68. function changeDirection(event) {
  69.     const keyPressed = event.keyCode;
  70.     if (keyPressed === 37 && direction !== 'RIGHT') direction = 'LEFT';
  71.     if (keyPressed === 38 && direction !== 'DOWN') direction = 'UP';
  72.     if (keyPressed === 39 && direction !== 'LEFT') direction = 'RIGHT';
  73.     if (keyPressed === 40 && direction !== 'UP') direction = 'DOWN';
  74. }

  75. function drawGame() {
  76.     context.clearRect(0, 0, canvas.width, canvas.height);

  77.     const skin = document.getElementById('skin').value;
  78.     const colors = skins[skin];

  79.     for (let i = 0; i < snake.length; i++) {
  80.         context.fillStyle = i === 0 ? 'green' : colors.snake;
  81.         context.fillRect(snake[i].x, snake[i].y, box, box);
  82.     }

  83.     context.fillStyle = colors.food;
  84.     context.fillRect(food.x, food.y, box, box);

  85.     drawObstacles();

  86.     let snakeX = snake[0].x;
  87.     let snakeY = snake[0].y;

  88.     if (direction === 'LEFT') snakeX -= box;
  89.     if (direction === 'UP') snakeY -= box;
  90.     if (direction === 'RIGHT') snakeX += box;
  91.     if (direction === 'DOWN') snakeY += box;

  92.     if (snakeX === food.x && snakeY === food.y) {
  93.         score++;
  94.         updateHighScore();
  95.         document.getElementById('eatSound').play(); // 播放吃声音
  96.         food = generateFood();
  97.     } else {
  98.         snake.pop();
  99.     }

  100.     let newHead = { x: snakeX, y: snakeY };

  101.     if (snakeX < 0) snakeX = canvas.width - box;
  102.     if (snakeY < 0) snakeY = canvas.height - box;
  103.     if (snakeX >= canvas.width) snakeX = 0;
  104.     if (snakeY >= canvas.height) snakeY = 0;

  105.     if (collision(newHead, snake) || collision(newHead, obstacles)) {
  106.         clearInterval(game);
  107.         clearInterval(timeCounter);
  108.         document.getElementById('crashSound').play(); // 播放撞墙声音
  109.         alert('游戏结束');
  110.         return;
  111.     }

  112.     snake.unshift(newHead);

  113.     context.fillStyle = 'black';
  114.     context.font = '20px Arial';
  115.     context.fillText(`得分: ${score}`, 5, canvas.height - 5);
  116. }

  117. function collision(head, array) {
  118.     for (let i = 0; i < array.length; i++) {
  119.         if (head.x === array[i].x && head.y === array[i].y) {
  120.             return true;
  121.         }
  122.     }
  123.     return false;
  124. }

  125. function updateHighScore() {
  126.     if (score > highScore) {
  127.         highScore = score;
  128.         localStorage.setItem('highScore', highScore); // 保存最高得分到localStorage
  129.         document.getElementById('highScore').innerText = highScore;
  130.     }
  131. }

  132. function updateTime() {
  133.     timeElapsed++;
  134.     document.getElementById('time').innerText = timeElapsed;
  135. }

  136. function generateFood() {
  137.     let newFood;
  138.     do {
  139.         newFood = {
  140.             x: Math.floor(Math.random() * 19 + 1) * box,
  141.             y: Math.floor(Math.random() * 19 + 1) * box
  142.         };
  143.     } while (collision(newFood, snake) || collision(newFood, obstacles));
  144.     return newFood;
  145. }

  146. function loadMap() {
  147.     const selectedMap = document.getElementById('map').value;
  148.     obstacles = maps[selectedMap] ? [...maps[selectedMap]] : [];
  149. }

  150. function drawObstacles() {
  151.     context.fillStyle = 'grey';
  152.     for (let i = 0; i < obstacles.length; i++) {
  153.         context.fillRect(obstacles[i].x, obstacles[i].y, box, box);
  154.     }
  155. }
复制代码


### 安装和运行游戏

1. **创建项目文件**:在一个新文件夹内创建四个文件:`index.html`, `style.css`, `snake.js`,和放置`eat.mp3` 和 `crash.mp3` 音频文件。
2. **运行游戏**:用你的浏览器打开`index.html` 文件,即可运行完整的贪吃蛇游戏并带有音效。

通过上述步骤,你应该已经完成了一个具有多地图、皮肤选择和音效的贪吃蛇游戏。如果还有问题或者进一步的需求,请随时告诉我!享受编程和游戏的乐趣吧!
回复 支持 反对

使用道具 举报

5

主题

31

帖子

86

积分

注册会员

Rank: 2

积分
86
17#
 楼主| 发表于 2024-8-14 19:25:31 | 只看该作者
怎么添加音效
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
16#
发表于 2024-8-14 19:23:39 | 只看该作者
廖晗瑞 发表于 2024-08-14 19:21
可不可以再整理一下三个部分


当然可以!我会将三个部分(多地图、皮肤选择和音效)整合到一个完整的项目中,并确保代码清晰可读。我们分为三部分:HTML、CSS和JavaScript。

### HTML部分

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>贪吃蛇游戏</title>
  7.     <link rel="stylesheet" href="style.css">
  8. </head>
  9. <body>
  10.     <h1>贪吃蛇游戏</h1>
  11.     <div class="controls">
  12.         <button id="startButton">开始游戏</button>
  13.         <button id="pauseButton" style="display:none;">暂停</button>
  14.         <label for="difficulty">难度: </label>
  15.         <select id="difficulty">
  16.             <option value="easy">简单</option>
  17.             <option value="normal">普通</option>
  18.             <option value="hard">困难</option>
  19.         </select>
  20.         <label for="map">地图: </label>
  21.         <select id="map">
  22.             <option value="map1">地图1</option>
  23.             <option value="map2">地图2</option>
  24.             <option value="map3">地图3</option>
  25.         </select>
  26.         <label for="skin">皮肤: </label>
  27.         <select id="skin">
  28.             <option value="default">默认</option>
  29.             <option value="blue">蓝色</option>
  30.             <option value="red">红色</option>
  31.         </select>
  32.     </div>
  33.     <canvas id="gameCanvas" width="400" height="400" style="display:none;"></canvas>
  34.     <p>最高得分: <span id="highScore">0</span></p>
  35.     <p>时间: <span id="time">0</span> 秒</p>
  36.     <audio id="eatSound" src="eat.mp3"></audio>
  37.     <audio id="crashSound" src="crash.mp3"></audio>
  38.     <script src="snake.js"></script>
  39. </body>
  40. </html>
复制代码


### CSS部分(style.css)

  1. body {
  2.     display: flex;
  3.     flex-direction: column;
  4.     justify-content: center;
  5.     align-items: center;
  6.     height: 100vh;
  7.     margin: 0;
  8.     font-family: Arial, sans-serif;
  9.     background-color: #f0f0f0;
  10. }

  11. #gameCanvas {
  12.     border: 2px solid #000;
  13.     background-color: #fff;
  14. }

  15. .controls {
  16.     margin-bottom: 20px;
  17. }

  18. button {
  19.     padding: 10px 20px;
  20.     font-size: 16px;
  21.     margin: 5px;
  22.     cursor: pointer;
  23. }
复制代码


### JavaScript部分(snake.js)

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

  3. const box = 20;
  4. let snake, food, direction, score, game, gameInterval, timeCounter;
  5. let highScore = localStorage.getItem('highScore') || 0;
  6. let timeElapsed = 0;

  7. const difficultySettings = {
  8.     easy: 150,
  9.     normal: 100,
  10.     hard: 50
  11. };

  12. const skins = {
  13.     default: { snake: 'black', food: 'red' },
  14.     blue: { snake: 'blue', food: 'lightblue' },
  15.     red: { snake: 'red', food: 'orange' }
  16. };

  17. const maps = {
  18.     map1: [{ x: 5 * box, y: 5 * box }, { x: 10 * box, y: 10 * box }],
  19.     map2: [{ x: 7 * box, y: 7 * box }, { x: 12 * box, y: 12 * box }],
  20.     map3: [{ x: 9 * box, y: 9 * box }, { x: 14 * box, y: 14 * box }]
  21. };

  22. let obstacles = [];

  23. document.getElementById('startButton').addEventListener('click', startGame);
  24. document.getElementById('pauseButton').addEventListener('click', pauseGame);

  25. function startGame() {
  26.     document.getElementById('startButton').style.display = 'none';
  27.     document.getElementById('pauseButton').style.display = 'block';
  28.     document.getElementById('gameCanvas').style.display = 'block';

  29.     resetGame();
  30.     const difficulty = document.getElementById('difficulty').value;
  31.     gameInterval = difficultySettings[difficulty];
  32.     game = setInterval(drawGame, gameInterval);
  33.     timeCounter = setInterval(updateTime, 1000);
  34. }

  35. function pauseGame() {
  36.     if (game) {
  37.         clearInterval(game);
  38.         clearInterval(timeCounter);
  39.         game = null;
  40.         timeCounter = null;
  41.         document.getElementById('pauseButton').innerText = '继续';
  42.     } else {
  43.         const difficulty = document.getElementById('difficulty').value;
  44.         gameInterval = difficultySettings[difficulty];
  45.         game = setInterval(drawGame, gameInterval);
  46.         timeCounter = setInterval(updateTime, 1000);
  47.         document.getElementById('pauseButton').innerText = '暂停';
  48.     }
  49. }

  50. function resetGame() {
  51.     snake = [{ x: 9 * box, y: 10 * box }];
  52.     food = generateFood();
  53.     score = 0;
  54.     direction = undefined;
  55.     timeElapsed = 0;
  56.     document.getElementById('time').innerText = timeElapsed;
  57.     loadMap();
  58. }

  59. document.addEventListener('keydown', changeDirection);

  60. function changeDirection(event) {
  61.     const keyPressed = event.keyCode;
  62.     if (keyPressed === 37 && direction !== 'RIGHT') direction = 'LEFT';
  63.     if (keyPressed === 38 && direction !== 'DOWN') direction = 'UP';
  64.     if (keyPressed === 39 && direction !== 'LEFT') direction = 'RIGHT';
  65.     if (keyPressed === 40 && direction !== 'UP') direction = 'DOWN';
  66. }

  67. function drawGame() {
  68.     context.clearRect(0, 0, canvas.width, canvas.height);

  69.     const skin = document.getElementById('skin').value;
  70.     const colors = skins[skin];

  71.     for (let i = 0; i < snake.length; i++) {
  72.         context.fillStyle = i === 0 ? 'green' : colors.snake;
  73.         context.fillRect(snake[i].x, snake[i].y, box, box);
  74.     }

  75.     context.fillStyle = colors.food;
  76.     context.fillRect(food.x, food.y, box, box);

  77.     drawObstacles();

  78.     let snakeX = snake[0].x;
  79.     let snakeY = snake[0].y;

  80.     if (direction === 'LEFT') snakeX -= box;
  81.     if (direction === 'UP') snakeY -= box;
  82.     if (direction === 'RIGHT') snakeX += box;
  83.     if (direction === 'DOWN') snakeY += box;

  84.     if (snakeX === food.x && snakeY === food.y) {
  85.         score++;
  86.         updateHighScore();
  87.         document.getElementById('eatSound').play();
  88.         food = generateFood();
  89.     } else {
  90.         snake.pop();
  91.     }

  92.     let newHead = { x: snakeX, y: snakeY };

  93.     if (snakeX < 0) snakeX = canvas.width - box;
  94.     if (snakeY < 0) snakeY = canvas.height - box;
  95.     if (snakeX >= canvas.width) snakeX = 0;
  96.     if (snakeY >= canvas.height) snakeY = 0;

  97.     if (collision(newHead, snake) || collision(newHead, obstacles)) {
  98.         clearInterval(game);
  99.         clearInterval(timeCounter);
  100.         document.getElementById('crashSound').play();
  101.         alert('游戏结束');
  102.         return;
  103.     }

  104.     snake.unshift(newHead);

  105.     context.fillStyle = 'black';
  106.     context.font = '20px Arial';
  107.     context.fillText(`得分: ${score}`, 5, canvas.height - 5);
  108. }

  109. function collision(head, array) {
  110.     for (let i = 0; i < array.length; i++) {
  111.         if (head.x === array[i].x && head.y === array[i].y) {
  112.             return true;
  113.         }
  114.     }
  115.     return false;
  116. }

  117. function updateHighScore() {
  118.     if (score > highScore) {
  119.         highScore = score;
  120.         localStorage.setItem('highScore', highScore);
  121.         document.getElementById('highScore').innerText = highScore;
  122.     }
  123. }

  124. function updateTime() {
  125.     timeElapsed++;
  126.     document.getElementById('time').innerText = timeElapsed;
  127. }

  128. function generateFood() {
  129.     let newFood;
  130.     do {
  131.         newFood = {
  132.             x: Math.floor(Math.random() * 19 + 1) * box,
  133.             y: Math.floor(Math.random() * 19 + 1) * box
  134.         };
  135.     } while (collision(newFood, snake) || collision(newFood, obstacles));
  136.     return newFood;
  137. }

  138. function loadMap() {
  139.     const selectedMap = document.getElementById('map').value;
  140.     obstacles = maps[selectedMap] ? [...maps[selectedMap]] : [];
  141. }

  142. function drawObstacles() {
  143.     context.fillStyle = 'grey';
  144.     for (let i = 0; i < obstacles.length; i++) {
  145.         context.fillRect(obstacles[i].x, obstacles[i].y, box, box);
  146.     }
  147. }
复制代码


### 安装和运行游戏

1. **创建项目文件**:在一个新文件夹内创建三个文件:`index.html`, `style.css`, 和 `snake.js`。
2. **添加音效**:在项目根目录中放置`eat.mp3` 和 `crash.mp3` 音频文件,这两个文件分别为吃食物和撞墙时播放的音效。
3. **运行游戏**:用你的浏览器打开`index.html` 文件,即可运行游戏。

通过这些步骤,你可以完成一个具有多个地图、皮肤选择和音效的完整贪吃蛇游戏。如果有任何问题或进一步需求,请随时告诉我!享受编程和游戏的乐趣吧!
回复 支持 反对

使用道具 举报

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

本版积分规则

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