科学教育

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

帮我在js的基础上用wasd修改

[复制链接]

2

主题

3

帖子

18

积分

新手上路

Rank: 1

积分
18
跳转到指定楼层
楼主
发表于 2025-12-10 15:08:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);
回复

使用道具 举报

0

主题

1145

帖子

1715

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1715
沙发
发表于 2025-12-10 15:08:46 | 只看该作者
你好!我看到你做的是一个贪吃蛇小游戏,用JavaScript在网页上画图和控制蛇的移动。你想用WASD键来控制方向,我帮你改一下代码,顺便给你讲讲怎么做的~

主要思路是:

- 把监听按键的代码里,判断方向的键改成W、A、S、D这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 = []; // 蛇身体的位置数组,里面每个元素是{x, y}
  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.     if (head.x < 0 || head.x >= canvas.width || head.y < 0 || head.y >= canvas.height) {
  30.         clearInterval(game);
  31.         alert("Game Over! Your score is " + score);
  32.         return;
  33.     }
  34.     // 检查是否撞自己
  35.     for (let part of snake) {
  36.         if (part.x === head.x && part.y === head.y) {
  37.             clearInterval(game);
  38.             alert("Game Over! Your score is " + score);
  39.             return;
  40.         }
  41.     }
  42.     snake.unshift(head); // 把新头加到蛇的前面

  43.     if (head.x === food.x && head.y === food.y) {
  44.         score++;
  45.         generateFood();
  46.     } else {
  47.         snake.pop(); // 如果没吃到食物,去掉尾巴,让蛇长度不变
  48.     }
  49. }

  50. function changeDirection(event) {
  51.     const keyPressed = event.key.toLowerCase(); // 获取按键字符,转换成小写方便判断

  52.     // 不能让蛇直接往反方向走,比如当前往右,不能直接往左
  53.     if (keyPressed === 'a' && dx === 0) { // 按A往左
  54.         dx = -gridSize;
  55.         dy = 0;
  56.     }
  57.     else if (keyPressed === 'w' && dy === 0) { // 按W往上
  58.         dx = 0;
  59.         dy = -gridSize;
  60.     }
  61.     else if (keyPressed === 'd' && dx === 0) { // 按D往右
  62.         dx = gridSize;
  63.         dy = 0;
  64.     }
  65.     else if (keyPressed === 's' && dy === 0) { // 按S往下
  66.         dx = 0;
  67.         dy = gridSize;
  68.     }
  69. }

  70. function gameLoop() {
  71.     moveSnake();
  72.     drawSnake();
  73.     drawFood();
  74. }

  75. startButton.addEventListener("click", () => {
  76.     snake = [ {x: gridSize * 5, y: gridSize * 5} ]; // 给蛇一个初始位置
  77.     dx = gridSize;
  78.     dy = 0;
  79.     score = 0;
  80.     generateFood();
  81.     if (game) clearInterval(game); // 防止多次点击按钮导致游戏叠加
  82.     game = setInterval(gameLoop, 100);
  83. });

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


**简单解释:**

- 我把监听按键的部分,改成了监听键值 `'w'`, `'a'`, `'s'`, `'d'`(分别是上、左、下、右)。
- `moveSnake`函数里用`sake[0]`代表蛇头的位置,然后根据dx、dy计算新的头位置。
- 增加了撞墙和撞自己判断,如果碰到了就结束游戏,并弹出得分。
- 点击开始按钮时,蛇会初始化成一节,开始移动。

你可以试试运行这个代码后,用WASD控制蛇的移动!如果还有不懂或者想加功能,告诉我哦~
回复 支持 反对

使用道具 举报

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

本版积分规则

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