You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin实现无限随机房间生成时出口无法正常连通问题

类后室无限探索游戏房间连通逻辑故障问题

使用Kotlin开发安卓平台类后室(Backrooms)无限探索游戏,核心设计规则:

  • 玩家探索地图时,进入未访问房间会随机生成新房间,生成物品、出口等属性后持久化存储,保证返回同一坐标时加载相同房间
  • 新房间生成时检查六个方向(上下左右、上下楼层)的相邻已存在房间,自动匹配对应出口、梯子、楼梯实现连通:例如左侧已存在房间设有右出口,则新房间设置左出口与其连通;若相邻房间尚未生成,则按预设概率随机决定是否设置对应通路

故障表现

  • 实际运行时通路无法按预期连通,最初怀疑Random.nextBoolean()存在问题,将所有相关调用替换为1~2区间随机取整判断的逻辑后问题依旧
  • 多次调整仅出现连通率提升的错觉,重新生成已存在房间时连通成功率看似更高,但始终无法达到100%
  • 测试发现无限地图边缘出现不符合50%出口概率的连续高墙,连通逻辑异常
  • 已通过手机测试截图拼接绘制部分生成的地图,可直观看到出口不连通、边缘连续高墙的异常现象,现寻求该连通逻辑故障的根因与修复方案

相关代码

房间生成核心逻辑

if (!rooms.containsKey(playerCoordinate)) {

    val newRoom = Room(playerCoordinate).apply {

    // Next-door rooms
    val roomL = Coordinate(playerCoordinate.x - 1L, playerCoordinate.y, playerCoordinate.z)
    val roomR = Coordinate(playerCoordinate.x + 1L, playerCoordinate.y, playerCoordinate.z)
    val roomT = Coordinate(playerCoordinate.x, playerCoordinate.y+1L, playerCoordinate.z)
    val roomB = Coordinate(playerCoordinate.x, playerCoordinate.y-1L, playerCoordinate.z)
    val roomU = Coordinate(playerCoordinate.x, playerCoordinate.y, playerCoordinate.z+1L)
    val roomD = Coordinate(playerCoordinate.x, playerCoordinate.y, playerCoordinate.z-1L)

        // Randomizes the properties and add things like exits or ladders if the room next-door has one leading here.
        exitT = if(rooms.containsKey(roomT)) {
             Room(roomT).exitB
        } else when((1..2).random()) {
            1 -> false
            else -> true
        }

        exitB = if(rooms.containsKey(roomB)) {
            Room(roomB).exitT
        } else when((1..2).random()) {
            1 -> false
            else -> true
        }

        exitL = if(rooms.containsKey(roomL)) {
            Room(roomL).exitR
        } else when((1..2).random()) {
            1 -> false
            else -> true
        }

        exitR = if(rooms.containsKey(roomR)) {
            Room(roomR).exitL
        } else when((1..2).random()) {
            1 -> false
            else -> true
        }

        upLadder = if(rooms.containsKey(roomU)) {
            Room(roomU).downLadder
        } else when((1..15).random()) {
            in 1..14 -> false
            else -> true
        }

        downLadder = if(rooms.containsKey(roomD)) {
            Room(roomD).upLadder
        } else when((1..15).random()) {
            in 1..14 -> false
            else -> true
        }

        upStairs = if(rooms.containsKey(roomU)) {
            Room(roomU).downStairs
        } else when((1..10).random()) {
            in 1..9 -> false
            else -> true
        }

        downStairs = if(rooms.containsKey(roomD)) {
            Room(roomD).upStairs
        } else when((1..10).random()) {
            in 1..9 -> false
            else -> true
        }

        prizeBox = when((1..30).random()) {
            in 1..29 -> false
            else -> Random.nextBoolean()
        }

        if(playerCoordinate.x == 0L && playerCoordinate.y == 0L && playerCoordinate.z == 0L) {
        exitT = true
        exitB = true
        exitL = true
        exitR = true
        }
    }
    rooms[playerCoordinate] = newRoom
}

基础数据类定义

data class Coordinate(
val x: Long = 0,
val y: Long = 0,
val z: Long = 0
) {

    fun moveX(amount: Long) = copy(x = x + amount)
    fun moveY(amount: Long) = copy(y = y + amount)
    fun moveZ(amount: Long) = copy(z = z + amount)
}

class Room(val coordinate: Coordinate) {
    var exitT: Boolean = true
    var exitB: Boolean = true
    var exitL: Boolean = true
    var exitR: Boolean = true
    var upLadder: Boolean = true
    var downLadder: Boolean = true
    var upStairs: Boolean = true
    var downStairs: Boolean = true
    var prizeBox: Boolean = false
}

enum class Movement {
    None, Start, Left, Right, Top, Bottom, UpLadder, DownLadder, UpStairs, DownStairs
}

内容的提问来源于stack exchange,提问作者Zytron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:30:44