用种子产生相同的迷宫

时间:2019-06-25 19:55:12

标签: android algorithm kotlin maze

我遵循了一个教程,通过递归回溯创建迷宫,并且效果很好。

我正在尝试创建一个人们在同一迷宫中游戏,如果有人获胜,它将创建一个新迷宫,并且每个人当前的迷宫都将更新。

所以我在想的是拥有一个种子来创建相同的迷宫并将该种子传递给所有玩家,以便他们可以拥有相同的迷宫。

有没有一种方法可以修改它,以便我可以给迷宫一个种子,并且它总是创建相同的迷宫?

这就是我现在拥有的:

它使用Cell类(posx,posy)

class Cell(var col:Int = 0, var row: Int = 0){
    var topWall = true
    var leftWall = true
    var bottomWall = true
    var rightWall = true
    var visited = false
}
    fun createMaze(){
    var stack = Stack<Cell>()
    var current:Cell
    var next:Cell?


    for(x in 0 until COLS){
        for(y in 0 until ROWS){

            cells[x][y] = Cell(x,y)
        }
    }

    player = cells[0][0]
    exit = cells [COLS-1][ROWS-1]


    current = cells[0][0]
    current.visited = true

    do{
        next = getNeighbour(current)
        if(next != null) {
            removeWall(current, next)
            stack.push(current)
            current = next
            current.visited = true
        }else{
            current = stack.pop()
        }
    }while (!stack.empty())

}
fun getNeighbour(cell:Cell): Cell? {
    var vecinos: ArrayList<Cell> = ArrayList()
    //vecino izquierda
    if(cell.col > 0) {
        if (!cells[cell.col - 1][cell.row].visited) {
            vecinos.add(cells[cell.col - 1][cell.row])
        }
    }
    //vecino derecha
    if(cell.col < COLS - 1) {
        if (!cells[cell.col + 1][cell.row].visited) {
            vecinos.add(cells[cell.col + 1][cell.row])
        }
    }
    //vecino arriba
    if(cell.row > 0) {
        if (!cells[cell.col][cell.row - 1].visited) {
            vecinos.add(cells[cell.col ][cell.row - 1])
        }
    }
    //vecino abajo
    if(cell.row < ROWS - 1) {
        if (!cells[cell.col][cell.row + 1].visited) {
            vecinos.add(cells[cell.col][cell.row + 1])
        }
    }
    if (vecinos.size > 0) {
        var index = random.nextInt(vecinos.size)
        return vecinos[index]
    }else {
        return null
    }
}

fun removeWall(current:Cell,next:Cell){
    if (current.col == next.col && current.row == next.row +1){
        current.topWall = false
        next.bottomWall = false
    }
    if (current.col == next.col && current.row == next.row -1){
        current.bottomWall = false
        next.topWall = false
    }
    if (current.col == next.col + 1 && current.row == next.row){
        current.leftWall = false
        next.rightWall = false
    }
    if (current.col == next.col - 1 && current.row == next.row){
        current.rightWall = false
        next.leftWall = false
    }
}

1 个答案:

答案 0 :(得分:2)

如果要传递种子来创建迷宫,则必须确保所有玩家都使用相同的随机数生成器。这意味着您必须提供自己的随机数生成器实现。

应用程序将使用您传递的值为随机数生成器提供种子,然后为每个客户端确定性地生成相同的随机数序列。

还请注意,除非能证明新的实现将生成与原始生成的数字完全相同的数字序列,否则您将永远无法更改随机数生成器的实现。