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,