战舰游戏开发:如何生成符合舰船规格的随机战场数组
战舰游戏随机战场生成方案
要实现按指定尺寸(4、3、2、1格连续)随机生成战舰战场,核心思路是先初始化空战场,再逐个随机放置不同长度的战舰,确保战舰不重叠、不越界。以下是可直接复用的JavaScript实现代码:
实现步骤与代码
// 初始化10x10的空战场 function createEmptyBattlefield() { return Array.from({ length: 10 }, () => Array(10).fill(0)); } // 尝试在战场放置指定长度的战舰 function placeShip(battlefield, shipLength) { const isHorizontal = Math.random() > 0.5; // 随机选择方向:横/竖 let startRow, startCol; // 根据方向计算合法的起始位置范围 if (isHorizontal) { startRow = Math.floor(Math.random() * 10); startCol = Math.floor(Math.random() * (10 - shipLength + 1)); } else { startRow = Math.floor(Math.random() * (10 - shipLength + 1)); startCol = Math.floor(Math.random() * 10); } // 检查该位置是否能放置战舰(所有目标格子都是0) let canPlace = true; for (let i = 0; i < shipLength; i++) { const row = isHorizontal ? startRow : startRow + i; const col = isHorizontal ? startCol + i : startCol; if (battlefield[row][col] !== 0) { canPlace = false; break; } } // 能放置就填充1,否则递归重试 if (canPlace) { for (let i = 0; i < shipLength; i++) { const row = isHorizontal ? startRow : startRow + i; const col = isHorizontal ? startCol + i : startCol; battlefield[row][col] = 1; } } else { placeShip(battlefield, shipLength); } } // 生成带战舰的随机战场 function generateRandomBattlefield() { const battlefield = createEmptyBattlefield(); // 按尺寸依次放置战舰:4格、3格、2格、1格 [4, 3, 2, 1].forEach(length => placeShip(battlefield, length)); return battlefield; } // 调用示例 const myBattlefield = generateRandomBattlefield(); console.log(myBattlefield);
代码说明
- 初始化战场:
createEmptyBattlefield生成10行10列的全0数组,作为空白战场。 - 随机放置逻辑:
placeShip函数先随机选择战舰方向(横向/纵向),再计算合法的起始坐标范围(避免战舰超出战场边界);接着检查目标位置是否未被占用(全为0),如果合法就填充1,否则递归重试直到找到合适位置。 - 批量放置:
generateRandomBattlefield按指定尺寸依次调用放置函数,确保所有战舰都被正确放置。
如果需要调整战舰数量(比如常见的1艘4格、2艘3格等),只需修改[4,3,2,1]这个数组,比如改成[4,3,3,2,2,2,1,1,1,1]即可。
内容的提问来源于stack exchange,提问作者trox
相关产品推荐
相关产品推荐

