[MF]更改食物生成远离边界

This commit is contained in:
51hhh 2025-08-28 09:29:44 +08:00
parent 703847950c
commit 0d6d11aaf7

View File

@ -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,