[MF]更改食物生成远离边界
This commit is contained in:
parent
703847950c
commit
0d6d11aaf7
@ -947,17 +947,43 @@
|
|||||||
updateScoreDisplay();
|
updateScoreDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
function generateFood() {
|
function generateFood() {
|
||||||
// 计算可用的网格单元数量
|
|
||||||
const numCols = CANVAS_WIDTH / GRID_SIZE;
|
const numCols = CANVAS_WIDTH / GRID_SIZE;
|
||||||
const numRows = CANVAS_HEIGHT / 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 newFoodX, newFoodY;
|
||||||
|
let validPositionFound = false;
|
||||||
|
let attempts = 0;
|
||||||
|
const MAX_ATTEMPTS = 100; // 防止无限循环
|
||||||
|
|
||||||
do {
|
do {
|
||||||
newFoodX = Math.floor(Math.random() * numCols);
|
// 在允许的范围内生成随机坐标
|
||||||
newFoodY = Math.floor(Math.random() * numRows);
|
newFoodX = Math.floor(Math.random() * (maxX - minX + 1)) + minX;
|
||||||
} while (isFoodOnSnake(newFoodX, newFoodY)); // 检查是否与蛇重叠
|
newFoodY = Math.floor(Math.random() * (maxY - minY + 1)) + minY;
|
||||||
|
|
||||||
|
// 检查是否在蛇的身体上
|
||||||
|
validPositionFound = !isFoodOnSnake(newFoodX, newFoodY);
|
||||||
|
attempts++;
|
||||||
|
if (attempts > MAX_ATTEMPTS) {
|
||||||
|
console.warn("未能找到有效的食物生成位置,可能由于蛇太长或区域限制。尝试放宽限制。");
|
||||||
|
// 这里可以添加逻辑来放宽边界限制,或者简单地跳出循环(可能生成在蛇身上)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (!validPositionFound);
|
||||||
|
|
||||||
food = {
|
food = {
|
||||||
x: newFoodX,
|
x: newFoodX,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user