파이썬에서 Way Point 기반 시나리오 맵 자료구조는 시나리오의 여러 지점을 나타내고 그 지점들 간의 이동 경로를 관리하는 데 사용됩니다. 이를 통해 특정한 경로, 행동, 혹은 이벤트들이 일어나는 위치를 정의할 수 있습니다. 이러한 구조는 특히 게임 개발, 로봇 경로 탐색, 네비게이션 시스템에서 많이 사용됩니다.
Way Point 기반 시나리오 맵 자료구조
- Way Point: 지도나 시나리오 상의 특정 지점을 의미하며, 각 지점은 좌표(위치)를 포함할 수 있습니다.
- 경로(Path): 각 Way Point 간의 연결(Edge)을 나타내며, 두 지점 간의 거리를 포함할 수 있습니다.
- 시나리오 맵: 여러 Way Point가 연결되어 이루어진 경로 맵으로, 시나리오에서 중요한 위치와 그 간의 이동 경로를 관리합니다.
기본적인 자료구조
- 노드(Node): 각각의 Way Point를 표현합니다. 위치 정보와 함께 특정 이벤트나 상태를 가질 수 있습니다.
- 간선(Edge): Way Point 간의 연결을 의미하며, 이 연결을 통해 이동 경로와 거리를 정의할 수 있습니다.
파이썬으로 구현한 Way Point 기반 시나리오 맵 예제
예제 코드
class WayPoint:
def __init__(self, name, x, y):
self.name = name # Way Point 이름
self.x = x # X 좌표
self.y = y # Y 좌표
self.connections = {} # 연결된 다른 Way Point와의 경로(거리)
def add_connection(self, other_waypoint, distance):
"""다른 Way Point와의 연결 추가"""
self.connections[other_waypoint] = distance
def __repr__(self):
return f"WayPoint({self.name}, ({self.x}, {self.y}))"
class ScenarioMap:
def __init__(self):
self.waypoints = {} # 시나리오 맵의 모든 Way Point를 저장하는 딕셔너리
def add_waypoint(self, waypoint):
"""새로운 Way Point 추가"""
self.waypoints[waypoint.name] = waypoint
def connect_waypoints(self, name1, name2, distance):
"""두 Way Point 간의 연결 추가"""
if name1 in self.waypoints and name2 in self.waypoints:
wp1 = self.waypoints[name1]
wp2 = self.waypoints[name2]
wp1.add_connection(wp2, distance)
wp2.add_connection(wp1, distance)
def get_waypoint(self, name):
"""Way Point 이름으로 해당 지점 가져오기"""
return self.waypoints.get(name)
def display_map(self):
"""시나리오 맵을 출력"""
for wp in self.waypoints.values():
print(f"{wp} -> {[f'{conn.name} (distance: {dist})' for conn, dist in wp.connections.items()]}")
# 사용 예제
if __name__ == "__main__":
# ScenarioMap 생성
scenario_map = ScenarioMap()
# Way Point 추가
wp1 = WayPoint("Start", 0, 0)
wp2 = WayPoint("Point A", 2, 3)
wp3 = WayPoint("Point B", 4, 7)
wp4 = WayPoint("End", 8, 5)
scenario_map.add_waypoint(wp1)
scenario_map.add_waypoint(wp2)
scenario_map.add_waypoint(wp3)
scenario_map.add_waypoint(wp4)
# Way Point 간 연결 설정
scenario_map.connect_waypoints("Start", "Point A", 5)
scenario_map.connect_waypoints("Point A", "Point B", 4)
scenario_map.connect_waypoints("Point B", "End", 6)
scenario_map.connect_waypoints("Start", "End", 10)
# 맵 출력
scenario_map.display_map()
예제 설명
WayPoint 클래스:
WayPoint
는 각 지점을 나타냅니다. 각 Way Point는 이름(name
), X, Y 좌표(x
,y
), 그리고 연결된 다른 Way Point들과의 연결 정보(connections
)를 갖습니다.add_connection()
메서드는 현재 Way Point에 다른 Way Point와의 연결을 추가하며, 이때 거리를 포함합니다.
ScenarioMap 클래스:
- 시나리오 전체를 관리하는 클래스입니다. 여러 Way Point를 추가하고, 그 Way Point들 간의 연결을 설정할 수 있습니다.
add_waypoint()
는 새로운 Way Point를 추가하며,connect_waypoints()
는 두 지점 간의 연결(경로)과 거리를 설정합니다.display_map()
메서드는 각 Way Point와 그 연결 상태를 출력합니다.
경로 설정:
- 각 Way Point는 다른 Way Point와 거리를 기반으로 연결되며, 양방향 경로를 설정하여 이동 가능하게 만듭니다.
거리 기반 경로 연결:
- 두 Way Point 간의 거리를 지정하여 경로를 연결할 수 있으며, 이를 통해 실제 시나리오에서 각 지점 간 이동 가능성을 표현할 수 있습니다.
실행 결과
WayPoint(Start, (0, 0)) -> ['Point A (distance: 5)', 'End (distance: 10)']
WayPoint(Point A, (2, 3)) -> ['Start (distance: 5)', 'Point B (distance: 4)']
WayPoint(Point B, (4, 7)) -> ['Point A (distance: 4)', 'End (distance: 6)']
WayPoint(End, (8, 5)) -> ['Point B (distance: 6)', 'Start (distance: 10)']
주요 포인트
Way Point와 연결 관리:
- 각 Way Point는 다른 Way Point들과 연결되며, 연결된 경로의 거리를 관리합니다. 이를 통해 경로 탐색, 최단 경로 계산 등에 활용할 수 있습니다.
유연한 확장:
- 기본적인 경로 및 지점 관리 외에도 이벤트 발생, 상태 변경, 혹은 특정 조건부 경로 등을 추가하여 시나리오를 확장할 수 있습니다.
응용:
- 게임에서의 경로 탐색 시스템, 물류 시스템에서의 경로 최적화, 로봇 경로 계획, 네비게이션 시스템 등에 활용할 수 있습니다.
확장성:
- 이 기본 구조를 확장하여 경로의 우선순위, 지점 간 조건부 연결, 특정 이벤트 발생 여부 등을 관리할 수 있습니다.
이와 같이 Way Point 기반의 자료구조는 시나리오 맵에서 경로와 지점을 효과적으로 관리할 수 있으며, 다양한 분야에서 유연하게 사용될 수 있습니다.
'실용적인 코드 샘플' 카테고리의 다른 글
[실용적인 코드 샘플] `object` 클래스를 상속 사용자 정의 데이터 타입 (1) | 2024.10.23 |
---|---|
[실용적인 코드 샘플] 히스토리 기반 통계 작성 클래스 (8) | 2024.10.22 |
[실용적인 코드 샘플] 메타클래스 기반 게임 설정값 저장 클래스 (0) | 2024.10.20 |
[실용적인 코드 샘플] 리스트 상속 기반 스택(Stack) 자료구조 (2) | 2024.10.20 |
[실용적인 코드 샘플] Singleton 패턴 (클래스 변수, 메타클래스 활용) (2) | 2024.10.19 |