科学教育

搜索
查看: 3519|回复: 20
打印 上一主题 下一主题

你好

[复制链接]

29

主题

107

帖子

348

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
348
跳转到指定楼层
楼主
发表于 2024-6-25 19:38:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
你好,你可以写代码编一个贪吃蛇的网页游戏嘛
回复

使用道具 举报

0

主题

1147

帖子

1718

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1718
推荐
发表于 2024-6-25 19:38:26 | 只看该作者
当然可以!下面是一个简单的贪吃蛇网页游戏的基本实现。这将包括HTML、CSS和JavaScript。请按照以下步骤创建你的贪吃蛇游戏:

1. 创建 `index.html` 文件:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Snake Game</title>
  7.     <link rel="stylesheet" href="style.css">
  8. </head>
  9. <body>
  10.     <div class="game-container">
  11.         <canvas id="gameCanvas"></canvas>
  12.         <div id="score">Score: 0</div>
  13.     </div>
  14.     <script src="script.js"></script>
  15. </body>
  16. </html>
复制代码


2. 创建 `style.css` 文件:
  1. body {
  2.     display: flex;
  3.     justify-content: center;
  4.     align-items: center;
  5.     height: 100vh;
  6.     margin: 0;
  7.     background-color: #f0f0f0;
  8. }

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

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

  16. #score {
  17.     font-size: 24px;
  18.     margin-top: 10px;
  19. }
复制代码


3. 创建 `script.js` 文件:
  1. const canvas = document.getElementById('gameCanvas');
  2. const ctx = canvas.getContext('2d');

  3. const gridSize = 20;
  4. const tileCount = 20;
  5. let snake = [{ x: 10, y: 10 }];
  6. let direction = { x: 0, y: 0 };
  7. let apple = { x: 15, y: 15 };
  8. let score = 0;

  9. canvas.width = canvas.height = gridSize * tileCount;

  10. function draw() {
  11.     ctx.fillStyle = 'white';
  12.     ctx.fillRect(0, 0, canvas.width, canvas.height);

  13.     ctx.fillStyle = 'red';
  14.     ctx.fillRect(apple.x * gridSize, apple.y * gridSize, gridSize - 2, gridSize - 2);

  15.     ctx.fillStyle = 'green';
  16.     snake.forEach(part => {
  17.         ctx.fillRect(part.x * gridSize, part.y * gridSize, gridSize - 2, gridSize - 2);
  18.     });

  19.     requestAnimationFrame(update);
  20. }

  21. function update() {
  22.     const nextX = snake[0].x + direction.x;
  23.     const nextY = snake[0].y + direction.y;

  24.     if (nextX === apple.x && nextY === apple.y) {
  25.         score++;
  26.         document.getElementById('score').innerText = `Score: ${score}`;
  27.         apple.x = Math.floor(Math.random() * tileCount);
  28.         apple.y = Math.floor(Math.random() * tileCount);
  29.     } else {
  30.         snake.pop();
  31.     }

  32.     const newHead = { x: nextX, y: nextY };

  33.     if (
  34.         newHead.x < 0 || newHead.x >= tileCount ||
  35.         newHead.y < 0 || newHead.y >= tileCount ||
  36.         snake.some(part => part.x === newHead.x && part.y === newHead.y)
  37.     ) {
  38.         alert("Game Over");
  39.         snake = [{ x: 10, y: 10 }];
  40.         direction = { x: 0, y: 0 };
  41.         score = 0;
  42.         document.getElementById('score').innerText = `Score: ${score}`;
  43.         return;
  44.     }

  45.     snake.unshift(newHead);
  46.     requestAnimationFrame(draw);
  47. }

  48. window.addEventListener('keydown', e => {
  49.     switch (e.keyCode) {
  50.         case 37:
  51.             if (direction.x === 0) direction = { x: -1, y: 0 };
  52.             break;
  53.         case 38:
  54.             if (direction.y === 0) direction = { x: 0, y: -1 };
  55.             break;
  56.         case 39:
  57.             if (direction.x === 0) direction = { x: 1, y: 0 };
  58.             break;
  59.         case 40:
  60.             if (direction.y === 0) direction = { x: 0, y: 1 };
  61.             break;
  62.     }
  63. });

  64. requestAnimationFrame(draw);
复制代码


将这三个文件放在同一个目录下,然后打开 `index.html` 文件,你就可以玩这个简单的贪吃蛇游戏了。

这个版本只是一个非常基础的实现。如果你想增加更多功能(如不同难度、音效等),可以进一步扩展代码。
回复 支持 1 反对 0

使用道具 举报

0

主题

6

帖子

28

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
28
板凳
发表于 2024-6-25 19:40:03 | 只看该作者
好的,谢谢。你可以为我解释一下html和css、js的区别分别是什么吗
回复 支持 反对

使用道具 举报

29

主题

107

帖子

348

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
348
地板
 楼主| 发表于 2024-6-25 19:44:19 | 只看该作者
好的,谢谢。你可以为我解释一下html和css、js的区别分别是什么吗
回复 支持 反对

使用道具 举报

29

主题

107

帖子

348

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
348
5#
 楼主| 发表于 2024-6-25 19:54:16 | 只看该作者
好的,谢谢。你可以为我解释一下html和css、js的区别分别是什么吗@ai@kaia
回复 支持 反对

使用道具 举报

29

主题

107

帖子

348

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
348
6#
 楼主| 发表于 2024-6-25 20:07:31 | 只看该作者
kaia 发表于 2024-6-25 19:38
当然可以!下面是一个简单的贪吃蛇网页游戏的基本实现。这将包括HTML、CSS和JavaScript。请按照以下步骤创 ...

可以为我解释一下这三块代码的不同之处吗
回复 支持 反对

使用道具 举报

0

主题

1147

帖子

1718

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1718
7#
发表于 2024-6-25 20:08:19 | 只看该作者
ZLJ 发表于 2024-06-25 20:07
可以为我解释一下这三块代码的不同之处吗 ...


当然可以!我们可以将这个项目分为三部分: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>Snake Game</title>
  7.     <link rel="stylesheet" href="style.css">
  8. </head>
  9. <body>
  10.     <div class="game-container">
  11.         <canvas id="gameCanvas"></canvas>
  12.         <div id="score">Score: 0</div>
  13.     </div>
  14.     <script src="script.js"></script>
  15. </body>
  16. </html>
复制代码


**解释:**
- 这是一个基本的HTML页面结构。
- `<head>` 部分包含元数据(如字符编码、视口设置)和对外部CSS样式表 `style.css` 的引用。
- `<body>` 部分包含一个 `div`,其中包含一个 `canvas` 元素(用于绘制游戏图形)和一个 `div` 用于显示得分。
- `<script>` 标签在页面底部加载 `script.js` 文件,它包含了游戏的逻辑。

### 2. CSS (`style.css`)

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

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

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

  16. #score {
  17.     font-size: 24px;
  18.     margin-top: 10px;
  19. }
复制代码


**解释:**
- `body`: 设置整个页面布局,使其内容居中,并设置高度、外边距和背景颜色。
- `.game-container`: 设置游戏容器的文本对齐方式。
- `#gameCanvas`: 为画布添加边框和背景颜色。
- `#score`: 设置得分显示的字体大小和外边距。

### 3. JavaScript (`script.js`)

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

  3. const gridSize = 20;
  4. const tileCount = 20;
  5. let snake = [{ x: 10, y: 10 }];
  6. let direction = { x: 0, y: 0 };
  7. let apple = { x: 15, y: 15 };
  8. let score = 0;

  9. canvas.width = canvas.height = gridSize * tileCount;

  10. function draw() {
  11.     ctx.fillStyle = 'white';
  12.     ctx.fillRect(0, 0, canvas.width, canvas.height);

  13.     ctx.fillStyle = 'red';
  14.     ctx.fillRect(apple.x * gridSize, apple.y * gridSize, gridSize - 2, gridSize - 2);

  15.     ctx.fillStyle = 'green';
  16.     snake.forEach(part => {
  17.         ctx.fillRect(part.x * gridSize, part.y * gridSize, gridSize - 2, gridSize - 2);
  18.     });

  19.     requestAnimationFrame(update);
  20. }

  21. function update() {
  22.     const nextX = snake[0].x + direction.x;
  23.     const nextY = snake[0].y + direction.y;

  24.     if (nextX === apple.x && nextY === apple.y) {
  25.         score++;
  26.         document.getElementById('score').innerText = `Score: ${score}`;
  27.         apple.x = Math.floor(Math.random() * tileCount);
  28.         apple.y = Math.floor(Math.random() * tileCount);
  29.     } else {
  30.         snake.pop();
  31.     }

  32.     const newHead = { x: nextX, y: nextY };

  33.     if (
  34.         newHead.x < 0 || newHead.x >= tileCount ||
  35.         newHead.y < 0 || newHead.y >= tileCount ||
  36.         snake.some(part => part.x === newHead.x && part.y === newHead.y)
  37.     ) {
  38.         alert("Game Over");
  39.         snake = [{ x: 10, y: 10 }];
  40.         direction = { x: 0, y: 0 };
  41.         score = 0;
  42.         document.getElementById('score').innerText = `Score: ${score}`;
  43.         return;
  44.     }

  45.     snake.unshift(newHead);
  46.     requestAnimationFrame(draw);
  47. }

  48. window.addEventListener('keydown', e => {
  49.     switch (e.keyCode) {
  50.         case 37:
  51.             if (direction.x === 0) direction = { x: -1, y: 0 };
  52.             break;
  53.         case 38:
  54.             if (direction.y === 0) direction = { x: 0, y: -1 };
  55.             break;
  56.         case 39:
  57.             if (direction.x === 0) direction = { x: 1, y: 0 };
  58.             break;
  59.         case 40:
  60.             if (direction.y === 0) direction = { x: 0, y: 1 };
  61.             break;
  62.     }
  63. });

  64. requestAnimationFrame(draw);
复制代码


**解释:**
- 定义了几个变量来设置画布、格子大小、贪吃蛇、方向、苹果位置和得分。
- 设置画布的宽度和高度。
- `draw()` 函数用于绘制画布,包括清除先前的画面、画出苹果和贪吃蛇。
- `update()` 函数用于更新贪吃蛇的位置、检测碰撞并处理得分和游戏结束的逻辑。
- 通过 `window.addEventListener('keydown', ...)` 来监听键盘事件,更改贪吃蛇的方向。
- 使用 `requestAnimationFrame(draw)` 不断调用 `draw` 方法来刷新画布,形成动画效果。

通过这三部分代码共同作用,你就能够实现一个简单的网页贪吃蛇游戏。希望这些解释能帮你理解代码的不同部分以及它们如何协同工作来创建一个完整的游戏。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

14

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
14
8#
发表于 2024-6-25 20:14:41 | 只看该作者
kaia 发表于 2024-6-25 20:08
当然可以!我们可以将这个项目分为三部分:HTML、CSS和JavaScript,每一部分都有其特定的功能。

### 1.  ...

这段代码是什么意思?
  1. window.addEventListener('keydown', e => {
  2.     switch (e.keyCode) {
  3.         case 37:
  4.             if (direction.x === 0) direction = { x: -1, y: 0 };
  5.             break;
  6.         case 38:
  7.             if (direction.y === 0) direction = { x: 0, y: -1 };
  8.             break;
  9.         case 39:
  10.             if (direction.x === 0) direction = { x: 1, y: 0 };
  11.             break;
  12.         case 40:
  13.             if (direction.y === 0) direction = { x: 0, y: 1 };
  14.             break;
  15.     }
  16. });
复制代码
回复 支持 反对

使用道具 举报

0

主题

6

帖子

28

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
28
9#
发表于 2024-6-25 20:14:51 | 只看该作者
kaia 发表于 2024-6-25 20:08
当然可以!我们可以将这个项目分为三部分:HTML、CSS和JavaScript,每一部分都有其特定的功能。

### 1.  ...

谢谢,可以解释一下js文件里的事件是什么概念吗
回复 支持 反对

使用道具 举报

0

主题

1147

帖子

1718

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1718
10#
发表于 2024-6-25 20:15:05 | 只看该作者
chenr 发表于 2024-06-25 20:14
这段代码是什么意思?
window.addEventListener('keyd ...


这段代码用于监听键盘事件,以便控制贪吃蛇的移动方向。让我们逐行解析这个代码块:

  1. window.addEventListener('keydown', e => {
  2.     switch (e.keyCode) {
  3.         case 37:
  4.             if (direction.x === 0) direction = { x: -1, y: 0 };
  5.             break;
  6.         case 38:
  7.             if (direction.y === 0) direction = { x: 0, y: -1 };
  8.             break;
  9.         case 39:
  10.             if (direction.x === 0) direction = { x: 1, y: 0 };
  11.             break;
  12.         case 40:
  13.             if (direction.y === 0) direction = { x: 0, y: 1 };
  14.             break;
  15.     }
  16. });
复制代码


### 详细解释

1. **`window.addEventListener('keydown', e => { ... });`**
   - 这一行代码为 `window` 对象添加了一个事件监听器,监听 `keydown` 事件。当键盘按键被按下时,会触发这个监听器,并将事件对象 `e` 传递给处理函数。

2. **`switch (e.keyCode) { ... }`**
   - 使用 `switch` 语句来根据 `e.keyCode` 的值选择不同的分支。`e.keyCode` 表示键盘按键的编码。

3. **处理不同的键码**
   - **`case 37:`** (左箭头键)
   
  1. if (direction.x === 0) direction = { x: -1, y: 0 };
  2.      break;
复制代码

     当检测到左箭头键被按下(键码37),且当前蛇的水平方向为0(确保蛇不能直接反向移动),将蛇的移动方向设置为左(水平移动 `-1`,垂直移动 `0`)。
   
   - **`case 38:`** (上箭头键)
   
  1. if (direction.y === 0) direction = { x: 0, y: -1 };
  2.      break;
复制代码

     当检测到上箭头键被按下(键码38),且当前蛇的垂直方向为0,将蛇的移动方向设置为上(水平移动 `0`,垂直移动 `-1`)。
   
   - **`case 39:`** (右箭头键)
   
  1. if (direction.x === 0) direction = { x: 1, y: 0 };
  2.      break;
复制代码

     当检测到右箭头键被按下(键码39),且当前蛇的水平方向为0,将蛇的移动方向设置为右(水平移动 `1`,垂直移动 `0`)。
   
   - **`case 40:`** (下箭头键)
   
  1. if (direction.y === 0) direction = { x: 0, y: 1 };
  2.      break;
复制代码

     当检测到下箭头键被按下(键码40),且当前蛇的垂直方向为0,将蛇的移动方向设置为下(水平移动 `0`,垂直移动 `1`)。

### 目的
这段代码的主要功能是通过监听键盘按键来改变贪吃蛇的移动方向。为了避免蛇直接反向移动(比如,蛇正在向右移动时,用户按下左箭头键),在每个条件中都检查了当前的移动方向。如果蛇正在水平移动(`direction.x !== 0`),就不允许再水平反向移动;如果蛇正在垂直移动(`direction.y !== 0`),就不允许再垂直反向移动。这一规则防止了游戏中的蛇自咬,从而使游戏更容易控制。
回复 支持 反对

使用道具 举报

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

本版积分规则

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