본문 바로가기

IT/python

미로 만들기

반응형

파이썬의 예제보다는 알고리즘 팁? 에 가깝다.

 

막히지 않운 던전을 만들기 위한 알고리즘 이다.

 

1. 던전크기 선언 ( 11, 9 )

2. 주변을 벽으로 만든다 ( 1 == 벽 )

3. 일단 안쪽은 이동 가능한 공간 ( 0 == 통로 )

4. 1칸 간격으로 기둥을 세운다  ( 1 == 벽 )

5. 각 기둥에서 상하좌우 랜덤하게 벽을 생성한다

   단, 2번째 열부터 왼쪽으로는 벽을 만들지 않는다! ( <-- 핵심 )

 

이렇게 하면 막히지 않은 던전을 만들 수 있다!

 

아래는 책에서 발췌한 소스이다.

 

import pygame
import sys
import random

CYAN = (0, 255, 255)
GRAY = (96, 96, 96)

MAZE_W = 11
MAZE_H = 9
maze = []
for y in range(MAZE_H):
    maze.append([0] * MAZE_W)

def make_maze():
    XP = [0, 1, 0, -1]
    YP = [-1, 0, 1, 0]

    # 주변 벽
    for x in range(MAZE_W):
        maze[0][x] = 1
        maze[MAZE_H - 1][x] = 1
    for y in range(1, MAZE_H - 1):
        maze[y][0] = 1
        maze[y][MAZE_W - 1] = 1

    # 안을 아무것도 없는 상태로
    for y in range(1, MAZE_H - 1):
        for x in range(1, MAZE_W - 1):
            maze[y][x] = 0

    # 기둥
    for y in range(2, MAZE_H - 2, 2):
        for x in range(2, MAZE_W - 2, 2):
            maze[y][x] = 1

    # 기둥에서 상하좌우로 벽 생성
    for y in range(2, MAZE_H - 2, 2):
        for x in range(2, MAZE_W - 2, 2):
            d = random.randint(0, 3)
            if x > 2:  # 2번째 열부터 왼쪽으로는 벽을 만들지 않음
                d = random.randint(0, 2)
            maze[y + YP[d]][x + XP[d]] = 1


def main():
    pygame.init()
    pygame.display.set_caption("미로 생성")
    screen = pygame.display.set_mode((528, 432))
    clock = pygame.time.Clock()

    make_maze()

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    make_maze()

        for y in range(MAZE_H):
            for x in range(MAZE_W):
                W = 48
                H = 48
                X = x * W
                Y = y * H
                if maze[y][x] == 0:  # 미로
                    pygame.draw.rect(screen, CYAN, [X, Y, W, H])
                if maze[y][x] == 1:  # 벽
                    pygame.draw.rect(screen, GRAY, [X, Y, W, H])

        pygame.display.update()
        clock.tick(2)

if __name__ == '__main__':
    main()

이런 알고리즘을 모르면 무조건 랜덤생성 -> 막혔는지 검사 알고리즘으로 만들었을것 같다.

역시 사람은 알아야함..

반응형