一维1x10战舰游戏连续3个不重复0-10随机数生成实现
1x10一维战舰连续战舰位置生成方案
实现逻辑
原有实现对全量数组做随机乱序后截取3个元素,没有加入“3个值必须连续相邻”的约束,无法得到符合要求的战舰坐标,无需复杂的乱序操作即可快速实现需求:
- 首先划定合法的战舰起始位置边界:战舰总长度为3格,从起始位置开始要占据后续2个相邻位置,所有坐标必须落在0-10的棋盘范围内,因此起始位置最大只能取到8(对应占据8、9、10三个位置),可选起始位区间为0~8
- 在合法起始位区间内随机生成一个整数,依次取出该数、该数+1、该数+2三个值,即为完整的战舰占据坐标
代码示例
// 定义合法起始位边界,保证3格连续不越界 const MIN_START = 0; const MAX_START = 8; // 生成闭区间[MIN_START, MAX_START]的随机整数 const startPos = Math.floor(Math.random() * (MAX_START - MIN_START + 1)) + MIN_START; // 组装连续3格的战舰位置 const shipCoordinates = [startPos, startPos + 1, startPos + 2]; console.log(shipCoordinates);
适配性说明
- 生成的坐标全部为连续3个无重复的整数,可输出[3,4,5]、[7,8,9]这类符合要求的组合
- 所有生成的位置都在预设的1行10列棋盘范围内,不会出现坐标越界问题
- 相比原有的数组乱序截取方案,这种实现的随机分布更均匀,无多余数组遍历操作,运行性能更好
补充说明:原有代码中使用
sort(() => 0.5 - Math.random())的乱序方式本身存在随机分布不均的问题,替换为上述方案后可同时解决两个问题:坐标连续、随机分布均匀。
内容的提问来源于stack exchange,提问作者LukeKett7
相关产品推荐
相关产品推荐

