[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