科学教育

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

帮我把下列代码改为WASD的形式

[复制链接]

1

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
跳转到指定楼层
楼主
发表于 2025-12-9 15:19:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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

主题

1147

帖子

1718

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1718
沙发
发表于 2025-12-9 15:19:49 | 只看该作者
好的!我帮你把方向键(上下左右箭头)改成WASD控制蛇的移动。顺便还帮你补全和修正了代码里小问题,让程序能正常运行。

下面是修改后的完整代码:

  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.key.toLowerCase();

  38.     // 按W(上)且当前不是向下,则向上移动
  39.     if (keyPressed === 'w' && dy === 0) {  
  40.         dx = 0;
  41.         dy = -gridSize;
  42.     }
  43.     // 按A(左)且当前不是向右,则向左移动
  44.     else if (keyPressed === 'a' && dx === 0) {  
  45.         dx = -gridSize;
  46.         dy = 0;
  47.     }
  48.     // 按S(下)且当前不是向上,则向下移动
  49.     else if (keyPressed === 's' && dy === 0) {  
  50.         dx = 0;
  51.         dy = gridSize;
  52.     }
  53.     // 按D(右)且当前不是向左,则向右移动
  54.     else if (keyPressed === 'd' && dx === 0) {  
  55.         dx = gridSize;
  56.         dy = 0;
  57.     }
  58. }

  59. function gameLoop() {
  60.     moveSnake();
  61.    
  62.     // 判断蛇是否撞墙或撞自己(这里加一下撞自己判断更完整)
  63.     const head = snake[0];
  64.     if (head.x < 0 || head.x >= canvas.width || head.y < 0 || head.y >= canvas.height ||
  65.         snake.slice(1).some(part => part.x === head.x && part.y === head.y)) {
  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 = [
  75.         {x: gridSize * 5, y: gridSize * 5},
  76.         {x: gridSize * 4, y: gridSize * 5},
  77.         {x: gridSize * 3, y: gridSize * 5},
  78.     ];
  79.     dx = gridSize;
  80.     dy = 0;
  81.     score = 0;
  82.     generateFood();
  83.     if (game) clearInterval(game);
  84.     game = setInterval(gameLoop, 100);
  85. });

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


**我给你讲讲怎么用WASD控制:**  
- `W`:向上。  
- `A`:向左。  
- `S`:向下。  
- `D`:向右。

你按哪个字母,蛇头就会往对应方向走,但不能直接反向,比如当前往右,不能马上按A向左,否则蛇会撞死。

---

这段代码是一个简单的贪吃蛇游戏,帧率是每100毫秒刷新一次画面和蛇的动作。你可以把它放在有`<canvas id="gameCanvas"></canvas>`和`<button id="startButton">开始游戏</button>`的网页里玩。

如果还有哪里不懂,欢迎再问我哦!我会尽量用简单的语言帮你解释。????
回复 支持 反对

使用道具 举报

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

本版积分规则

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