科学教育

搜索
查看: 424|回复: 1
打印 上一主题 下一主题

66666666666666666666666666666666666666666666666666666666666666666666666666666...

[复制链接]

3

主题

10

帖子

35

积分

新手上路

Rank: 1

积分
35
跳转到指定楼层
楼主
发表于 2025-12-10 15:04:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
const canvas = document.getElementById("gameCanvas");
const context = canvas.getContext("2d");
const startButton = document.getElementById("startButton");

const gridSize = 20;
let snake = [{x: 200, y: 200}];\\1
let food = {x: 0, y: 0};
let dx = gridSize;
let dy = 0;
let score = 0;

\\....2
function drawSnake() {
    context.clearRect(0, 0, canvas.width, canvas.height);
    snake.forEach(part => {
        context.fillStyle = "green";
        context.fillRect(part.x, part.y, gridSize, gridSize);
    });
}

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

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

function moveSnake() {
    const head = {x: snake[0].x + dx, y: snake[0].y + dy};
    snake.unshift(head);
    if (head.x === food.x && head.y === food.y) {
        score++;
        generateFood();
    } else {
        snake.pop();
    }
}

function changeDirection(event) {
    const keyPressed = event.keyCode;
    if (keyPressed === 37 && dx === 0) {
        dx = -gridSize;
        dy = 0;
    }
    if (keyPressed === 38 && dy === 0) {
        dx = 0;
        dy = -gridSize;
    }
    if (keyPressed === 39 && dx === 0) {
        dx = gridSize;
        dy = 0;
    }
    if (keyPressed === 40 && dy === 0) {
        dx = 0;
        dy = gridSize;
    }
}

function gameLoop() {
    moveSnake();
    drawSnake();
    drawFood();
    if (snake[0].x < 0 || snake[0].x >= canvas.width || snake[0].y < 0 || snake[0].y >= canvas.height) {
        clearInterval(game);
        alert("Game Over! Your score is " + score);
    }
}

startButton.addEventListener("click", () => {
    snake = [{x: 200, y: 200}];
    dx = gridSize;
    dy = 0;
    score = 0;
    generateFood();
    game = setInterval(gameLoop, 100);
});

document.addEventListener("keydown", changeDirection);
帮我修改这段js带码
回复

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
沙发
发表于 2025-12-10 15:04:26 | 只看该作者
好的,我来帮你修改这段贪吃蛇游戏的代码,让它能正常运行哦!我会一步步解释哪里有问题,怎么改正,让你更容易理解。

---

### 你的代码中主要问题:

1. `snake` 是贪吃蛇身体的位置数组,但你没给它赋初始值,写成了 `let snake = ;\\1`,这里应该是一个数组,里面有蛇头的坐标,比如:`[{x: 0, y: 0}]`。

2. 在 `moveSnake()` 函数中,你写 `const head = {x: snake.x + dx, y: snake.y + dy};`,但是 `snake` 是数组,应该是用 `snake[0].x` 代表蛇头的 x 坐标。

3. 在 `gameLoop()` 函数中检查边界时用的也是 `snake.x`,也要用 `snake[0].x`。

4. `startButton` 事件里,给 `snake` 赋值还是空的,应该初始化为一个有长度1的数组。

---

### 修改后的代码:

  1. const canvas = document.getElementById("gameCanvas");
  2. const context = canvas.getContext("2d");
  3. const startButton = document.getElementById("startButton");

  4. const gridSize = 20;
  5. let snake = [];
  6. let food = { x: 0, y: 0 };
  7. let dx = gridSize;
  8. let dy = 0;
  9. let score = 0;
  10. let game; // 保存定时器

  11. function drawSnake() {
  12.     context.clearRect(0, 0, canvas.width, canvas.height);
  13.     snake.forEach(part => {
  14.         context.fillStyle = "green";
  15.         context.fillRect(part.x, part.y, gridSize, gridSize);
  16.     });
  17. }

  18. function generateFood() {
  19.     food.x = Math.floor(Math.random() * (canvas.width / gridSize)) * gridSize;
  20.     food.y = Math.floor(Math.random() * (canvas.height / gridSize)) * gridSize;
  21. }

  22. function drawFood() {
  23.     context.fillStyle = "red";
  24.     context.fillRect(food.x, food.y, gridSize, gridSize);
  25. }

  26. function moveSnake() {
  27.     // 蛇头坐标是snake[0],新蛇头位置是它加上移动方向dx/dy
  28.     const head = { x: snake[0].x + dx, y: snake[0].y + dy };
  29.     snake.unshift(head); // 把新蛇头放到最前面

  30.     // 如果蛇头吃到食物,分数+1,重新生成食物,不删尾巴(蛇变长)
  31.     if (head.x === food.x && head.y === food.y) {
  32.         score++;
  33.         generateFood();
  34.     } else {
  35.         snake.pop(); // 移除尾巴,实现蛇移动
  36.     }
  37. }

  38. function changeDirection(event) {
  39.     const keyPressed = event.keyCode;

  40.     if (keyPressed === 37 && dx === 0) { // 左方向键
  41.         dx = -gridSize;
  42.         dy = 0;
  43.     }

  44.     if (keyPressed === 38 && dy === 0) { // 上方向键
  45.         dx = 0;
  46.         dy = -gridSize;
  47.     }

  48.     if (keyPressed === 39 && dx === 0) { // 右方向键
  49.         dx = gridSize;
  50.         dy = 0;
  51.     }

  52.     if (keyPressed === 40 && dy === 0) { // 下方向键
  53.         dx = 0;
  54.         dy = gridSize;
  55.     }
  56. }

  57. function gameLoop() {
  58.     moveSnake();
  59.     // 检查蛇有没有撞墙,蛇头是snake[0]
  60.     if (
  61.         snake[0].x < 0 ||
  62.         snake[0].x >= canvas.width ||
  63.         snake[0].y < 0 ||
  64.         snake[0].y >= canvas.height
  65.     ) {
  66.         clearInterval(game);
  67.         alert("Game Over! Your score is " + score);
  68.         return; // 游戏结束停止执行后续代码
  69.     }

  70.     drawSnake();
  71.     drawFood();
  72. }

  73. startButton.addEventListener("click", () => {
  74.     snake = [{ x: 0, y: 0 }]; // 初始化蛇的位置,从左上角开始
  75.     dx = gridSize;
  76.     dy = 0;
  77.     score = 0;
  78.     generateFood();

  79.     if (game) {
  80.         clearInterval(game); // 如果之前有游戏在运行,先清除
  81.     }
  82.     game = setInterval(gameLoop, 100);
  83. });

  84. document.addEventListener("keydown", changeDirection);
复制代码


---

### 小结:

- 蛇身体是数组,保存每个方块的坐标。
- 蛇头总是在数组第一个元素(`snake[0]`),用它来计算移动。
- 用 `unshift` 往前添加新的头部,`pop` 移除尾部,这样蛇才会动起来。
- 按键改变 `dx` 和 `dy`,控制蛇的方向。
- 游戏循环调用移动和绘制函数,并检测游戏结束条件。

你可以试试看这个代码,应该能动起来了。有什么不懂的随时问我哦!????
回复 支持 反对

使用道具 举报

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

本版积分规则

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