科学教育

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

帮我改成wasd网页代码

[复制链接]

1

主题

2

帖子

7

积分

新手上路

Rank: 1

积分
7
跳转到指定楼层
楼主
发表于 2025-12-9 09:51:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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);
回复

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
沙发
发表于 2025-12-9 09:52:00 | 只看该作者
你好!你想把这个贪吃蛇游戏的方向控制改成用“WASD”键对吧?我来帮你改一下代码,让你能用W(上)、A(左)、S(下)、D(右)来控制蛇走。

我看你给的代码里有些小地方没写完整,我也帮你一起改好,保证代码可以用。

下面是修改后的部分,主要是`changeDirection`函数和一些小细节:

  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.    
  29.     // 检查蛇有没有撞到墙壁
  30.     if (head.x < 0 || head.x >= canvas.width || head.y < 0 || head.y >= canvas.height) {
  31.         clearInterval(game);
  32.         alert("Game Over! Your score is " + score);
  33.         return;
  34.     }

  35.     snake.unshift(head);

  36.     if (head.x === food.x && head.y === food.y) {
  37.         score++;
  38.         generateFood();
  39.     } else {
  40.         snake.pop();
  41.     }
  42. }

  43. function changeDirection(event) {
  44.     const keyPressed = event.key.toLowerCase(); // 取得按键的小写字母

  45.     // 防止蛇反向走(比如从左直接往右)
  46.     if (keyPressed === 'a' && dx === 0) {   // 左
  47.         dx = -gridSize;
  48.         dy = 0;
  49.     }
  50.     if (keyPressed === 'w' && dy === 0) {   // 上
  51.         dx = 0;
  52.         dy = -gridSize;
  53.     }
  54.     if (keyPressed === 'd' && dx === 0) {   // 右
  55.         dx = gridSize;
  56.         dy = 0;
  57.     }
  58.     if (keyPressed === 's' && dy === 0) {   // 下
  59.         dx = 0;
  60.         dy = gridSize;
  61.     }
  62. }

  63. function gameLoop() {
  64.     moveSnake();
  65.     drawSnake();
  66.     drawFood();
  67. }

  68. startButton.addEventListener("click", () => {
  69.     snake = [
  70.         {x: 100, y: 100},
  71.         {x: 80, y: 100},
  72.         {x: 60, y: 100},
  73.     ]; // 初始化蛇的位置,一个有三个方块的蛇
  74.     dx = gridSize;
  75.     dy = 0;
  76.     score = 0;
  77.     generateFood();
  78.     if (game) clearInterval(game);
  79.     game = setInterval(gameLoop, 100);
  80. });

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


---

**简单解释:**

- 我把控制方向的`if`判断改成用键盘字母 `'w'`, `'a'`, `'s'`, `'d'` 来判断,代替了原来的上下左右箭头(数字键码)。
- 加了防止蛇马上往相反方向走的判断(比如你不能让蛇突然从左往右直接掉头,这样游戏会更合理)。
- 修正了`snake`数组初始化为空的问题,现在游戏开始的时候蛇会有三节身体。
- 在`moveSnake`里先判断蛇头有没有碰墙,如果碰墙就结束游戏。
- 其他画画蛇和食物,逻辑没变。

你可以把这段代码复制替换你原来的代码,试试看用WASD玩你的贪吃蛇游戏啦!如果还有不懂或者想学更多编程知识,随时问我哦!????????????
回复 支持 反对

使用道具 举报

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

本版积分规则

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