科学教育

搜索
楼主: 韦恩
打印 上一主题 下一主题

1

[复制链接]

0

主题

1147

帖子

1718

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1718
11#
发表于 2025-12-9 15:08:04 | 只看该作者
韦恩 发表于 2025-12-09 15:07
需要。。。。。。。。。


你好!我帮你把贪吃蛇代码改成用WASD控制方向的版本,下面是完整修改后的代码,你可以复制保存成HTML文件,然后打开玩玩看哦:

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4.   <meta charset="UTF-8" />
  5.   <title>贪吃蛇游戏-WASD控制</title>
  6.   <style>
  7.     body {
  8.       text-align: center;
  9.       margin-top: 20px;
  10.       font-family: Arial, sans-serif;
  11.     }
  12.     #gameCanvas {
  13.       background-color: #000;
  14.       display: block;
  15.       margin: 0 auto;
  16.       border: 2px solid #333;
  17.     }
  18.     #startButton {
  19.       margin-top: 15px;
  20.       padding: 10px 20px;
  21.       font-size: 16px;
  22.     }
  23.     #scoreDisplay {
  24.       margin-top: 10px;
  25.       color: green;
  26.       font-weight: bold;
  27.     }
  28.   </style>
  29. </head>
  30. <body>
  31.   <canvas id="gameCanvas" width="400" height="400"></canvas>
  32.   <div>
  33.     <button id="startButton">开始游戏</button>
  34.   </div>
  35.   <div id="scoreDisplay">得分: 0</div>

  36.   <script>
  37.     const canvas = document.getElementById("gameCanvas");
  38.     const context = canvas.getContext("2d");
  39.     const startButton = document.getElementById("startButton");
  40.     const scoreDisplay = document.getElementById("scoreDisplay");

  41.     const gridSize = 20;
  42.     let snake = [];
  43.     let food = { x: 0, y: 0 };
  44.     let dx = gridSize;
  45.     let dy = 0;
  46.     let score = 0;
  47.     let game; // 计时器句柄

  48.     function drawSnake() {
  49.       context.clearRect(0, 0, canvas.width, canvas.height);
  50.       snake.forEach(part => {
  51.         context.fillStyle = "green";
  52.         context.fillRect(part.x, part.y, gridSize, gridSize);
  53.       });
  54.     }

  55.     function generateFood() {
  56.       food.x = Math.floor(Math.random() * (canvas.width / gridSize)) * gridSize;
  57.       food.y = Math.floor(Math.random() * (canvas.height / gridSize)) * gridSize;

  58.       // 确保食物不生成在蛇身上
  59.       while (snake.some(part => part.x === food.x && part.y === food.y)) {
  60.         food.x = Math.floor(Math.random() * (canvas.width / gridSize)) * gridSize;
  61.         food.y = Math.floor(Math.random() * (canvas.height / gridSize)) * gridSize;
  62.       }
  63.     }

  64.     function drawFood() {
  65.       context.fillStyle = "red";
  66.       context.fillRect(food.x, food.y, gridSize, gridSize);
  67.     }

  68.     function moveSnake() {
  69.       const head = { x: snake[0].x + dx, y: snake[0].y + dy };

  70.       // 判断是否撞墙
  71.       if (
  72.         head.x < 0 ||
  73.         head.x >= canvas.width ||
  74.         head.y < 0 ||
  75.         head.y >= canvas.height
  76.       ) {
  77.         clearInterval(game);
  78.         alert("游戏结束!你的得分是:" + score);
  79.         return false;
  80.       }
  81.       // 判断是否撞自己
  82.       if (snake.some(part => part.x === head.x && part.y === head.y)) {
  83.         clearInterval(game);
  84.         alert("游戏结束!你的得分是:" + score);
  85.         return false;
  86.       }

  87.       snake.unshift(head);

  88.       if (head.x === food.x && head.y === food.y) {
  89.         score++;
  90.         scoreDisplay.textContent = "得分: " + score;
  91.         generateFood();
  92.       } else {
  93.         snake.pop();
  94.       }
  95.       return true;
  96.     }

  97.     function changeDirection(event) {
  98.       const keyPressed = event.code;

  99.       // 防止撞到自己,不能180度调头
  100.       if (keyPressed === "KeyA" && dx === 0) { // A左
  101.         dx = -gridSize;
  102.         dy = 0;
  103.       } else if (keyPressed === "KeyD" && dx === 0) { // D右
  104.         dx = gridSize;
  105.         dy = 0;
  106.       } else if (keyPressed === "KeyW" && dy === 0) { // W上
  107.         dx = 0;
  108.         dy = -gridSize;
  109.       } else if (keyPressed === "KeyS" && dy === 0) { // S下
  110.         dx = 0;
  111.         dy = gridSize;
  112.       }
  113.     }

  114.     function gameLoop() {
  115.       if (!moveSnake()) {
  116.         // 游戏结束,停止绘制
  117.         return;
  118.       }
  119.       drawSnake();
  120.       drawFood();
  121.     }

  122.     startButton.addEventListener("click", () => {
  123.       clearInterval(game);
  124.       snake = [
  125.         { x: 160, y: 200 },
  126.         { x: 140, y: 200 },
  127.         { x: 120, y: 200 },
  128.       ];
  129.       dx = gridSize;
  130.       dy = 0;
  131.       score = 0;
  132.       scoreDisplay.textContent = "得分: 0";
  133.       generateFood();
  134.       drawSnake();
  135.       drawFood();
  136.       game = setInterval(gameLoop, 100);
  137.     });

  138.     document.addEventListener("keydown", changeDirection);
  139.   </script>
  140. </body>
  141. </html>
复制代码


---

### 使用说明
- 用键盘 **W** 向上移动  
- 用键盘 **A** 向左移动  
- 用键盘 **S** 向下移动  
- 用键盘 **D** 向右移动  
- 点击“开始游戏”按钮开始新游戏  

这段代码在游戏过程中会限制贪吃蛇不能撞墙或撞到自己,撞了就会弹出结束提示和得分。  

如果你想增加其他功能(比如暂停、速度调节等),可以告诉我,我帮你继续完善!祝你玩得开心~????????
回复 支持 反对

使用道具 举报

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

本版积分规则

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