재귀 분할을 사용하여 미로 생성기를 만들려고합니다. 이 링크를 사용합니다 : 미로 생성-재귀 분할 (작동 방식) 문제에 접근하는 방법에 대한 지침으로.
지금까지 내 코드는 다음과 같습니다.
import random
# Maze: 0 - N : 4 x 4 Grid
# Grid: 0 - (2n + 1) : 9 x 9 Array
# TODO: Now, Find a way to save the previous walls and not just only one at a time
rows = 9
cols = 9
start = 2
end = 7
# -------------------------------------------------------------------------------------
# Lists for all even / odd numbers in given range
evens = [n for n in range(start, end+1) if n % 2 == 0]
odds = [m for m in range(start, end+1) if m % 2 != 0]
# Generate random even/odd integer value for walls/ passages respectively
# Walls: Not sure if 2 variables are necessary-----------------------------------------
wallX = random.choice(evens)
wallY = random.choice(evens)
# Passages
passageX = random.choice(odds)
passageY = random.choice(odds)
#--------------------------------------------------------------------------------------
# Random direction: True = Horizontal Slice, False = Vertical Slice
randomDirection = random.choice([True, False])
arr = [['0' for i in range(cols)] for j in range(rows)]
def displayBoard(arr):
print()
for i in range(len(arr)):
for j in range(len(arr[i])):
# Print just the edges
if i == 0 or i == 8 or j == 0 or j == 8:
print('*', end = ' ')
# Print wall
elif arr[i][j] == 1:
print('.', end = ' ')
else:
print (' ', end = ' ')
print()
# Function choose direction to slice
def chooseDir(arr):
for i in range(len(arr)):
for j in range(len(arr[i])):
# Horizontal Direction Slice
if randomDirection:
arr[wallX][j] = 1
arr[wallX][passageY] = 2
print(arr[i][j], end = ' ')
# Vertical Slice
else:
arr[i][wallY] = 1
arr[passageX][wallY] = 2
print(arr[i][j], end = ' ')
print()
displayBoard(arr)
print()
mazeX = 0
mazeY = 0
# Write the recursive division function:
def divide():
chooseDir(arr)
print()
divide()
이것이 생성하는 것은 짝수 인덱스 (벽 생성)에서 무작위로 슬라이스되고 홀수 인덱스에서 통로를 생성하는 그리드입니다. 출력 : 1 = 벽, 2 = 만든 통로
0 0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 2 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0 0
* * * * * * * * *
* . *
* . *
* *
* . *
* . *
* . *
* . *
* * * * * * * * *
내 문제는 재귀 함수를 작성하는 방법을 모른다는 것입니다. 벽을 만들 때 생성 된 두 개의 새로운 셀에 대해 분할을 호출하고 "하위 셀"을 지속적으로 분할합니까?
또는 4 x 4 셀 그리드가 9 x 9 배열을 제공하고 총 16 셀이 있다는 것을 알고 있습니다. 그런 다음 특정 조건이 충족 될 때까지 division을 호출하고 16 개 모두가 방문 할 때까지 다음 셀로 증가 할 수 있습니다. 두 경우 모두 분할 함수를 작성할 수 있도록 생성 된 새 벽 / 셀을 표현하는 방법을 잘 모르겠습니다. 지금까지는 그리드 좌표를 사용했습니다.
당신은 "벽을 만들 때 생성 된 두 개의 새로운 셀에 대해 분할을 호출하고"하위 셀 "을 지속적으로 분할합니까"라고 물었습니다. 예, 그것이 재귀의 본질입니다. 큰 문제를 가지고 작은 문제를 만드십시오. 작은 문제로 반복하십시오. 결국 문제는 쉽게 해결할 수있을만큼 작습니다. 그런 다음 모든 작은 문제를 다시 모아 원래 문제를 해결하십시오.
미로의 경우 첫 번째 벽은 미로를 두 개의 작은 미로로 나눕니다. 동일한 알고리즘을 사용하여 각각을 분할하고 4 개의 작은 미로가 없습니다. 하위 미로가 너무 작아서 더 이상 분할 할 수 없을 때까지 반복합니다.
미로를 분할하는 코드는 함수에 있어야합니다. 하위 미로가 분할하기에 충분히 크면 함수는 하위 미로를 분할 한 다음 두 개의 작은 하위 미로에서 자신을 호출합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다