科学教育

搜索
查看: 3601|回复: 9
打印 上一主题 下一主题

YANGBIEI

[复制链接]

1

主题

6

帖子

21

积分

新手上路

Rank: 1

积分
21
跳转到指定楼层
楼主
发表于 2024-8-19 15:23:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
讲解下逆向工程的思路
回复

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
沙发
发表于 2024-8-19 15:23:35 | 只看该作者
好呀!逆向工程听起来有点复杂,但是我们可以简单形象地理解它。你可以把它想象成倒着看一幅画,或是吃完一块蛋糕后猜猜里面都放了哪些材料。

### 什么是逆向工程?
逆向工程就像是把已经做好的东西,比如一个玩具、一个软件或一个网站,重新拆解开来,并弄清楚它是怎么做成的。

### 逆向工程怎么做?
假设你有一个很喜欢的网站,你想知道它是怎么编的,那你可以按以下步骤进行逆向工程:

#### 1. **观察:**
你可以先打开这个网站,好好看一看它的样子:有什么颜色?有什么按钮?有动画吗?每个部分是怎么排布的?

#### 2. **查看源码:**
大多数浏览器都有一个功能叫“查看页面源代码”。你可以右键点击网页上的空白处,然后选择“查看页面源代码”。这样,你就能看到这个网页背后的代码啦!

#### 3. **学习代码:**
刚开始看到这么多代码可能会有点晕,不过别担心。你可以一步一步来,首先找一些熟悉的标签,比如 `<html>`, `<body>`, `<div>` 等等。通过这些标签你可以尝试理解网页的结构。

#### 4. **实验改动:**
你可以把这些代码复制到自己的电脑上,然后尝试在本地打开这个网页。然后,你可以做一些小小的修改,比如改一下颜色,看看会发生什么变化。这样你就能慢慢学会这些代码是怎么作用的了。

### 打个比方
逆向工程就像是你吃了一块非常美味的蛋糕,想要自己也做出来。你可以:
1. **品尝蛋糕**:先认真品尝,把蛋糕的口感、味道记下来。
2. **分析成分**:猜猜看到底用了哪些材料,糖、奶油还是巧克力?
3. **实验制作**:你可以尝试用这些材料自己做一块蛋糕,不断调整比例,直到味道和原来的蛋糕一样。

那我们学网页编程的时候,也可以用这种方法来解读现成的网站,从中学习到很多知识。

希望这些解释对你有帮助!如果还有不懂的地方,随时问哦!
回复 支持 反对

使用道具 举报

1

主题

6

帖子

21

积分

新手上路

Rank: 1

积分
21
板凳
 楼主| 发表于 2024-8-19 16:02:02 | 只看该作者
请帮我生成一个贪吃蛇的网页代码,用HTML ,js,css来完成
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
地板
发表于 2024-8-19 16:02:37 | 只看该作者
yangbiei 发表于 2024-08-19 16:02
请帮我生成一个贪吃蛇的网页代码,用HTML ,js,css来完 ...


当然可以!下面是一个简单的贪吃蛇游戏实现,使用了HTML、CSS和JavaScript。我们会一步步来解释每一段代码。

### HTML部分
HTML部分定义了网页的基本结构和内容,这里我们主要需要一个画布(canvas)来绘制游戏。

  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="style.css">
  8. </head>
  9. <body>
  10.   <canvas id="gameCanvas"></canvas>
  11.   <script src="script.js"></script>
  12. </body>
  13. </html>
复制代码


### CSS部分
CSS部分定义了网页的样式,这里我们主要对画布进行一些简单的设置。

  1. /* style.css */

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

  10. #gameCanvas {
  11.   border: 1px solid #000;
  12.   background-color: #fff;
  13. }
复制代码


### JavaScript部分
JavaScript部分实现了贪吃蛇的逻辑,包括蛇的移动、食物生成以及碰撞检测。

  1. // script.js

  2. const canvas = document.getElementById("gameCanvas");
  3. const ctx = canvas.getContext("2d");

  4. const gridSize = 20; // 网格大小
  5. const canvasSize = 400; // 画布大小
  6. canvas.width = canvas.height = canvasSize;

  7. let snake = [{ x: 200, y: 200 }]; // 蛇的初始位置
  8. let food = generateFood();
  9. let dx = gridSize; // 水平方向速度
  10. let dy = 0; // 垂直方向速度
  11. let score = 0;

  12. // 监听键盘事件
  13. document.addEventListener("keydown", changeDirection);

  14. function main() {
  15.     if (gameOver()) return;

  16.     setTimeout(function onTick() {
  17.         clearCanvas();
  18.         drawFood();
  19.         moveSnake();
  20.         drawSnake();
  21.         main();
  22.     }, 100);
  23. }

  24. function clearCanvas() {
  25.     ctx.fillStyle = "white";
  26.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  27. }

  28. function drawSnake() {
  29.     ctx.fillStyle = "green";
  30.     snake.forEach(part => {
  31.         ctx.fillRect(part.x, part.y, gridSize, gridSize);
  32.     });
  33. }

  34. function moveSnake() {
  35.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  36.     snake.unshift(head);

  37.     // 如果吃到食物就生成新的食物,否则移除蛇尾
  38.     if (head.x === food.x && head.y === food.y) {
  39.         food = generateFood();
  40.         score += 10;
  41.     } else {
  42.         snake.pop();
  43.     }
  44. }

  45. function drawFood() {
  46.     ctx.fillStyle = "red";
  47.     ctx.fillRect(food.x, food.y, gridSize, gridSize);
  48. }

  49. function generateFood() {
  50.     let x, y;
  51.     do {
  52.         x = Math.floor(Math.random() * (canvasSize / gridSize)) * gridSize;
  53.         y = Math.floor(Math.random() * (canvasSize / gridSize)) * gridSize;
  54.     } while (snake.some(part => part.x === x && part.y === y));
  55.     return { x, y };
  56. }

  57. function changeDirection(event) {
  58.     const LEFT_KEY = 37;
  59.     const RIGHT_KEY = 39;
  60.     const UP_KEY = 38;
  61.     const DOWN_KEY = 40;

  62.     const keyPressed = event.keyCode;
  63.     const goingUp = dy === -gridSize;
  64.     const goingDown = dy === gridSize;
  65.     const goingRight = dx === gridSize;
  66.     const goingLeft = dx === -gridSize;

  67.     if (keyPressed === LEFT_KEY && !goingRight) {
  68.         dx = -gridSize;
  69.         dy = 0;
  70.     }
  71.     if (keyPressed === UP_KEY && !goingDown) {
  72.         dx = 0;
  73.         dy = -gridSize;
  74.     }
  75.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  76.         dx = gridSize;
  77.         dy = 0;
  78.     }
  79.     if (keyPressed === DOWN_KEY && !goingUp) {
  80.         dx = 0;
  81.         dy = gridSize;
  82.     }
  83. }

  84. function gameOver() {
  85.     for (let i = 4; i < snake.length; i++) {
  86.         if (snake[i].x === snake[0].x && snake[i].y === snake[0].y) return true;
  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.     return hitLeftWall || hitRightWall || hitTopWall || hitBottomWall;
  93. }

  94. main();
复制代码


### 解释
1. **HTML部分**:创建了一个画布用于游戏显示,并引入了CSS和JavaScript文件。
2. **CSS部分**:设置了页面的基本样式,使画布居中显示,并添加边框。
3. **JavaScript部分**:
   - **变量初始化**:定义了网格大小、画布大小、蛇的初始位置等。
   - **主循环**:`main()` 函数是游戏的主循环,每100毫秒更新一次游戏状态。
   - **画布清理和绘制**:分别用 `clearCanvas()` 和 `drawSnake()` 函数来清理和绘制蛇。
   - **蛇的移动**:`moveSnake()` 函数负责蛇的移动,同时检查是否吃到了食物。
   - **食物生成**:`generateFood()` 函数随机生成不出现在蛇身上的食物。
   - **方向改变**:`changeDirection()` 函数根据箭头键改变蛇的移动方向。
   - **游戏结束**:`gameOver()` 函数检查蛇是否撞到自己或墙壁。

这个简单的贪吃蛇小游戏通过三部分组合,在浏览器中可以运行,赶紧试试吧!如果有任何问题,可以随时问我哦!
回复 支持 反对

使用道具 举报

1

主题

6

帖子

21

积分

新手上路

Rank: 1

积分
21
5#
 楼主| 发表于 2024-8-19 16:10:32 | 只看该作者
请优化游戏,加上开始,重新开始,得分结束,并且游戏速度可自行调节
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
6#
发表于 2024-8-19 16:10:50 | 只看该作者
yangbiei 发表于 2024-08-19 16:10
请优化游戏,加上开始,重新开始,得分结束,并且游戏 ...


好的!我们来进一步优化这个贪吃蛇游戏,增加以下功能:
1. 开始游戏
2. 重新开始
3. 显示得分
4. 游戏结束提示
5. 游戏速度可调节

### 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>贪吃蛇游戏</title>
  7.     <link rel="stylesheet" href="style.css">
  8. </head>
  9. <body>
  10.     <div id="gameContainer">
  11.         <canvas id="gameCanvas"></canvas>
  12.         <div id="score">得分: 0</div>
  13.         <div id="controls">
  14.             <button id="startBtn">开始游戏</button>
  15.             <button id="resetBtn">重新开始</button>
  16.             <label for="speed">速度:</label>
  17.             <input id="speed" type="number" min="50" max="500" value="100">
  18.         </div>
  19.     </div>
  20.     <script src="script.js"></script>
  21. </body>
  22. </html>
复制代码


### 2. CSS部分
设置页面样式,使游戏界面更美观。

  1. /* style.css */

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

  10. #gameContainer {
  11.     text-align: center;
  12. }

  13. #gameCanvas {
  14.     border: 1px solid #000;
  15.     background-color: #fff;
  16. }

  17. #controls {
  18.     margin-top: 10px;
  19. }

  20. button, input {
  21.     margin: 5px;
  22. }
复制代码


### 3. JavaScript部分
实现游戏逻辑,包括新的功能。

  1. // script.js

  2. const canvas = document.getElementById("gameCanvas");
  3. const ctx = canvas.getContext("2d");
  4. const scoreDisplay = document.getElementById("score");
  5. const startBtn = document.getElementById("startBtn");
  6. const resetBtn = document.getElementById("resetBtn");
  7. const speedInput = document.getElementById("speed");

  8. const gridSize = 20; // 网格大小
  9. const canvasSize = 400; // 画布大小
  10. canvas.width = canvas.height = canvasSize;

  11. let snake, food, dx, dy, score, gameSpeed, gameInterval;

  12. startBtn.addEventListener("click", startGame);
  13. resetBtn.addEventListener("click", resetGame);
  14. document.addEventListener("keydown", changeDirection);

  15. function startGame() {
  16.     resetGame();
  17.     main();
  18. }

  19. function resetGame() {
  20.     clearInterval(gameInterval);
  21.     snake = [{ x: gridSize * 5, y: gridSize * 5 }];
  22.     dx = gridSize;
  23.     dy = 0;
  24.     score = 0;
  25.     gameSpeed = parseInt(speedInput.value);
  26.     food = generateFood();
  27.     updateScore();
  28.     clearCanvas();
  29.     drawSnake();
  30.     drawFood();
  31. }

  32. function main() {
  33.     gameInterval = setInterval(function onTick() {
  34.         if (gameOver()) {
  35.             clearInterval(gameInterval);
  36.             alert('游戏结束!');
  37.             return;
  38.         }
  39.         clearCanvas();
  40.         drawFood();
  41.         moveSnake();
  42.         drawSnake();
  43.     }, gameSpeed);
  44. }

  45. function clearCanvas() {
  46.     ctx.fillStyle = "white";
  47.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  48. }

  49. function drawSnake() {
  50.     ctx.fillStyle = "green";
  51.     snake.forEach(part => {
  52.         ctx.fillRect(part.x, part.y, gridSize, gridSize);
  53.     });
  54. }

  55. function moveSnake() {
  56.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  57.     snake.unshift(head);

  58.     // 如果吃到食物就生成新的食物,否则移除蛇尾
  59.     if (head.x === food.x && head.y === food.y) {
  60.         food = generateFood();
  61.         score += 10;
  62.         updateScore();
  63.     } else {
  64.         snake.pop();
  65.     }
  66. }

  67. function drawFood() {
  68.     ctx.fillStyle = "red";
  69.     ctx.fillRect(food.x, food.y, gridSize, gridSize);
  70. }

  71. function generateFood() {
  72.     let x, y;
  73.     do {
  74.         x = Math.floor(Math.random() * (canvasSize / gridSize)) * gridSize;
  75.         y = Math.floor(Math.random() * (canvasSize / gridSize)) * gridSize;
  76.     } while (snake.some(part => part.x === x && part.y === y));
  77.     return { x, y };
  78. }

  79. function changeDirection(event) {
  80.     const LEFT_KEY = 37;
  81.     const RIGHT_KEY = 39;
  82.     const UP_KEY = 38;
  83.     const DOWN_KEY = 40;

  84.     const keyPressed = event.keyCode;
  85.     const goingUp = dy === -gridSize;
  86.     const goingDown = dy === gridSize;
  87.     const goingRight = dx === gridSize;
  88.     const goingLeft = dx === -gridSize;

  89.     if (keyPressed === LEFT_KEY && !goingRight) {
  90.         dx = -gridSize;
  91.         dy = 0;
  92.     }
  93.     if (keyPressed === UP_KEY && !goingDown) {
  94.         dx = 0;
  95.         dy = -gridSize;
  96.     }
  97.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  98.         dx = gridSize;
  99.         dy = 0;
  100.     }
  101.     if (keyPressed === DOWN_KEY && !goingUp) {
  102.         dx = 0;
  103.         dy = gridSize;
  104.     }
  105. }

  106. function gameOver() {
  107.     for (let i = 4; i < snake.length; i++) {
  108.         if (snake[0].x === snake[i].x && snake[0].y === snake[i].y) return true;
  109.     }

  110.     const hitLeftWall = snake[0].x < 0;
  111.     const hitRightWall = snake[0].x >= canvas.width;
  112.     const hitTopWall = snake[0].y < 0;
  113.     const hitBottomWall = snake[0].y >= canvas.height;

  114.     return hitLeftWall || hitRightWall || hitTopWall || hitBottomWall;
  115. }

  116. function updateScore() {
  117.     scoreDisplay.textContent = `得分: ${score}`;
  118. }
复制代码


### 解释

1. **HTML部分**:增加了开始按钮、重新开始按钮、速度输入框以及一个显示得分的 `div`。
2. **CSS部分**:调整了布局,使得控制按钮能够较好地展示。
3. **JavaScript部分**:
   - **新增变量**:用于保存游戏状态及控制元素。
   - **开始游戏和重新开始函数**:控制游戏的启动和重置。
   - **主循环函数**:将游戏核心逻辑封装在 `main()` 函数中,用 `setInterval` 控制游戏速度。
   - **更新得分函数**:在每次吃到食物并增加得分后更新显示。

通过这些调整,我们可以实现更加优化的贪吃蛇游戏,包括开始、重置、得分、结束提示等功能,并且能够调节游戏速度。希望你喜欢这个优化版的贪吃蛇游戏!如果有任何问题,随时问我哦!
回复 支持 反对

使用道具 举报

1

主题

6

帖子

21

积分

新手上路

Rank: 1

积分
21
7#
 楼主| 发表于 2024-8-20 09:24:13 | 只看该作者
把按键得分之类放入游戏界面里面。按键颜色改成相反,背景改成全黑 @AI
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
8#
发表于 2024-8-20 09:24:32 | 只看该作者
yangbiei 发表于 2024-08-20 09:24
把按键得分之类放入游戏界面里面。按键颜色改成相反, ...


好呀!我们来一步步把这些功能加到我们的网页游戏中。我们用HTML和CSS来实现这个界面效果。

### 第一步:创建基本的HTML

首先,我们需要一个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="style.css">
  7. </head>
  8. <body>
  9.     <div id="game-container">
  10.         <div id="score">得分: 0</div>
  11.         <button id="game-button">按我得分</button>
  12.     </div>
  13.     <script src="script.js"></script>
  14. </body>
  15. </html>
复制代码


### 第二步:创建CSS样式表

CSS是用来设计网页外观的。我们会用CSS来改变按钮的颜色和背景颜色。

  1. /* style.css */
  2. body {
  3.     background-color: black; /* 设置背景为全黑 */
  4.     color: white;            /* 设置文字颜色为白色,这样在黑色背景上看得清楚 */
  5.     display: flex;
  6.     justify-content: center;
  7.     align-items: center;
  8.     height: 100vh;
  9.     margin: 0;
  10. }

  11. #game-container {
  12.     text-align: center;
  13. }

  14. #score {
  15.     font-size: 2em;
  16.     margin-bottom: 20px;
  17. }

  18. #game-button {
  19.     background-color: white; /* 按钮背景颜色为白色 */
  20.     color: black;            /* 按钮文字颜色为黑色 */
  21.     border: none;
  22.     padding: 10px 20px;
  23.     font-size: 1.5em;
  24.     cursor: pointer;
  25. }

  26. #game-button:hover {
  27.     background-color: black; /* 鼠标悬停时,背景颜色变为黑色 */
  28.     color: white;            /* 鼠标悬停时,文字颜色变为白色 */
  29.     border: 1px solid white;
  30. }
复制代码


### 第三步:添加JavaScript功能

JavaScript是用来给网页添加互动功能的。我们来写一个小脚本,当玩家按下按钮时可以增加得分。

  1. // script.js
  2. let score = 0; // 初始化得分为0

  3. document.getElementById('game-button').addEventListener('click', function() {
  4.     score += 1; // 每次点击按钮时,得分加1
  5.     document.getElementById('score').textContent = '得分: ' + score; // 更新显示的得分
  6. });
复制代码


### 整体流程

1. **HTML**:负责网页的结构,摆放“得分”和“按键”的位置。
2. **CSS**:负责网页的样式,比如给背景设置成黑色,给按钮设置成相反颜色。
3. **JavaScript**:负责网页的功能,当按下按钮时,更新得分。

### 完整代码

你可以将下面的代码保存到三个文件中,分别命名为`index.html`,`style.css`和`script.js`,然后直接在浏览器中打开`index.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="style.css">
  7. </head>
  8. <body>
  9.     <div id="game-container">
  10.         <div id="score">得分: 0</div>
  11.         <button id="game-button">按我得分</button>
  12.     </div>
  13.     <script src="script.js"></script>
  14. </body>
  15. </html>
复制代码


#### style.css

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

  10. #game-container {
  11.     text-align: center;
  12. }

  13. #score {
  14.     font-size: 2em;
  15.     margin-bottom: 20px;
  16. }

  17. #game-button {
  18.     background-color: white;
  19.     color: black;
  20.     border: none;
  21.     padding: 10px 20px;
  22.     font-size: 1.5em;
  23.     cursor: pointer;
  24. }

  25. #game-button:hover {
  26.     background-color: black;
  27.     color: white;
  28.     border: 1px solid white;
  29. }
复制代码


#### script.js

  1. let score = 0;

  2. document.getElementById('game-button').addEventListener('click', function() {
  3.     score += 1;
  4.     document.getElementById('score').textContent = '得分: ' + score;
  5. });
复制代码


这样,我们的网页游戏就做好啦!有不明白的地方随时问我哦!
回复 支持 反对

使用道具 举报

1

主题

6

帖子

21

积分

新手上路

Rank: 1

积分
21
9#
 楼主| 发表于 2024-8-20 09:27:09 | 只看该作者
贪吃蛇游戏,增加以下功能:
1. 开始游戏
2. 重新开始
3. 显示得分
4. 游戏结束提示
5. 游戏速度可调节
背景改成全黑,按键改成白底黑色字,增加的功能放入游戏主体内
回复 支持 反对

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
10#
发表于 2024-8-20 09:27:39 | 只看该作者
yangbiei 发表于 2024-08-20 09:27
贪吃蛇游戏,增加以下功能:
1. 开始游戏
2. 重新开始 ...


好的!我们来实现一个优化版的贪吃蛇游戏,满足以下要求:
1. 开始游戏
2. 重新开始
3. 显示得分
4. 游戏结束提示
5. 游戏速度可调节
6. 背景全黑,按键白底黑字

### 1. HTML 部分
我们需要增加按钮和显示区域,并引入 CSS 和 JavaScript 文件。

  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.     <div id="game-container">
  11.         <canvas id="gameCanvas"></canvas>
  12.         <div id="score">得分: 0</div>
  13.         <div id="controls">
  14.             <button id="startBtn">开始游戏</button>
  15.             <button id="resetBtn">重新开始</button>
  16.             <label for="speed">速度:</label>
  17.             <input type="number" id="speed" min="50" max="500" value="200">
  18.         </div>
  19.     </div>
  20.     <script src="script.js"></script>
  21. </body>
  22. </html>
复制代码


### 2. CSS 部分
设置背景颜色、按钮样式等。

  1. /* style.css */
  2. body {
  3.     background-color: black;
  4.     color: white;
  5.     display: flex;
  6.     justify-content: center;
  7.     align-items: center;
  8.     height: 100vh;
  9.     margin: 0;
  10. }

  11. #game-container {
  12.     text-align: center;
  13. }

  14. #gameCanvas {
  15.     border: 1px solid #fff;
  16.     background-color: #000;
  17. }

  18. #score {
  19.     font-size: 2em;
  20.     margin-top: 10px;
  21. }

  22. #controls {
  23.     margin-top: 20px;
  24. }

  25. button, input {
  26.     margin-right: 10px;
  27.     padding: 10px 20px;
  28.     font-size: 1em;
  29.     background-color: white;
  30.     color: black;
  31.     border: none;
  32.     cursor: pointer;
  33. }

  34. button:hover, input:hover {
  35.     background-color: black;
  36.     color: white;
  37.     border: 1px solid white;
  38. }
复制代码


### 3. JavaScript 部分
实现贪吃蛇的主要逻辑和功能。

  1. // script.js
  2. const canvas = document.getElementById("gameCanvas");
  3. const ctx = canvas.getContext("2d");
  4. const scoreDisplay = document.getElementById("score");
  5. const startBtn = document.getElementById("startBtn");
  6. const resetBtn = document.getElementById("resetBtn");
  7. const speedInput = document.getElementById("speed");

  8. const gridSize = 20; // 网格大小
  9. const canvasSize = 400; // 画布大小
  10. canvas.width = canvas.height = canvasSize;

  11. let snake, food, dx, dy, score, gameSpeed, gameInterval;

  12. startBtn.addEventListener("click", startGame);
  13. resetBtn.addEventListener("click", resetGame);
  14. document.addEventListener("keydown", changeDirection);

  15. function startGame() {
  16.     resetGame();
  17.     main();
  18. }

  19. function resetGame() {
  20.     clearInterval(gameInterval);
  21.     snake = [{ x: gridSize * 5, y: gridSize * 5 }];
  22.     dx = gridSize;
  23.     dy = 0;
  24.     score = 0;
  25.     gameSpeed = parseInt(speedInput.value);
  26.     food = generateFood();
  27.     updateScore();
  28.     clearCanvas();
  29.     drawSnake();
  30.     drawFood();
  31. }

  32. function main() {
  33.     gameInterval = setInterval(function onTick() {
  34.         if (gameOver()) {
  35.             clearInterval(gameInterval);
  36.             alert('游戏结束!');
  37.             return;
  38.         }
  39.         clearCanvas();
  40.         drawFood();
  41.         moveSnake();
  42.         drawSnake();
  43.     }, gameSpeed);
  44. }

  45. function clearCanvas() {
  46.     ctx.fillStyle = "black";
  47.     ctx.fillRect(0, 0, canvas.width, canvas.height);
  48. }

  49. function drawSnake() {
  50.     ctx.fillStyle = "green";
  51.     snake.forEach(part => {
  52.         ctx.fillRect(part.x, part.y, gridSize, gridSize);
  53.     });
  54. }

  55. function moveSnake() {
  56.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  57.     snake.unshift(head);

  58.     if (head.x === food.x && head.y === food.y) {
  59.         food = generateFood();
  60.         score += 10;
  61.         updateScore();
  62.     } else {
  63.         snake.pop();
  64.     }
  65. }

  66. function drawFood() {
  67.     ctx.fillStyle = "red";
  68.     ctx.fillRect(food.x, food.y, gridSize, gridSize);
  69. }

  70. function generateFood() {
  71.     let x, y;
  72.     do {
  73.         x = Math.floor(Math.random() * (canvasSize / gridSize)) * gridSize;
  74.         y = Math.floor(Math.random() * (canvasSize / gridSize)) * gridSize;
  75.     } while (snake.some(part => part.x === x && part.y === y));
  76.     return { x, y };
  77. }

  78. function changeDirection(event) {
  79.     const LEFT_KEY = 37;
  80.     const RIGHT_KEY = 39;
  81.     const UP_KEY = 38;
  82.     const DOWN_KEY = 40;

  83.     const keyPressed = event.keyCode;
  84.     const goingUp = dy === -gridSize;
  85.     const goingDown = dy === gridSize;
  86.     const goingRight = dx === gridSize;
  87.     const goingLeft = dx === -gridSize;

  88.     if (keyPressed === LEFT_KEY && !goingRight) {
  89.         dx = -gridSize;
  90.         dy = 0;
  91.     }
  92.     if (keyPressed === UP_KEY && !goingDown) {
  93.         dx = 0;
  94.         dy = -gridSize;
  95.     }
  96.     if (keyPressed === RIGHT_KEY && !goingLeft) {
  97.         dx = gridSize;
  98.         dy = 0;
  99.     }
  100.     if (keyPressed === DOWN_KEY && !goingUp) {
  101.         dx = 0;
  102.         dy = gridSize;
  103.     }
  104. }

  105. function gameOver() {
  106.     for (let i = 4; i < snake.length; i++) {
  107.         if (snake[i].x === snake[0].x && snake[i].y === snake[0].y) return true;
  108.     }

  109.     const hitLeftWall = snake[0].x < 0;
  110.     const hitRightWall = snake[0].x >= canvas.width;
  111.     const hitTopWall = snake[0].y < 0;
  112.     const hitBottomWall = snake[0].y >= canvas.height;

  113.     return hitLeftWall || hitRightWall || hitTopWall || hitBottomWall;
  114. }

  115. function updateScore() {
  116.     scoreDisplay.textContent = `得分: ${score}`;
  117. }

  118. startGame(); // 初次加载页面时自动开始游戏
复制代码


这样,我们就完成了一个功能齐全的贪吃蛇游戏。你可以将上面的代码分别保存到 `index.html`、`style.css` 和 `script.js` 三个文件中,然后在浏览器中打开 `index.html` 就能看到效果了。如果有任何问题,随时问我哦!
回复 支持 反对

使用道具 举报

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

本版积分规则

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