用种子生成相同的迷宫
Generate the same maze with a seed
我按照教程使用递归回溯创建了一个迷宫,效果很好。
我正在尝试创建一个人们进入同一个迷宫的游戏,如果有人赢了,它会创建一个新的迷宫,每个人当前的迷宫都会得到更新。
所以我想的是有一个种子来创建相同的迷宫,并将该种子传递给所有玩家,这样他们就可以拥有相同的迷宫。
有没有办法修改它,以便我可以给迷宫一个种子,它总是创建相同的迷宫?
这是我现在拥有的:
它使用一个单元格class (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
}
}
如果你想通过种子来创建迷宫,那么你必须确保所有玩家都使用相同的随机数生成器。这意味着您必须提供自己的随机数生成器实现。
应用程序将使用您传递的值作为随机数生成器的种子,然后它应该为每个客户端确定性地生成相同的随机数序列。
另请注意,您永远无法更改随机数生成器的实现,除非您可以证明新的实现将生成与原始实现完全相同的数字序列。
我按照教程使用递归回溯创建了一个迷宫,效果很好。
我正在尝试创建一个人们进入同一个迷宫的游戏,如果有人赢了,它会创建一个新的迷宫,每个人当前的迷宫都会得到更新。
所以我想的是有一个种子来创建相同的迷宫,并将该种子传递给所有玩家,这样他们就可以拥有相同的迷宫。
有没有办法修改它,以便我可以给迷宫一个种子,它总是创建相同的迷宫?
这是我现在拥有的:
它使用一个单元格class (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
}
}
如果你想通过种子来创建迷宫,那么你必须确保所有玩家都使用相同的随机数生成器。这意味着您必须提供自己的随机数生成器实现。
应用程序将使用您传递的值作为随机数生成器的种子,然后它应该为每个客户端确定性地生成相同的随机数序列。
另请注意,您永远无法更改随机数生成器的实现,除非您可以证明新的实现将生成与原始实现完全相同的数字序列。