디아블로의 맵 기반 인공지능 요소는 주로 적의 이동 경로 탐색, 전투 행동, 거리 기반 반응 등을 포함합니다. 게임 내 적들이 플레이어 위치와 거리에 따라 반응하고, 장애물을 피하며 이동하는 방식으로 AI가 작동합니다. 여기서는 이러한 AI 요소를 간단한 예제로 설명해 보겠습니다.

디아블로 AI 요소의 특징

  1. 경로 탐색(Pathfinding):

    • 적은 플레이어의 위치를 추적하면서 최단 경로로 이동합니다.
    • 장애물이나 벽을 피하면서 이동하며, 대표적인 알고리즘으로 A* (A-star) 경로 탐색 알고리즘을 사용할 수 있습니다.
  2. 거리 기반 반응:

    • 적은 일정 거리 내에 플레이어가 있을 때 공격 모드로 전환하거나 접근합니다.
    • 일정 범위 밖으로 플레이어가 나가면 경로 탐색을 멈추고 원래 위치로 돌아가거나 경계 모드로 전환합니다.
  3. 행동 패턴:

    • 적들은 플레이어가 가까이 있을 때 근거리 공격, 멀리 있을 때 원거리 공격 등의 다양한 패턴을 가질 수 있습니다.
    • 특정 체력 이하가 되면 도망가거나 방어 자세로 전환하는 등 다양한 상태 변화가 가능합니다.

파이썬 예제 코드

아래 예제는 간단한 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!")

코드 설명

  1. Position 클래스: xy 좌표를 가진 위치를 나타내며, 다른 위치까지의 거리를 계산하는 distance_to 메서드를 포함합니다.

  2. Enemy 클래스:

    • position: 적의 현재 위치.
    • attack_range: 적이 공격할 수 있는 거리.
    • move_towards: A* 알고리즘을 사용하여 목표 위치(플레이어)로 이동.
    • is_in_attack_range: 적이 플레이어와의 거리를 계산하여 공격 범위 내에 있는지 확인합니다.
  3. A* 알고리즘:

    • a_star_search 함수는 시작 위치에서 목표 위치까지의 최적 경로를 찾기 위해 A* 알고리즘을 구현한 것입니다.
    • 이 알고리즘은 heuristic 함수를 사용하여 목표 위치에 대한 추정 거리를 계산하고, open_list 우선순위 큐를 이용해 최단 경로를 탐색합니다.
  4. AI 동작 예시:

    • 적은 플레이어 위치에 접근할 수 있는 경로가 있는 경우 계속 움직이며, 공격 범위에 들어오면 멈추고 공격 모드로 전환합니다.

이 코드는 디아블로의 기본 AI 요소를 모델링한 간단한 예시로, 실제 게임에서는 더욱 정교한 장애물 회피 및 다양한 행동 패턴이 추가됩니다.

+ Recent posts