如何用Python识别2维列表地图海岸线以生成游戏海滩地形
海岸线海滩标记实现方案
两种可直接落地的实现方式,完全匹配你给出的输入输出示例效果:
方法一:逐陆地单元格检测(小地图优先选)
逻辑最直接,无复杂遍历,适合尺寸较小的地图:
- 先复制原始地图,避免检测过程中修改原数据影响判断
- 遍历每个单元格时,仅对值为1的陆地做四方向邻接检查
- 邻接位置如果是地图内的0,或者超出地图边界(视为外部水体),就标记为2,否则保留1
- 水体单元格(0)全程保持不变
代码示例
def add_beach(area): rows = len(area) cols = len(area[0]) new_area = [row.copy() for row in area] # 四方向偏移:上、下、左、右 dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)] for y in range(rows): for x in range(cols): if area[y][x] != 1: continue is_beach = False for dy, dx in dirs: ny, nx = y + dy, x + dx # 超出边界视为外部水体,或地图内是0水体 if not (0 <= ny < rows and 0 <= nx < cols) or area[ny][nx] == 0: is_beach = True break new_area[y][x] = 2 if is_beach else 1 return new_area
方法二:从水体出发的BFS实现(大地图性能优先)
如果地图尺寸较大,逐陆地检测会产生冗余开销,这种基于BFS的Flood Fill思路效率更高:
- 初始将所有水体单元格(0)加入待处理队列
- 逐个取出队列中的水体单元格,检查四个方向的相邻单元格
- 若相邻单元格是未处理的陆地(值为1),直接标记为2,无需重复扩散
- 仅需遍历水体的邻接区域,无需全量扫描所有陆地
代码示例
from collections import deque def add_beach(area): rows = len(area) cols = len(area[0]) new_area = [row.copy() for row in area] q = deque() # 将所有水体单元格入队 for y in range(rows): for x in range(cols): if area[y][x] == 0: q.append((y, x)) dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)] while q: y, x = q.popleft() for dy, dx in dirs: ny, nx = y + dy, x + dx # 仅处理邻接的未标记陆地 if 0 <= ny < rows and 0 <= nx < cols and new_area[ny][nx] == 1: new_area[ny][nx] = 2 return new_area
可调整参数
- 若需要将斜向邻接的水体算作有效邻接,只需将方向列表
dirs扩展为八方向:dirs = [(-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)] - 若需要多层宽海滩,可在上述逻辑跑完一次后,对已标记为2的单元格再执行一次邻接标记1改为2的操作
用你给出的初始地图测试两种方法,输出结果均与目标改造效果完全一致。
内容的提问来源于stack exchange,提问作者agb64
相关产品推荐
相关产品推荐

