程序化地形生成算法

05/2539 浏览开发心得
程序化地形/地牢生成算法通用指南适配所有2D瓦片地图:地牢、矿洞、洞穴、岛屿地形|更新:2026-04-30目录1.概述与算法选型 2.随机游走算法 3.Perlin噪声地形生成 4.元胞自动机 5.BSP树分割 6.洪水填充与连通性 7.混合策略与后处理 8.瓦片渲染基础 9.可破坏地形系统 10.性能优化策略 11.算法选型决策树 12.代码模板1. 概述与算法选型1.1 四大核心算法随机游走:有机蜿蜒、洞穴感强,适配矿洞通道,低复杂度;Perlin噪声:连续平滑、分层自然,适配大陆地形高度图,中复杂度;元胞自动机:边缘平滑、密度可控,适配大型洞穴,低复杂度;BSP树分割:结构规整、房间有序,适配传统地牢,中复杂度。1.2 核心开发原则无单一完美算法,多算法混合是最优方案;基础算法生成地形骨架,后处理决定可玩性;种子唯一锁定地图,支持复现与存档;开发顺序:连通性验证→地形美化→内容摆放。2. 随机游走算法(Random Walk)2.1 核心原理初始化全墙体地图,虚拟挖掘者四向随机移动,行走路径转为地面,生成自然蜿蜒的洞穴与通道。2.2 基础实现function randomWalk(width,height,steps,seed)
    math.randomseed(seed)
    local map={}
    for x=1,width do map[x]={};for y=1,height do map[x][y]=1 end end
    local cx,cy=math.floor(width/2),math.floor(height/2)
    map[cx][cy]=0
    local dirs={{0,-1},{0,1},{-1,0},{1,0}}
    for i=1,steps do
        local d=dirs[math.random(1,4)]
        cx=math.max(2,math.min(cx+d[1],width-1))
        cy=math.max(2,math.min(cy+d[2],height-1))
        map[cx][cy]=0
    end
    return map
end2.3 多挖掘者并行解决单挖掘者地形单调、单通道问题,多挖掘者同步挖掘,地形更开阔。function multiWalkerRandomWalk(width,height,count,steps,seed)
    math.randomseed(seed)
    local map={}
    for x=1,width do map[x]={};for y=1,height do map[x][y]=1 end end
    local dirs={{0,-1},{0,1},{-1,0},{1,0}}
    local sx,sy=math.floor(width/2),math.floor(height/2)
    for w=1,count do
        local cx,cy=sx,sy;map[cx][cy]=0
        for i=1,steps do
            local d=dirs[math.random(1,4)]
            cx=math.max(2,math.min(cx+d[1],width-1))
            cy=math.max(2,math.min(cy+d[2],height-1))
            map[cx][cy]=0
        end
    end
    return map
end2.4 方向加权游走自定义方向权重,定向生成水平隧道、垂直矿井、斜向矿脉。水平隧道:上下0.1、左右0.4;垂直矿井:上下0.1/0.6、左右0.15;均匀洞穴:四向均等0.25。function weightedRandomWalk(w,h,steps,weight,seed)
    math.randomseed(seed)
    local map={}
    for x=1,w do map[x]={};for y=1,h do map[x][y]=1 end end
    local cx,cy=math.floor(w/2),math.floor(h/2);map[cx][cy]=0
    local dirs={{0,-1,weight.up},{0,1,weight.down},{-1,0,weight.left},{1,0,weight.right}}
    local total=0;for _,v in ipairs(dirs) do total=total+v[3] end
    for i=1,steps do
        local r=math.random()*total,acc=0,sel=dirs[1]
        for _,v in ipairs(dirs) do acc=acc+v[3];if r<=acc then sel=v break end end
        cx=math.max(2,math.min(cx+sel[1],w-1))
        cy=math.max(2,math.min(cy+sel[2],h-1))
        map[cx][cy]=0
    end
    return map
end2.5 空间扩张优化拓宽狭窄通道,让洞穴更饱满平滑。function countNeighborFloors(map,x,y)
    local c=0
    for dx=-1,1 do for dy=-1,1 do
        if not(dx==0 and dy==0) and map[x+dx] and map[x+dx][y+dy]==0 then c=c+1 end
    end end
    return c
end
function expandSpaces(map,w,h,thres,prob,iter)
    for i=1,iter do
        local nm=table.clone(map)
        for x=2,w-1 do for y=2,h-1 do
            if map[x][y]==1 and countNeighborFloors(map,x,y)>=thres and math.random()<prob then nm[x][y]=0 end
        end end
        map=nm
    end
    return map
end3. Perlin噪声地形生成3.1 原理生成0~1连续平滑随机值,多层分形叠加,模拟自然高低地形、分层地质,适配大陆、岛屿、多层地下地形。3.2 极简噪声实现local function fade(t)return t*t*t*(t*(t*6-15)+10)end
local function lerp(a,b,t)return a+(b-a)*t end
local function hash(x,y,s)local h=s+x*374761393+y*668265263;h=(h~h>>13)*1274126177;return(h%1000)/1000 end
function valueNoise2D(x,y,s)
    local ix,iy=math.floor(x),math.floor(y)
    local fx,fy=x-ix,y-iy
    local v00,v10=hash(ix,iy,s),hash(ix+1,iy,s)
    local v01,v11=hash(ix,iy+1,s),hash(ix+1,iy+1,s)
    return lerp(lerp(v00,v10,fade(fx)),lerp(v01,v11,fade(fx)),fade(fy))
end
function fractalNoise2D(x,y,oct,pers,s)
    local total,amp,freq,maxv=0,1,1,0
    for i=1,oct do total=total+valueNoise2D(x*freq,y*freq,s+i*100)*amp;maxv=maxv+amp;amp=amp*pers;freq=freq*2 end
    return total/maxv
end3.3 高度图地形生成function genNoiseTerrain(w,h,scale,thres,s)
    local map={}
    for x=1,w do map[x]={}
        for y=1,h do map[x][y]=fractalNoise2D(x*scale,y*scale,4,0.5,s)>thres and 1 or 0 end
    end
    return map
end3.4 多材质分层生成通过多噪声+深度权重,实现土壤、岩石等地质分层随机分布。function genMultiMatMap(w,h,defs,s)
    local map={}
    for x=1,w do map[x]={}
        for y=1,h do
            local best,bt=-1,defs[1].id
            for i,d in ipairs(defs) do
                local n=fractalNoise2D(x*d.scale,y*d.scale,d.oct or 4,0.5,s+i*9999)
                local sc=n*d.getWeight(y)
                if sc>best then best=sc;bt=d.id end
            end
            map[x][y]=bt
        end
    end
    return map
end4. 元胞自动机洞穴生成4.1 原理随机初始化墙体地面,迭代检测8邻域墙体数量:邻域墙>4转墙、<4转地面、=4保持不变,多次迭代生成平滑自然洞穴。4.2 完整实现function countWallNeighbor(map,x,y,w,h)
    local c=0
    for dx=-1,1 do for dy=-1,1 do
        if dx==0 and dy==0 then goto continue end
        local nx,ny=x+dx,y+dy
        if nx<1 or nx>w or ny<1 or ny>h or map[nx][ny]==1 then c=c+1 end
        ::continue::
    end end
    return c
end
function genCaveCA(w,h,rate,iter,s)
    math.randomseed(s)
    local map={}
    for x=1,w do map[x]={}
        for y=1,h do map[x][y]=(x==1 or x==w or y==1 or y==h) and 1 or math.random()<rate and 1 or 0 end
    end
    for i=1,iter do
        local nm={}
        for x=1,w do nm[x]={}
            for y=1,h do
                local cnt=countWallNeighbor(map,x,y,w,h)
                nm[x][y]=cnt>4 and 1 or cnt<4 and 0 or map[x][y]
            end
        end
        map=nm
    end
    return map
end4.3 核心参数参考墙体占比0.40开阔、0.45均衡推荐、0.50密集、0.55迷宫;迭代3次粗糙、5次平滑推荐、8次过度模糊。5. BSP树分割地牢生成5.1 原理递归二分分割地图空间,叶节点生成独立房间,走廊连通所有房间,生成规整地牢关卡。5.2 完整实现function splitNode(node,minS)
    local canH,canV=node.h>=minS*2+2,node.w>=minS*2+2
    if not canH and not canV then return end
    local splitH=(canH and canV) and math.random()<0.5 or canH
    if splitH then
        local sp=math.random(minS+1,node.h-minS)
        node.left={x=node.x,y=node.y,w=node.w,h=sp}
        node.right={x=node.x,y=node.y+sp,w=node.w,h=node.h-sp}
    else
        local sp=math.random(minS+1,node.w-minS)
        node.left={x=node.x,y=node.y,w=sp,h=node.h}
        node.right={x=node.x+sp,y=node.y,w=node.w-sp,h=node.h}
    end
    splitNode(node.left,minS);splitNode(node.right,minS)
end
function createRoom(node,map,minS)
    if node.left then createRoom(node.left,map,minS) end
    if node.right then createRoom(node.right,map,minS) end
    if node.left or node.right then return end
    local rw,rh=math.random(minS,node.w-2),math.random(minS,node.h-2)
    local rx,ry=node.x+math.random(1,node.w-rw-1),node.y+math.random(1,node.h-rh-1)
    node.room={x=rx,y=ry,w=rw,h=rh}
    for x=rx,rx+rw-1 do for y=ry,ry+rh-1 do if map[x] then map[x][y]=0 end end end
end
function carveCorridor(map,x1,y1,x2,y2)
    local x,y=x1,y1
    while x~=x2 do map[x][y]=0 x=x+(x2>x and 1 or -1) end
    while y~=y2 do map[x][y]=0 y=y+(y2>y and 1 or -1) end
end
function connectRoom(node,map)
    if node.left and node.right and node.left.room and node.right.room then
        carveCorridor(map,node.left.room.x,node.left.room.y,node.right.room.x,node.right.room.y)
    end
    if node.left then connectRoom(node.left,map) end
    if node.right then connectRoom(node.right,map) end
end
function genBSPDungeon(w,h,minS,s)
    math.randomseed(s)
    local map={}
    for x=1,w do map[x]={};for y=1,h do map[x][y]=1 end end
    local root={x=1,y=1,w=w,h=h}
    splitNode(root,minS)
    createRoom(root,map,minS)
    connectRoom(root,map)
    return map
end6. 洪水填充与连通性验证6.1 洪水填充遍历连通地面区域,统计面积、标记区块,是区域检测核心工具。function floodFill(map,sx,sy,w,h)
    local vis,cnt,que={},0,{{sx,sy}}
    local key=function(x,y)return x..","..y end
    vis[key(sx,sy)]=true
    local d={{0,-1},{0,1},{-1,0},{1,0}}
    while #que>0 do
        local p=table.remove(que,1)
        local x,y=p[1],p[2];cnt=cnt+1
        for _,v in ipairs(d) do
            local nx,ny=x+v[1],y+v[2]
            local nk=key(nx,ny)
            if nx>=1 and nx<=w and ny>=1 and ny<=h and not vis[nk] and map[nx][ny]==0 then
                vis[nk]=true;table.insert(que,{nx,ny})
            end
        end
    end
    return vis,cnt
end6.2 连通性修复自动识别孤立小区域,连通至主区域,杜绝卡死、无法探索问题。function ensureConnect(map,w,h)
    local gVis,reg={},{}
    local key=function(x,y)return x..","..y end
    for x=1,w do for y=1,h do
        if map[x][y]==0 and not gVis[key(x,y)] then
            local vis,cnt=floodFill(map,x,y,w,h)
            table.insert(reg,{vis=vis,cnt=cnt,x=x,y=y})
            for k in pairs(vis) do gVis[k]=true end
        end
    end end
    if #reg<=1 then return end
    table.sort(reg,function(a,b)return a.cnt>b.cnt end)
    local main=reg[1]
    for i=2,#reg do carveCorridor(map,reg[i].x,reg[i].y,main.x,main.y) end
end7. 混合策略与后处理7.1 标准生成流程基础骨架生成→细节优化→连通修复→后处理美化→游戏内容放置7.2 经典混合方案自然矿洞:随机游走+空间扩张+元胞平滑;传统地牢:BSP房间+随机游走走廊;分层地形:多层噪声+加权矿脉;岛屿地貌:噪声高度图+元胞海岸线优化。7.3 后处理工具函数function thickenBorder(map,w,h,thick)
    for t=1,thick do
        for x=1,w do map[x][t]=1;map[x][h-t+1]=1 end
        for y=1,h do map[t][y]=1;map[w-t+1][y]=1 end
    end
end
function removeSmallRoom(map,w,h,minS)
    local vis={},key=function(x,y)return x..","..y end
    for x=1,w do for y=1,h do
        if map[x][y]==0 and not vis[key(x,y)] then
            local v,c=floodFill(map,x,y,w,h)
            if c<minS then for k in pairs(v) do local px,py=k:match("(%d+),(%d+)");map[tonumber(px)][tonumber(py)]=1 end end
            for k in pairs(v) do vis[k]=true end
        end
    end end
end8. 瓦片地图渲染基础8.1 自动拼接(Auto-Tile)四邻域检测生成编码,自动匹配边缘、角落贴图,实现无缝拼接。function getAutoTile(map,x,y)
    local t=map[x]and map[x][y-1]==1 and 1 or 0
    local r=map[x+1]and map[x+1][y]==1 and 1 or 0
    local b=map[x]and map[x][y+1]==1 and 1 or 0
    local l=map[x-1]and map[x-1][y]==1 and 1 or 0
    return t*8+r*4+b*2+l
end8.2 瓦片随机变体固定坐标种子随机,避免贴图重复单调。function getTileVar(x,y,max,s)return (x*374761+y*668265+s)%max+1 end9. 可破坏地形系统9.1 瓦片破损系统血量分级破损,4级完全销毁,适配挖掘、爆破交互。TileBase={type="stone",hp=100,maxHp=100,crack=0}
function damageTile(tile,dmg)
    tile.hp=math.max(0,tile.hp-dmg)
    local p=tile.hp/tile.maxHp
    tile.crack=p<=0 and 4 or p<=0.25 and 3 or p<=0.5 and 2 or p<=0.75 and 1 or 0
    return tile.crack==4
end9.2 碎片粒子效果function spawnDebris(x,y,color,count)
    local p={}
    for i=1,count do table.insert(p,{x=x,y=y,vx=(math.random()-0.5)*200,vy=-math.random()*150-50,rot=math.random()*360,rs=(math.random()-0.5)*720,life=0.4,col=color}) end
    return p
end
function updateParticle(p,dt,grav)
    grav=grav or 500
    local i=1;while i<=#p do
        local v=p[i]
        v.x=v.x+v.vx*dt;v.y=v.y+v.vy*dt;v.vy=v.vy+grav*dt
        v.rot=v.rot+v.rs*dt;v.life=v.life-dt;v.col[4]=math.max(0,v.life/0.4)
        if v.life<=0 then table.remove(p,i) else i=i+1 end
    end
end10. 性能优化策略10.1 分块加载超大地图分区块加载,仅渲染可视范围,降低性能消耗。CHUNK=16
function getChunk(x,y)return math.floor((x-1)/CHUNK)+1,math.floor((y-1)/CHUNK)+1 end
function getVisibleChunk(cx,cy,vw,vh)
    local minx,miny=getChunk(cx-vw/2,cy-vh/2)
    local maxx,maxy=getChunk(cx+vw/2,cy+vh/2)
    return minx-1,miny-1,maxx+1,maxy+1
end10.2 对象池复用复用粒子、特效对象,减少GC开销。function newPool(create,reset,init)
    local pool={obj={},crt=create,rst=reset}
    for i=1,init or 20 do local o=create();o.active=false;table.insert(pool.obj,o) end
    return pool
end
function poolGet(p)
    for _,v in ipairs(p.obj) do if not v.active then v.active=true;p.rst(v);return v end end
    local o=p.crt();o.active=true;table.insert(p.obj,o);return o
end
function poolRelease(p,o)o.active=false end10.3 脏标记渲染仅重绘变动瓦片,摒弃全帧重绘。local dirty={}
function markDirty(x,y)dirty[x..","..y]=true end
function renderDirty()for k in pairs(dirty)do local x,y=k:match("(%d+),(%d+)");renderTile(tonumber(x),tonumber(y)) end;dirty={} end11. 算法选型决策树自然洞穴:元胞自动机(开阔)、随机游走(蜿蜒);规整地牢:BSP分割;大陆岛屿:Perlin噪声;矿脉通道:加权随机游走;复杂地形:多算法混合后处理。12. 极简可运行模板12.1 随机游走矿洞模板local w,h=60,40
local map=multiWalkerRandomWalk(w,h,5,200,os.time())
map=expandSpaces(map,w,h,4,0.5,2)
ensureConnect(map,w,h)12.2 通用地形生成管线function genWorld(cfg)
    local w,h=cfg.width,cfg.height
    local s=cfg.seed or os.time()
    local map
    if cfg.style=="cave" then map=genCaveCA(w,h,0.45,5,s)
    elseif cfg.style=="dungeon" then map=genBSPDungeon(w,h,6,s)
    elseif cfg.style=="terrain" then map=genNoiseTerrain(w,h,0.05,0.5,s)
    elseif cfg.style=="mine" then map=genMultiMatMap(w,h,cfg.mat,s) end
    removeSmallRoom(map,w,h,5)
    thickenBorder(map,w,h,2)
    ensureConnect(map,w,h)
    return map
end13. 实战参数微调对照表汇总所有算法落地最优参数,无需反复试错,直接复制使用,适配绝大多数2D瓦片游戏场景。13.1 随机游走参数表小型矿洞(30×30):挖掘步数80-120、挖掘者数量2-3、扩张迭代2次,通道纤细、洞穴密集;中型洞穴(60×40):步数180-220、挖掘者4-6、扩张迭代2-3次,地形开阔自然;大型地下廊道(80×50):步数300+、挖掘者6-8、扩张阈值3,通道连贯无断点;定向隧道:水平权重左右0.4、上下0.1,垂直隧道上下0.5、左右0.15。13.2 元胞自动机参数表清新开阔洞穴:墙体初始占比0.40、迭代4次,空洞大面积、边缘柔和;标准通用洞穴(推荐):占比0.45、迭代5次,空洞与墙体比例均衡;密集岩窟:占比0.50、迭代6次,墙体多、通道曲折;迷宫式洞穴:占比0.55、迭代7次,分支极多、探索性极强。固定规则:迭代超过8次会导致地形扁平化,失去细节,禁止过度迭代。13.3 BSP地牢参数表迷你地牢(40×30):最小房间尺寸5,房间小巧紧凑、走廊短;标准地牢(70×50):最小房间尺寸6,房间大小错落、布局规整;大型多层地牢(100×70):最小房间尺寸7,大房间居多、适合分区探索;核心禁忌:最小房间尺寸小于4会生成无效碎房间,大于8会导致地图空旷、内容稀疏。13.4 Perlin噪声地形参数表平缓平原地貌:缩放0.03、4层分形、阈值0.5,地形起伏微弱;丘陵山地地貌:缩放0.06、4层分形、阈值0.48,高低层次明显;孤岛崎岖地貌:缩放0.08、5层分形、阈值0.52,地形破碎、边缘自然;地质分层:浅层高频噪声生成土壤,中层中频生成矿石,底层低频生成基岩。14. 开发高频避坑指南汇总开发中90%的报错、地形BUG根源,针对性给出解决方案,规避开发踩坑。14.1 通用地形BUG修复孤立空地BUG:生成后必须执行连通性修复,小面积区块会被自动清除或连通,彻底解决玩家卡死角、无法探索问题;边界镂空BUG:地图四边强制加厚墙体2格,杜绝边缘出现悬空空地、穿模地形;地形过碎BUG:生成后清理5格以下小区块,保证地图整体完整、游玩流畅;地形单调BUG:禁止单一算法生成,必须搭配后处理、加权参数、随机变体优化细节。14.2 算法专属坑点随机游走:单挖掘者易生成单条死胡同,必须多挖掘者+空间扩张;步数过少地形空白过多,步数过多地形完全糊化。元胞自动机:初始墙体占比超过0.6会生成全墙地图,低于0.3会生成全空地,无洞穴质感。BSP地牢:分割最小尺寸过小,会出现重叠房间、穿墙走廊;未连通叶节点会出现大量独立封闭房间。Perlin噪声:缩放值过大地形全是噪点,过小地形完全平坦,无层次变化。14.3 种子与复现问题全程固定种子随机,禁止无种子随机生成,否则地图无法复现、存档失效;多算法叠加时,不同模块使用种子偏移(seed+N),避免多模块地形高度雷同、重复单调。15. 进阶高阶优化方案15.1 地形权重分层进阶结合Y轴深度动态权重,实现真实地下地质规律:浅层以泥土、碎石为主,中层混合矿石、岩壁,深层纯基岩、稀有矿脉。可自定义不同深度的墙体概率、材质类型,打造递进式地下探索体验。function depthWeightTerrain(w,h,s)
    local map={}
    for x=1,w do map[x]={}
        for y=1,h do
            local depthRate=y/h
            local baseNoise=fractalNoise2D(x*0.05,y*0.05,4,0.5,s)
            -- 浅层泥土概率高,深层岩石概率高
            local thres=0.42+depthRate*0.15
            if baseNoise>thres then
                map[x][y]=depthRate<0.3 and 1 or depthRate<0.7 and 2 or 3
            else
                map[x][y]=0
            end
        end
    end
    thickenBorder(map,w,h,2)
    ensureConnect(map,w,h)
    return map
end15.2 动态难度地形生成根据游戏进度、玩家等级动态调整地形复杂度:低等级地图通道宽阔、洞穴稀疏、无复杂分支;高等级地图通道狭窄、迷宫分支多、地形密集,适配游戏难度曲线。function genDifficultyMap(w,h,level,s)
    local cfg={wallRate=0.42,iter=4,walkerStep=180}
    -- 等级越高,地形越复杂密集
    if level>3 then cfg.wallRate=0.46;cfg.iter=5;cfg.walkerStep=220 end
    if level>6 then cfg.wallRate=0.50;cfg.iter=6;cfg.walkerStep=280 end
    local map=genCaveCA(w,h,cfg.wallRate,cfg.iter,s)
    map=expandSpaces(map,w,h,3,0.4,2)
    removeSmallRoom(map,w,h,6)
    ensureConnect(map,w,h)
    return map
end15.3 无缝超大世界分块生成解决单地图尺寸上限问题,基于区块种子偏移,实现超大连续世界,区块之间地形无缝衔接,无断层、无拼接痕迹。核心原理:区块坐标参与种子计算,相邻区块噪声连续,保证地形自然过渡。function getChunkMap(cx,cy,chunkSize,baseSeed)
    -- 区块独立种子,保证地形连续不重复
    local chunkSeed=baseSeed+cx*10000+cy*100
    local map={}
    for x=1,chunkSize do map[x]={}
        for y=1,chunkSize do
            -- 全局坐标采样,实现无缝拼接
            local gx=cx*chunkSize+x
            local gy=cy*chunkSize+y
            local n=fractalNoise2D(gx*0.05,gy*0.05,4,0.5,chunkSeed)
            map[x][y]=n>0.45 and 1 or 0
        end
    end
    return map
end16. 完整成品项目案例整合所有算法、后处理、优化逻辑,提供两套可直接落地的完整项目模板,开箱即用。16.1 自然矿洞完整成品(推荐挖矿游戏)-- 配置参数
local WIDTH,HEIGHT=64,48
local SEED=os.time()
-- 一站式矿洞生成
function generateMineMap()
    -- 1.基础地形骨架
    local map=multiWalkerRandomWalk(WIDTH,HEIGHT,6,220,SEED)
    -- 2.空间扩张优化
    map=expandSpaces(map,WIDTH,HEIGHT,4,0.5,2)
    -- 3.地质分层替换
    map=genMultiMatMap(WIDTH,HEIGHT,{
        {id=1,scale=0.06,oct=4,getWeight=function(y)return 1-y/HEIGHT end},
        {id=2,scale=0.04,oct=5,getWeight=function(y)return math.abs(y/HEIGHT-0.5) end},
        {id=3,scale=0.03,oct=4,getWeight=function(y)return y/HEIGHT end}
    },SEED)
    -- 4.后处理修复
    removeSmallRoom(map,WIDTH,HEIGHT,6)
    thickenBorder(map,WIDTH,HEIGHT,2)
    ensureConnect(map,WIDTH,HEIGHT)
    return map
end
local finalMineMap=generateMineMap()16.2 标准地牢完整成品(推荐闯关游戏)local WIDTH,HEIGHT=80,60
local SEED=os.time()
function generateDungeonMap()
    -- 1.BSP生成规整房间
    local map=genBSPDungeon(WIDTH,HEIGHT,6,SEED)
    -- 2.随机游走柔化走廊,避免生硬直线
    map=expandSpaces(map,WIDTH,HEIGHT,3,0.3,1)
    -- 3.清理瑕疵地形
    removeSmallRoom(map,WIDTH,HEIGHT,8)
    thickenBorder(map,WIDTH,HEIGHT,2)
    -- 4.最终连通校验
    ensureConnect(map,WIDTH,HEIGHT)
    return map
end
local finalDungeonMap=generateDungeonMap()17. 文档总结与拓展方向本指南覆盖2D瓦片地图所有主流程序化生成方案,从基础算法、代码实现、参数微调、避坑方案到成品案例,形成完整开发闭环。所有代码纯Lua原生、无第三方依赖,兼容绝大多数游戏引擎,可直接移植使用。后续拓展方向:1. 加入房间权重、宝箱/怪物定点生成逻辑;2. 增加地形湿度、温度噪声,生成生物群系;3. 实现多层垂直地牢、上下层连通楼梯生成;4. 加入AI寻路适配,让生成地图天然支持角色移动;5. 新增腐化、动态地形变化的实时生成逻辑。
6
6