[MF]更改食物生成远离边界
This commit is contained in:
parent
703847950c
commit
0d6d11aaf7
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user