-
12월 22일 - TIL스파르타 부트 캠프/TIL 2021. 12. 22. 18:00
오늘 한일
- 턴제 게임 RPG 만들기
- 샤오미 알고리즘
#턴제 게임 RPG 만들기
class를 이용한 간단한 game만들기
구현을 하면서 검색을 통해 알게 된것으로는
- 함수에서 클래스의 이름을 알고싶을때
- colab 에서 import 하는 방법
- 상속받은 클래스에서 데이터 추가할 때
1. 함수에서 클래스 이름을 알고 싶을때
class Car: def __init__(self, name): self.name = name
Car클래스 를 만들고
a = Car('Audi') def what_is_class_name(value): return type(value).__name__ print(what_is_class_name(a)) # Car 출력
함수에 인자로전달되서 들어온 클래스의 이름을 확인하고 싶을 떄 type과 __name__을 사용하면 된다.
2. Colab 파일 분리
Colab 이용시 파일을 분리하여 작성할 때는 내 드라이브를 마운트 해줘야하며 남에게 공유할시 공유폴더를 만들어 공유한다.
또한 코드를 각각 만들고 위에서 같이 실행을 해주면 된다.
(코드셀을 3개만들고 3개의 각각 파일을 넣고 main함수를 마지막에 실행 )
3. 상속받은 클래스에서 데이터 추가할 때 ( 비추 )
class Car: def __init__(self, nubmer, distance, kind): self.number = number # 차량 넘버 self.all_distance = distance # 주행 거리 self.kinds = kind # 종류
다음과 같은 부모 클래스가 있고
Class grandeur(Car): def __init__(self): super().__init__(self, number, distansce, kind, id_value) self.number = number self.all_distance = distance self.kinds = kind self.id = id_value
다음과 같은 자식 클래스가 있을때 __init__ 함수 안에 super의 __init__을 불러와서 작성해줘도 되지만
추천하지 않는 방법 이라 함
참조 블로그 : https://blockdmask.tistory.com/445
[Python] 파이썬 클래스2 상속, 추상 클래스, 메서드 오버라이딩
안녕하세요. BlockDMask 입니다. 오늘은 지난시간에 이어서 파이썬 class 2탄 입니다. 오늘 배워볼것은 상속에 대한것 인데요. 상속도 굉장히 중요한 개념이니 꼭 알고 넘어 가시길 바랍니다. 지난시
blockdmask.tistory.com
# 전체 코드
https://colab.research.google.com/drive/15QioAKhmU8ByHr8zrLsVuBWZQo1D_oBJ
turn_base_RPG_game.ipynb
Colaboratory notebook
colab.research.google.com
# 샤오미 로봇 청소기 알고리즘 문제
문제에 대한 이해를 됬으나 작동 방식에 대한 이해가 조금 부족하여 다시 풀게됨
처음 구현한 부분은 Class를 만들어 진행했지만 어딘가에서 꼬여버려 목표한 답이 나오질 않았다.
이후 답안을 참조하여 작동방식에 대한 이해가 높아졌는데
자세한건 알고리즘 문제에서 또 작성을 해야겠다.
알게된 점
Queue의 이용
DFS의 실사용 및 들어 있어야하는 값 확인
#전체코드
current_r, current_c, current_d = 6, 3, 1 current_room_map = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ] test1 = [ [1, 1, 1, 1, 1], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 1, 1, 1, 1] ] current_room_map2 = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ] current_room_map3 = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1], [1, 0, 0, 1, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ] def left_direction(direct): return (direct + 3) % 4 def back_direction(direct): return (direct + 2) % 4 def get_count_of_departments_cleaned_by_robot_vacuum(r, c, d, room_map): dir_k = [[-1, 0], [0, 1], [1, 0], [0, -1]] # 방향을 바꿀 인덱스 목록 curr_r, curr_c = r, c # 현재 위치 work_list = [] # 남아있는 list 목록 check_left = d # 방향 back = 0 # back 변수 move_cnt = 1 # 이동 방향 세기 # DFS while len(work_list) <= 0: # 작업목록의 갯수가 적을 떄 back = 0 room_map[curr_r][curr_c] = 2 # 현재 위치 청소 for i in range(4): # 4반 회전 check_left = left_direction(check_left) # 현재 방향의 왼쪽 방향 [row, col] = dir_k[check_left] # 왼쪽 방향의 인덱스 row, col if room_map[row + curr_r][col + curr_c] == 0: # 왼쪽 방향의 값이 0이라면 work_list.append([row + curr_r, col + curr_c]) break # 탈출 - 탈출하는 이유 : 작동방식이 회전한후 청소하지 않으면 바로 move이기 때문에, 다른 인덱스에서 사라진다 elif i == 3: # 4번 회전시까지 외쪽 방향에 청소할 구간이 없다면 -> 1,2라면 check_back = back_direction(check_left) # 뒤쪽 방향으로 변경 [b_row, b_col] = dir_k[check_back] # 뒤쪽 방향 더 해야할 인덱스 얻기 if room_map[curr_r + b_row][curr_c + b_col] == 1: # 뒤쪽 인덱스가 벽이라면 print('로봇을 종료합니다.') # 종료 return move_cnt # 움직인 횟수를 반환 else: # 뒤쪽 방향에 벽이 아니라 청소한 구간 -> 2 curr_r, curr_c = curr_r+b_row, curr_c + b_col # 후진진행 back = 1 # for탈출 하기 위한 back 변수 ON if back == 1: # 후진을 해야하는 상황 continue else: [curr_r, curr_c] = work_list.pop(0) # 후진이 아니라면 move_cnt += 1 # 움직인 거리 + 1 # 57 가 출력되어야 합니다! print(get_count_of_departments_cleaned_by_robot_vacuum(current_r, current_c, current_d, current_room_map2))
실제 답안보다 코드가 더 길어 졌지만 처음으로 성공한 것 같다.
논리적인 부분이나 queue에 들어있어야하는 값 및 들어가야하는 값 파악을 잘 못해서 풀지 못했던 것같다.
'스파르타 부트 캠프 > TIL' 카테고리의 다른 글
TIL - 12월 25일 (0) 2021.12.26 TIL - 12월 24일 (0) 2021.12.25 12월 23일 (0) 2021.12.23 12월 20일 - TIL (0) 2021.12.20 웹 프로그래밍 (12/ 15일) 개발일지 (0) 2021.12.20