From 0d6d11aaf77f637aad0a31d4ead1558a9f5cc333 Mon Sep 17 00:00:00 2001 From: 51hhh Date: Thu, 28 Aug 2025 09:29:44 +0800 Subject: [PATCH] =?UTF-8?q?[MF]=E6=9B=B4=E6=94=B9=E9=A3=9F=E7=89=A9?= =?UTF-8?q?=E7=94=9F=E6=88=90=E8=BF=9C=E7=A6=BB=E8=BE=B9=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/贪吃蛇/snake_game.html | 38 +++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/game/贪吃蛇/snake_game.html b/game/贪吃蛇/snake_game.html index cb80cd0..3f97daa 100644 --- a/game/贪吃蛇/snake_game.html +++ b/game/贪吃蛇/snake_game.html @@ -947,17 +947,43 @@ updateScoreDisplay(); } - function generateFood() { - // 计算可用的网格单元数量 +function generateFood() { const numCols = CANVAS_WIDTH / GRID_SIZE; const numRows = CANVAS_HEIGHT / GRID_SIZE; + const boundaryPadding = 5; // 边界内5格不允许生成食物 + + // 计算食物生成的可允许范围 + const minX = boundaryPadding; + const maxX = numCols - 1 - boundaryPadding; // -1 是因为索引从0开始 + const minY = boundaryPadding; + const maxY = numRows - 1 - boundaryPadding; + + // 确保有足够的空间生成食物 + if (maxX < minX || maxY < minY) { + console.warn("游戏区域太小,无法满足边界限制!食物可能仍会在边界附近生成。"); + // 在这种极端情况下,可以考虑放宽限制或结束游戏 + // 为了当前问题,我们简单地继续,但开发者应知晓此情况 + } - // 循环直到找到一个不在蛇身体上的食物位置 let newFoodX, newFoodY; + let validPositionFound = false; + let attempts = 0; + const MAX_ATTEMPTS = 100; // 防止无限循环 + do { - newFoodX = Math.floor(Math.random() * numCols); - newFoodY = Math.floor(Math.random() * numRows); - } while (isFoodOnSnake(newFoodX, newFoodY)); // 检查是否与蛇重叠 + // 在允许的范围内生成随机坐标 + newFoodX = Math.floor(Math.random() * (maxX - minX + 1)) + minX; + newFoodY = Math.floor(Math.random() * (maxY - minY + 1)) + minY; + + // 检查是否在蛇的身体上 + validPositionFound = !isFoodOnSnake(newFoodX, newFoodY); + attempts++; + if (attempts > MAX_ATTEMPTS) { + console.warn("未能找到有效的食物生成位置,可能由于蛇太长或区域限制。尝试放宽限制。"); + // 这里可以添加逻辑来放宽边界限制,或者简单地跳出循环(可能生成在蛇身上) + break; + } + } while (!validPositionFound); food = { x: newFoodX,