2015-01-20 4 views
3

재귀가 아닌 스택으로 구현 된 재귀 Backtracker 버전을 사용하여 미로를 생성하는 루아 스크립트를 작성합니다. 현재 미로가 땋아 나오고 있으며 내 논리에서 이것이 어디에서 일어나고 있는지 파악할 수 없습니다.내 Lua 미로 작성기가 엮어지고 있습니다

local function buildMazeInternal(x,y,maze) 

    local stack = {} 
    local directions = {'North','East','South','West'} 

    table.insert(stack,{x=x,y=y}) 

    while #stack > 0 do 
     local index = 1 
     local nextX = x 
     local nextY = y 
     local braid = false 

     for i = #directions, 2, -1 do -- backwards 
      local r = calc:Roll(1,i) -- select a random number between 1 and i 
      directions[i], directions[r] = directions[r], directions[i] -- swap the randomly selected item to position i 
     end 

     while index <= #directions and nextX == x and nextY == y do 
      if directions[index] == 'North' and y > 1 and not maze[y-1][x].Visited then 
       maze[y][x].North = true 
       maze[y-1][x].South = true 
       nextY = y-1 
      elseif directions[index] == 'East' and x < width and not maze[y][x+1].Visited then 
       maze[y][x].East = true 
       maze[y][x+1].West = true 
       nextX = x+1 
      elseif directions[index] == 'South' and y < height and not maze[y+1][x].Visited then 
       maze[y][x].South = true 
       maze[y+1][x].North = true 
       nextY = y+1 
      elseif directions[index] == 'West' and x > 1 and not maze[y][x-1].Visited then 
       maze[y][x].West = true 
       maze[y][x-1].East = true 
       nextX = x-1 
      else 
       index = index + 1 
      end 
     end 

     if nextX ~= x or nextY ~= y then 
      x = nextX 
      y = nextY 
      maze[y][x].Visited = true 
      table.insert(stack,{x=x,y=y}) 
     else  
      x = stack[#stack].x 
      y = stack[#stack].y 
      table.remove(stack) 
     end 
    end 
end 

내가 뭔가를 바라 보는거야 알고 있지만 내가 그것을 잡을 수없는 것 :이 기능은 아래의 2 차원 구조 (테이블의 테이블) 인 미로를 생성하기위한 출발점으로 x와 y에 소요 하위. calc:Roll(1,100) 메서드는 내 응용 프로그램에서 .net 메서드로 롤링 주사위를 시뮬레이트하는 데 사용됩니다.이 경우 1 * 100 양면 다이는 응용 프로그램 외부에서 사용하기 위해 math.Random(1,100)에 대한 호출로 바꿀 수 있습니다.

+0

"꼰"이란 무엇입니까? – kikito

+0

미로에 막 다른 골목이 있거나 미로를 해결하지 못하는 경로를 의미합니다. – Lance

답변

1

나는 Reddit에 게시 한 후 대답을 찾았습니다. 초기 세포를 방문하여 두 번 통과 시키도록 설정하지 않았습니다. 수정은 table.insert(stack,{x=x,y=y}) 바로 앞에 maze[y][x].Visited = true을 추가하는 것이 었습니다.

1

적어도 한 가지 문제가 있습니다. 당신이 "올라가고 싶다"라고 갈 때, "위로있는 세포"가 방문되었는지 여부를 확인하고, 그렇다면, 당신은 올라가는 것을 건너 뜁니다.

올바른 IMHO가 아닙니다. 위로 올라가고 싶지만 현재 셀에서 "위로"이동 한 셀은 을 방문했지만 "아래쪽으로 이동합니다"출구가 인 경우 방문했기 때문에 건너 뛰지 않고 계속 올라갈 수 있습니다.

다른 방향에도 동일하게 적용됩니다.

그게 전부입니다.

+0

나는 다음을 잘 모르겠다. 나는 이전에 방문한 세포에 들어가고 싶지 않다. 막 다른 골목을 만들 것이기 ​​때문이다. 따라서 만약 나의 다음 방향이 북쪽이고 북쪽의 셀이 이미 방문 되었다면 나는 북쪽으로 가지 않아야합니다. 나는 다음 가능한 방향으로 나아 간다. – Lance

+0

당신이 일을 뒤섞어 버리고 있습니다. "한 방향으로 하나의 세포를 채우는 것"과 "다음에 치료할 세포를 선택하는 것"은 두 가지로 구분됩니다. 내가 말하고있는 것은 "당신은 잘못해서 일부 세포를 채우는 것을 건너 뛰고있다"는 것이다. 당신이 또한 "다음에 갈 세포를 선택하는 것"이 ​​잘못 될 수도 있지만, 나는 그 대답에 관해 입력하지 않았습니다. – kikito

+0

이 조건이 발생하는 곳이 표시되지 않습니다. 결정이 북쪽으로 가게되면, 북쪽에있는 세포의 상태는 이미 방문하지 않은 것으로 확인되었습니다. 셀에는 하나 또는 두 개의 이탈이있을 수 있습니다. 첫 번째 이탈은 셀을 처음 방문 할 때 결정되고 두 번째 이탈은 다음 셀이 결정될 때 결정됩니다. 나는 아직도 당신이 지적하고있는 문제를 오해하고있을 수 있습니다. – Lance