디아블로의 맵 기반 인공지능 요소는 주로 적의 이동 경로 탐색, 전투 행동, 거리 기반 반응 등을 포함합니다. 게임 내 적들이 플레이어 위치와 거리에 따라 반응하고, 장애물을 피하며 이동하는 방식으로 AI가 작동합니다. 여기서는 이러한 AI 요소를 간단한 예제로 설명해 보겠습니다.
디아블로 AI 요소의 특징
경로 탐색(Pathfinding):
- 적은 플레이어의 위치를 추적하면서 최단 경로로 이동합니다.
- 장애물이나 벽을 피하면서 이동하며, 대표적인 알고리즘으로 A* (A-star) 경로 탐색 알고리즘을 사용할 수 있습니다.
거리 기반 반응:
- 적은 일정 거리 내에 플레이어가 있을 때 공격 모드로 전환하거나 접근합니다.
- 일정 범위 밖으로 플레이어가 나가면 경로 탐색을 멈추고 원래 위치로 돌아가거나 경계 모드로 전환합니다.
행동 패턴:
- 적들은 플레이어가 가까이 있을 때 근거리 공격, 멀리 있을 때 원거리 공격 등의 다양한 패턴을 가질 수 있습니다.
- 특정 체력 이하가 되면 도망가거나 방어 자세로 전환하는 등 다양한 상태 변화가 가능합니다.
파이썬 예제 코드
아래 예제는 간단한 AI 캐릭터가 플레이어를 추적하고, 일정 거리에 도달하면 공격 모드로 전환하는 예제입니다. A* 알고리즘을 사용하여 장애물을 피하면서 이동합니다.
import math
import heapq
class Position:
def __init__(self, x, y):
self.x = x
self.y = y
def distance_to(self, other):
return math.sqrt((self.x - other.x) ** 2 + (self.y - other.y) ** 2)
def __repr__(self):
return f"({self.x}, {self.y})"
class Enemy:
def __init__(self, position, attack_range):
self.position = position
self.attack_range = attack_range
def move_towards(self, target_position, map_grid):
"""A* 알고리즘을 사용해 목표 위치로 이동"""
path = a_star_search(self.position, target_position, map_grid)
if path:
self.position = path[1] # 다음 위치로 이동
print(f"Enemy moves to {self.position}")
else:
print("No path found.")
def is_in_attack_range(self, player_position):
return self.position.distance_to(player_position) <= self.attack_range
def __repr__(self):
return f"Enemy at {self.position}"
def a_star_search(start, goal, grid):
"""간단한 A* 알고리즘 구현"""
def heuristic(pos1, pos2):
return abs(pos1.x - pos2.x) + abs(pos1.y - pos2.y)
open_list = []
heapq.heappush(open_list, (0, start))
came_from = {}
cost_so_far = {start: 0}
while open_list:
_, current = heapq.heappop(open_list)
if current == goal:
path = []
while current in came_from:
path.append(current)
current = came_from[current]
path.append(start)
path.reverse()
return path
neighbors = [
Position(current.x + dx, current.y + dy)
for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]
]
for next_pos in neighbors:
if 0 <= next_pos.x < len(grid) and 0 <= next_pos.y < len(grid[0]) and grid[next_pos.x][next_pos.y] == 0:
new_cost = cost_so_far[current] + 1
if next_pos not in cost_so_far or new_cost < cost_so_far[next_pos]:
cost_so_far[next_pos] = new_cost
priority = new_cost + heuristic(goal, next_pos)
heapq.heappush(open_list, (priority, next_pos))
came_from[next_pos] = current
return None
# 지도와 캐릭터 설정
map_grid = [
[0, 0, 0, 1, 0],
[0, 1, 0, 1, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0]
]
enemy = Enemy(Position(0, 0), attack_range=1.5)
player_position = Position(4, 4)
# AI 동작 예시
while not enemy.is_in_attack_range(player_position):
enemy.move_towards(player_position, map_grid)
print("Enemy is in attack range and starts attacking!")
코드 설명
Position 클래스:
x
와y
좌표를 가진 위치를 나타내며, 다른 위치까지의 거리를 계산하는distance_to
메서드를 포함합니다.Enemy 클래스:
position
: 적의 현재 위치.attack_range
: 적이 공격할 수 있는 거리.move_towards
: A* 알고리즘을 사용하여 목표 위치(플레이어)로 이동.is_in_attack_range
: 적이 플레이어와의 거리를 계산하여 공격 범위 내에 있는지 확인합니다.
A* 알고리즘:
a_star_search
함수는 시작 위치에서 목표 위치까지의 최적 경로를 찾기 위해 A* 알고리즘을 구현한 것입니다.- 이 알고리즘은
heuristic
함수를 사용하여 목표 위치에 대한 추정 거리를 계산하고,open_list
우선순위 큐를 이용해 최단 경로를 탐색합니다.
AI 동작 예시:
- 적은 플레이어 위치에 접근할 수 있는 경로가 있는 경우 계속 움직이며, 공격 범위에 들어오면 멈추고 공격 모드로 전환합니다.
이 코드는 디아블로의 기본 AI 요소를 모델링한 간단한 예시로, 실제 게임에서는 더욱 정교한 장애물 회피 및 다양한 행동 패턴이 추가됩니다.
'디아블로 게임 분석' 카테고리의 다른 글
[디아블로 게임 분석] 디아블로 게임의 랭킹 시스템 예시 (4) | 2024.10.26 |
---|---|
[디아블로 게임 분석] 게임 환경과 기후 요소 설명 및 예제 (2) | 2024.10.26 |
[디아블로 게임 분석] 객체지향 스킬트리, 아이템 속성 클래스 예제 (2) | 2024.10.25 |
[디아블로 게임 분석] 게임 스킬 트리, 아이템 속성, 인벤토리 설명 (0) | 2024.10.25 |
[디아블로 게임 분석] 절차적 생성(Procedural Generation) 기법 (0) | 2024.10.25 |