Создайте тот же лабиринт с семенем - PullRequest
0 голосов
/ 25 июня 2019

Я следовал руководству по созданию лабиринта с помощью Recursive Backtracking, и он прекрасно работает.

Я пытаюсь создать игру, в которой люди попадают в один лабиринт, и, если кто-то выигрывает, он создает новый лабиринт иКаждый лабиринт, который сейчас обновляется, обновляется.

Так что я думал о том, чтобы иметь семя, чтобы создать тот же лабиринт, и передать это семя всем игрокам, чтобы у них был тот же лабиринт.

Есть ли способ изменить его, чтобы я мог дать лабиринт семя, и он всегда создает один и тот же лабиринт?

Это то, что у меня есть сейчас:

Он использует класс 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 Ответ

2 голосов
/ 25 июня 2019

Если вы хотите передать начальное число для создания лабиринта, то вы должны убедиться, что все игроки используют один и тот же генератор случайных чисел.Это означает, что вы должны предоставить собственную реализацию генератора случайных чисел.

Приложение будет заполнять генератор случайных чисел переданным вами значением, а затем детерминистически генерировать одинаковую последовательность случайных чисел для каждого клиента.

Обратите также внимание, что вы никогда не сможете изменить реализацию генератора случайных чисел, если не докажете, что новая реализация будет генерировать точно такую ​​же последовательность чисел, что и оригинал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...