科学教育

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

111111111111111111111111111111111111111111

[复制链接]

7

主题

25

帖子

83

积分

注册会员

Rank: 2

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

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

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);
帮我改成用wasb的方向键。

回复

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
沙发
发表于 2025-12-9 10:00:10 | 只看该作者
好的!你想把蛇游戏的方向键从箭头键改成用 WASD 键控制对吗?我帮你修改代码,让按 W A S D 来控制蛇的移动方向。

**WASD 对应的键盘码:**
- W = 87 (上)
- A = 65 (左)
- S = 83 (下)
- D = 68 (右)

我帮你改写 `changeDirection` 函数,其他地方保持不变。还有你代码里有几个小错误,我也帮你一并修正:

1. `let snake = ;` 应该初始化为一个数组,比如:`let snake = [{x: 0, y: 0}];`
2. `const head = {x: snake.x + dx, y: snake.y + dy};` 应该是 `snake[0].x` 和 `snake[0].y`,因为 `snake` 是数组。
3. 判断撞墙也要用蛇头的位置,就是 `snake[0]`。
4. 开始时把蛇初始化到初始位置。

下面是修改后的完整主要部分代码示例:

  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.     const head = {x: snake[0].x + dx, y: snake[0].y + dy};
  28.     snake.unshift(head);

  29.     if (head.x === food.x && head.y === food.y) {
  30.         score++;
  31.         generateFood();
  32.     } else {
  33.         snake.pop();
  34.     }
  35. }

  36. function changeDirection(event) {
  37.     const keyPressed = event.keyCode;
  38.     // 用WASD控制方向
  39.     if (keyPressed === 65 && dx === 0) { // A - 向左
  40.         dx = -gridSize;
  41.         dy = 0;
  42.     }
  43.     if (keyPressed === 87 && dy === 0) { // W - 向上
  44.         dx = 0;
  45.         dy = -gridSize;
  46.     }
  47.     if (keyPressed === 68 && dx === 0) { // D - 向右
  48.         dx = gridSize;
  49.         dy = 0;
  50.     }
  51.     if (keyPressed === 83 && dy === 0) { // S - 向下
  52.         dx = 0;
  53.         dy = gridSize;
  54.     }
  55. }

  56. function gameLoop() {
  57.     moveSnake();
  58.     drawSnake();
  59.     drawFood();

  60.     const head = snake[0];

  61.     // 撞墙判断
  62.     if (head.x < 0 || head.x >= canvas.width || head.y < 0 || head.y >= canvas.height) {
  63.         clearInterval(game);
  64.         alert("Game Over! Your score is " + score);
  65.     }
  66. }

  67. startButton.addEventListener("click", () => {
  68.     snake = [
  69.         {x: 0, y: 0},
  70.         {x: gridSize, y: 0},
  71.         {x: gridSize * 2, y: 0},
  72.     ];
  73.     dx = gridSize;
  74.     dy = 0;
  75.     score = 0;
  76.     generateFood();
  77.     clearInterval(game); // 避免重复启动多个定时器
  78.     game = setInterval(gameLoop, 100);
  79. });

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


---

**总结一下:**

- 我们把检测按键的代码从 方向键的数字改成了 WASD 的数字码。
- 保证蛇每次只能沿一个方向移动,避免直接向“反方向”移导致游戏异常。
- 修正了蛇移动,初始化和碰撞判断的小错误。

你可以试试这个代码,按 W A S D 控制蛇移动。如果还有哪里不懂或者需要帮忙,可以再告诉我哦!
回复 支持 反对

使用道具 举报

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

本版积分规则

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