|
|
你好!你这个代码是用来做贪吃蛇游戏的,很棒哦!你想把控制方向的按键从箭头键(↑↓←→)改成W、A、S、D对吧?我来帮你改一下,并且顺便修正一下代码里一些小问题,方便你能更好理解。
---
### 第一步:解释你代码里的几个地方需要注意
1. 你写了`let snake = ;`,这里需要给蛇的身体一个初始数组,比如从画布中间开始,像这样:
- let snake = [{x: 100, y: 100}];
复制代码
2. `moveSnake`函数里的代码:
- const head = {x: snake.x + dx, y: snake.y + dy};
复制代码
这里应该改成用蛇头部第一个元素`sank[0]`的位置,因为`snake`是个数组,不是对象。
改成:
- const head = { x: snake[0].x + dx, y: snake[0].y + dy };
复制代码
3. 判断游戏结束的时候,你写的是
- if (snake.x < 0 || snake.x >= canvas.width || snake.y < 0 || snake.y >= canvas.height) {
复制代码
同样要用`sanke[0]`表示蛇头
- if (snake[0].x < 0 || snake[0].x >= canvas.width || snake[0].y < 0 || snake[0].y >= canvas.height) {
复制代码
4. 还有每次点击开始按钮时,要给`snake`赋一个起始位置,比如:
- snake = [{x: 100, y: 100}];
复制代码
---
### 第二步:将方向键改成用 **W (上), A (左), S (下), D (右)** 控制
修改`changeDirection`函数里的监听代码,改成监听`key`属性(更直观),代码示范:
- function changeDirection(event) {
- const keyPressed = event.key.toLowerCase(); // 把按键转换成小写字母
- if (keyPressed === 'a' && dx === 0) { // 左
- dx = -gridSize;
- dy = 0;
- }
- if (keyPressed === 'w' && dy === 0) { // 上
- dx = 0;
- dy = -gridSize;
- }
- if (keyPressed === 'd' && dx === 0) { // 右
- dx = gridSize;
- dy = 0;
- }
- if (keyPressed === 's' && dy === 0) { // 下
- dx = 0;
- dy = gridSize;
- }
- }
复制代码
---
### 最后帮你整理一份修正后的完整关键代码片段:
- const canvas = document.getElementById("gameCanvas");
- const context = canvas.getContext("2d");
- const startButton = document.getElementById("startButton");
- const gridSize = 20;
- let snake = [];
- let food = {x: 0, y: 0};
- let dx = gridSize;
- let dy = 0;
- let score = 0;
- let game; // 定时器变量
- 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.key.toLowerCase();
- if (keyPressed === 'a' && dx === 0) {
- dx = -gridSize;
- dy = 0;
- }
- if (keyPressed === 'w' && dy === 0) {
- dx = 0;
- dy = -gridSize;
- }
- if (keyPressed === 'd' && dx === 0) {
- dx = gridSize;
- dy = 0;
- }
- if (keyPressed === 's' && 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: 100, y: 100}];
- dx = gridSize;
- dy = 0;
- score = 0;
- generateFood();
- if (game) clearInterval(game); // 防止多次点击start重复启动
- game = setInterval(gameLoop, 100);
- });
- document.addEventListener("keydown", changeDirection);
复制代码
---
### 小结
- 我帮你修正了蛇的初始化和坐标计算
- 把事件监听改成用 `W A S D` 控制方向啦
- 你可以在浏览器打开网页,用WASD试一下游戏哦~
如果哪里不懂,或者还想学怎么加得分显示、碰到自己就游戏结束等功能,随时问我!祝你编程开心~???????? |
|