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
相关产品推荐
相关产品推荐

