미로에서 그리드를 재귀 적으로 나누는 방법은 무엇입니까?

초급 1030

재귀 분할을 사용하여 미로 생성기를 만들려고합니다. 이 링크를 사용합니다 : 미로 생성-재귀 분할 (작동 방식) 문제에 접근하는 방법에 대한 지침으로.

지금까지 내 코드는 다음과 같습니다.

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 개 모두가 방문 할 때까지 다음 셀로 증가 할 수 있습니다. 두 경우 모두 분할 함수를 작성할 수 있도록 생성 된 새 벽 / 셀을 표현하는 방법을 잘 모르겠습니다. 지금까지는 그리드 좌표를 사용했습니다.

RootTwo

당신은 "벽을 만들 때 생성 된 두 개의 새로운 셀에 대해 분할을 호출하고"하위 셀 "을 지속적으로 분할합니까"라고 물었습니다. 예, 그것이 재귀의 본질입니다. 큰 문제를 가지고 작은 문제를 만드십시오. 작은 문제로 반복하십시오. 결국 문제는 쉽게 해결할 수있을만큼 작습니다. 그런 다음 모든 작은 문제를 다시 모아 원래 문제를 해결하십시오.

미로의 경우 첫 번째 벽은 미로를 두 개의 작은 미로로 나눕니다. 동일한 알고리즘을 사용하여 각각을 분할하고 4 개의 작은 미로가 없습니다. 하위 미로가 너무 작아서 더 이상 분할 할 수 없을 때까지 반복합니다.

미로를 분할하는 코드는 함수에 있어야합니다. 하위 미로가 분할하기에 충분히 크면 함수는 하위 미로를 분할 한 다음 두 개의 작은 하위 미로에서 자신을 호출합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

재귀 쿼리를 동적으로 만드는 방법은 무엇입니까?

분류에서Dev

무료 모나드 인터프리터를 재귀 적으로 만드는 방법은 무엇입니까?

분류에서Dev

트리에 여러 이미지 형식을 재귀 적으로 나열하는 방법은 무엇입니까?

분류에서Dev

트리에 여러 이미지 형식을 재귀 적으로 나열하는 방법은 무엇입니까?

분류에서Dev

객체를 중첩 객체로 나누는 방법은 무엇입니까? (재귀적인 방법)

분류에서Dev

C ++에서 재귀 적으로 역순으로 세트를 인쇄하는 방법은 무엇입니까?

분류에서Dev

PHP에서 재귀 적으로 트리 배열을 평평하게 만드는 방법은 무엇입니까?

분류에서Dev

파이썬에서 재귀 적으로 빈 디렉토리를 찾는 방법은 무엇입니까?

분류에서Dev

하위 디렉토리와 크기를 재귀 적으로 나열하는 방법은 무엇입니까?

분류에서Dev

하위 디렉토리와 크기를 재귀 적으로 나열하는 방법은 무엇입니까?

분류에서Dev

Laravel에서 재귀 적으로 레코드를 얻는 방법은 무엇입니까?

분류에서Dev

컨트롤러 외부에서 ActiveModel :: Serializers를 재귀 적으로 사용하는 방법은 무엇입니까?

분류에서Dev

SQL에서 연간 롤오버를 재귀 적으로 계산하는 방법은 무엇입니까?

분류에서Dev

NodeList에서 JSON 계층 구조를 재귀 적으로 구성하는 방법은 무엇입니까?

분류에서Dev

객체에서 재귀 적으로 자식 객체를 제거하는 방법은 무엇입니까?

분류에서Dev

elisp에서 함수를 재귀 적으로 전달하는 방법은 무엇입니까?

분류에서Dev

lxml에서 특정 요소와 하위 요소를 재귀 적으로 얻는 방법은 무엇입니까?

분류에서Dev

한 번에 여러 디렉토리를 재귀 적으로 grep하는 방법은 무엇입니까?

분류에서Dev

명령 줄에서 HTTPS를 통해 WebDAV 서버에 디렉토리를 재귀 적으로 업로드하는 방법은 무엇입니까?

분류에서Dev

Windows 축소판을 재귀 적으로 자동으로 만드는 방법은 무엇입니까?

분류에서Dev

ViewParent 트리를 재귀 적으로 반복하는 방법은 무엇입니까?

분류에서Dev

재귀 적으로 디렉토리 및 파일 수를 계산하는 방법은 무엇입니까?

분류에서Dev

Linux를 사용하여 FTP 서버를 재귀 적으로 검색하는 방법은 무엇입니까?

분류에서Dev

디렉토리에 저장된 양을 재귀 적으로 찾는 방법은 무엇입니까?

분류에서Dev

foo /*.* 디렉토리 아래에 내용을 재귀 적으로 압축하는 방법은 무엇입니까?

분류에서Dev

foo /*.* 디렉토리 아래에 내용을 재귀 적으로 압축하는 방법은 무엇입니까?

분류에서Dev

런타임에 ActionBar를 재귀 적으로 생성하는 방법은 무엇입니까?

분류에서Dev

그리드에서 특정 유형의 셀을 재귀 적으로 식별하는 방법은 무엇입니까?

분류에서Dev

이 팩토리얼 프로그램에서 재귀를 설명하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    재귀 쿼리를 동적으로 만드는 방법은 무엇입니까?

  2. 2

    무료 모나드 인터프리터를 재귀 적으로 만드는 방법은 무엇입니까?

  3. 3

    트리에 여러 이미지 형식을 재귀 적으로 나열하는 방법은 무엇입니까?

  4. 4

    트리에 여러 이미지 형식을 재귀 적으로 나열하는 방법은 무엇입니까?

  5. 5

    객체를 중첩 객체로 나누는 방법은 무엇입니까? (재귀적인 방법)

  6. 6

    C ++에서 재귀 적으로 역순으로 세트를 인쇄하는 방법은 무엇입니까?

  7. 7

    PHP에서 재귀 적으로 트리 배열을 평평하게 만드는 방법은 무엇입니까?

  8. 8

    파이썬에서 재귀 적으로 빈 디렉토리를 찾는 방법은 무엇입니까?

  9. 9

    하위 디렉토리와 크기를 재귀 적으로 나열하는 방법은 무엇입니까?

  10. 10

    하위 디렉토리와 크기를 재귀 적으로 나열하는 방법은 무엇입니까?

  11. 11

    Laravel에서 재귀 적으로 레코드를 얻는 방법은 무엇입니까?

  12. 12

    컨트롤러 외부에서 ActiveModel :: Serializers를 재귀 적으로 사용하는 방법은 무엇입니까?

  13. 13

    SQL에서 연간 롤오버를 재귀 적으로 계산하는 방법은 무엇입니까?

  14. 14

    NodeList에서 JSON 계층 구조를 재귀 적으로 구성하는 방법은 무엇입니까?

  15. 15

    객체에서 재귀 적으로 자식 객체를 제거하는 방법은 무엇입니까?

  16. 16

    elisp에서 함수를 재귀 적으로 전달하는 방법은 무엇입니까?

  17. 17

    lxml에서 특정 요소와 하위 요소를 재귀 적으로 얻는 방법은 무엇입니까?

  18. 18

    한 번에 여러 디렉토리를 재귀 적으로 grep하는 방법은 무엇입니까?

  19. 19

    명령 줄에서 HTTPS를 통해 WebDAV 서버에 디렉토리를 재귀 적으로 업로드하는 방법은 무엇입니까?

  20. 20

    Windows 축소판을 재귀 적으로 자동으로 만드는 방법은 무엇입니까?

  21. 21

    ViewParent 트리를 재귀 적으로 반복하는 방법은 무엇입니까?

  22. 22

    재귀 적으로 디렉토리 및 파일 수를 계산하는 방법은 무엇입니까?

  23. 23

    Linux를 사용하여 FTP 서버를 재귀 적으로 검색하는 방법은 무엇입니까?

  24. 24

    디렉토리에 저장된 양을 재귀 적으로 찾는 방법은 무엇입니까?

  25. 25

    foo /*.* 디렉토리 아래에 내용을 재귀 적으로 압축하는 방법은 무엇입니까?

  26. 26

    foo /*.* 디렉토리 아래에 내용을 재귀 적으로 압축하는 방법은 무엇입니까?

  27. 27

    런타임에 ActionBar를 재귀 적으로 생성하는 방법은 무엇입니까?

  28. 28

    그리드에서 특정 유형의 셀을 재귀 적으로 식별하는 방법은 무엇입니까?

  29. 29

    이 팩토리얼 프로그램에서 재귀를 설명하는 방법은 무엇입니까?

뜨겁다태그

보관