PS 공부

[이것이 코딩테스트다 with 파이썬] chap4 구현. 게임 개발

Min00 2024. 3. 22. 15:20

게임판이 n*m 정사각형

각 칸은 육지 혹은 바다

캐릭터는 동서남북 중 하나를 바라봄

 

  0 1 2 3

0

1

2

3

이런 구조의 게임판 형태

 

캐릭터의 행동 매뉴얼은 다음과 같다

1. 현재 위치, 현재 방향을 기준으로 반시계 방향 90도 방향부터 갈 곳을 정함

2. 그 방향에 가보지 않은 칸이 존재하면 회전 후 한칸 전진

3. 없으면 회전 수행 후 1번으로 복귀

4. 네 방향 모두 이미 가봤거나 바다로 되어 있으면 방향 유지 후 한 칸 뒤로 이동 후 1번으로 복귀

5. 이 때 한 칸 뒤가 바다라 이동 불가면 멈추기

 

맵이 입력되고 0이면 육지 1이면 바다

둘째줄에 캐릭터의 좌표와 바라보는 방향이 공백으로 구분되서 주어짐

0123 순서대로 북동남서 

 

# index 순으로 북동남서
dx = [0,1,0,-1]
dy = [-1,0,1,0]

# input 받기

n, m = map(int, input().split(' '))

board = []

# 캐릭터
x, y, dir = map(int, input().split(' '))


for i in range(n):
    board.append(list(map(int, input().split(' '))))



# 회전
def turn(dir):
    if dir == 0:
        return 3
    else:
        return dir-1

count = 1
turntime = 0 

# 캐릭터가 시작한 위치는 간걸로 취급
board[x][y]=2

# 이동 시작

while(True):
    # 1. 캐릭터의 현재 좌표 기준 반시계 90도로 회전
    # 북>서, 서>남 남>동 동>북

    dir = turn(dir)

    new_x = x+dx[dir]
    new_y = y+dy[dir]

    # 갈 수 있는 곳 
    if board[new_x][new_y] == 0:
        # 이동 수행
        x = new_x
        y = new_y

        # turntime 초기화
        turntime = 0

        # 갔다고 표시
        board[x][y] = 2
        count +=1

    if turntime==4:
        # 다 돌고 돌아온거 
        turntime = 0
        new_x = x-dx[dir]
        new_y = y-dy[dir]

        if board[new_x][new_y] == 1:
            break

        else: 
            turntime = 0
            x=new_x
            y=new_y

    # 갈 수 없음
    turntime+=1

print(count)