게임개발

 

p.118쪽

코드

n, m = map(int, input().split())
start_x, start_y, state = map(int, input().split())


arrow_move = {0:[-1, 0], 1:[0, 1], 2:[-1,0], 3:[0,-1]}
# 북, 동, 남, 서

world = []
for h in range(n):
  list()
  world.append(list(map(int, input().split())))

cur_y, cur_x = start_y, start_x

# 방문한건 바다로 변경하자.

round = 0
result = 1
tp_count = 0

while(True):
  
  if tp_count == 4:    # 4방향을 다 돌았는데도 이동할 없으면 뒤로 한칸
    if world[cur_y + arrow_move[(round + 2) % 4][0]][cur_x + arrow_move[(round +2 )% 4 ][1]] == 1:
      break
    else:
      print("여기서 갱신")
      world[cur_y + arrow_move[(round +2) %4]][0][cur_x + arrow_move[(round + 2)% 4][1]] = 1
      cur_y += arrow_move[(round+2 % 4)][0]
      cur_x += arrow_move[(round +2)% 4][1]


  if world[cur_y + arrow_move[round % 4][0]][cur_x + arrow_move[round % 4][1]] == 0:  # 방문한 적 없다면(바다가 아니라면) 이동하고 현재위치 갱신
    print("갱신")
    world[cur_y + arrow_move[round % 4][0]][cur_x + arrow_move[round % 4][1]] = 1
    cur_y += arrow_move[round % 4][0]
    cur_x += arrow_move[round % 4][1]

    result += 1
    
    tp_count = 0    
    
  else:
    pass

  tp_count += 1
  round += 1

print(result)

접근했던 방법

  1. 동,서,남,북 중 하나의 방향으로 움직일 때 움직이는 좌표 방향을 dictionary로 지정해둠
    arrow_move = {0:[-1, 0], 1:[0, 1], 2:[-1,0], 3:[0,-1]}
    
  2. 타일 하나를 방문했을 경우 그 타일을 1로 바꿔서 바다와 같은 취급을 했음
    world[cur_y + arrow_move[round % 4][0]][cur_x + arrow_move[round % 4][1]] = 1
    
  3. tp_count 변수로 4방향 모두에 이동이 불가할 경우, 뒤로 가게하고, 뒤로도 못 갈 경우 종료시킴
  4. mod 연산 이후 + 2를 더해주면 index가 초과되는 경우를 대비하여 +2 연산 이후 mod 연산을 해줌
    • 북, 동, 남, 서의 순환하는 순서로 뒀기 때문에 +2를 먼저 해주고 mod를 취하는것과, mod 이후 +2를 해주는 것의 결과 차이가 없음

서적 참고하여 피드백

  • global 키워드를 통한 직관적 기능구현
      turn_left()
    
    • 위 함수만 보이니 직관적임
  • direction 변수와 dx, dy 리스트를 활용하여 깔끔하게 회전 기능 구현한 것에 주목
    • 내가 이게 처음 할 때 잘 안되는 부분임. 이 부분이 매끄러워야 빠른 문제 해결이 가능할 것임
  • continue를 활용하여 코드가 내가 원하는 방식대로 흘러갈 수 있도록 함
    • continue 키워드는 반복문의 최초 지점으로 되돌아감
  • (내가 놓친 부분) 4방향 다 막히거나 바다에 빠졌을 경우엔 방문했던 육지여도 뒤로 한칸 가는것임
    • 난 이 부분 고려 못해서, if문에서 가보지 않고, 육지인 경우에만 이동하게 했음