Python을 사용하여 AI 제어 유령으로 Pac-Man을 다음 단계로 끌어 올리십시오!

Mar 19 2023
Pac-Man은 여러 세대의 게이머들이 즐겨온 고전 아케이드 게임입니다. 그러나 기술이 발전함에 따라 보다 역동적인 게임 플레이 경험도 가능해졌습니다.

Pac-Man은 여러 세대의 게이머들이 즐겨온 고전 아케이드 게임입니다. 그러나 기술이 발전함에 따라 보다 역동적인 게임 플레이 경험도 가능해졌습니다.

이 튜토리얼에서는 AI 제어 고스트가 포함된 Pac-Man 버전을 만들 것입니다. 이 유령들은 플레이어의 전략을 배우고 적응하여 게임을 더욱 도전적이고 흥미롭게 만듭니다. Python을 프로그래밍 언어로 사용하고 이를 달성하기 위해 강화 학습 및 신경망과 같은 다양한 AI 알고리즘을 탐색할 것입니다.

의제:

  1. 게임 환경 설정
  2. 팩맨 캐릭터 만들기
  3. AI 제어 고스트 캐릭터 생성
  4. 유령 움직임에 대한 강화 학습 알고리즘 구현
  5. 고스트 이동을 위한 신경망 구현
  6. 모두 모아서 게임을 해보세요!

시작하려면 Python 게임 라이브러리를 사용하여 게임 환경을 만들어야 합니다. 이 튜토리얼에서는 파이게임 라이브러리를 사용할 것입니다.

코딩을 시작하기 전에 pip를 사용하여 파이게임을 설치해야 합니다. 터미널 또는 명령 프롬프트를 열고 다음 명령을 입력합니다.

pip install pygame

import pygame

# Set up the game window
WINDOW_WIDTH = 600
WINDOW_HEIGHT = 800
pygame.init()
game_window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("Pac-Man with AI Ghosts")

2단계: 팩맨 캐릭터 만들기

Pac-Man 캐릭터를 만들기 위해 파이게임 스프라이트를 사용합니다. 스프라이트는 애니메이션을 적용하고 화면에서 이동할 수 있는 2D 이미지입니다. 팩맨 스프라이트를 만드는 코드는 다음과 같습니다.

class PacMan(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("pacman.png").convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.x = WINDOW_WIDTH / 2
        self.rect.y = WINDOW_HEIGHT / 2
        self.speed = 5

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= self.speed
        elif keys[pygame.K_RIGHT]:
            self.rect.x += self.speed
        elif keys[pygame.K_UP]:
            self.rect.y -= self.speed
        elif keys[pygame.K_DOWN]:
            self.rect.y += self.speed

업데이트 방법에서 어떤 화살표 키가 눌려졌는지 확인하고 그에 따라 Pac-Man 스프라이트를 이동합니다. 이제 AI 제어 고스트 캐릭터 생성으로 넘어갈 수 있습니다.

3단계: AI 제어 고스트 캐릭터 생성

AI 제어 고스트 캐릭터를 만들기 위해 파이게임 스프라이트를 다시 사용합니다. 고스트 스프라이트를 만드는 코드는 다음과 같습니다.

class Ghost(pygame.sprite.Sprite):
    def __init__(self, color):
        super().__init__()
        self.color = color
        self.image = pygame.Surface([20, 20])
        self.image.fill(color)
        self.rect = self.image.get_rect()
        self.rect.x = WINDOW_WIDTH / 2 - 10
        self.rect.y = WINDOW_HEIGHT / 2 - 10
        self.speed = 3

    def update(self, target):
        dx = target.rect.x - self.rect.x
        dy = target.rect.y - self.rect.y
        distance = math.hypot(dx, dy)
        dx, dy = dx / distance, dy / distance
        self.rect.x += dx * self.speed
        self.rect.y += dy * self.speed

업데이트 방법에서는 피타고라스의 정리를 사용하여 유령과 팩맨 스프라이트 사이의 거리를 계산합니다. 그런 다음 거리 벡터의 x 및 y 구성 요소를 정규화하여 유령의 이동 방향을 얻습니다. 마지막으로 방향 벡터에 속도를 곱하여 유령의 위치를 ​​업데이트합니다.

4단계: 고스트 이동을 위한 강화 학습 알고리즘 구현

이제 유령 움직임에 대한 강화 학습 알고리즘 구현으로 넘어갈 수 있습니다.

강화 학습은 에이전트가 보상 신호를 최대화하기 위해 환경에서 조치를 취하는 방법을 배우는 기계 학습 유형입니다. 우리의 경우 보상 신호는 Pac-Man 스프라이트와 유령 사이의 거리입니다.

선택할 수 있는 많은 강화 학습 알고리즘이 있지만 이 자습서에서는 Q-러닝을 사용합니다 .

Q-러닝은 상태 s에서 행동 a를 취하는 데 대한 예상 보상을 제공하는 행동 가치 함수 Q(s, a)를 학습하여 작동하는 간단하고 효과적인 강화 학습 알고리즘입니다.

유령 움직임에 대한 Q-러닝을 구현하는 코드는 다음과 같습니다.

class QGhost(Ghost):
    def __init__(self, color, learning_rate=0.1, discount_factor=0.9, exploration_rate=0.1):
        super().__init__(color)
        self.q_table = defaultdict(lambda: np.zeros(4))
        self.learning_rate = learning_rate
        self.discount_factor = discount_factor
        self.exploration_rate = exploration_rate

    def update(self, target):
        state = self.get_state(target)
        action = self.get_action(state)
        reward = self.get_reward(target)

        next_state = self.get_state(target)
        next_action = self.get_action(next_state)

        q_value = self.q_table[state][action]
        next_q_value = self.q_table[next_state][next_action]
        td_error = reward + self.discount_factor * next_q_value - q_value
        self.q_table[state][action] += self.learning_rate * td_error

        dx, dy = self.get_direction(action)
        self.rect.x += dx * self.speed
        self.rect.y += dy * self.speed

    def get_state(self, target):
        dx = target.rect.x - self.rect.x
        dy = target.rect.y - self.rect.y
        state = round(dx / 10), round(dy / 10)
        return state

    def get_action(self, state):
        if np.random.rand() < self.exploration_rate:
            action = np.random.randint(0, 4)
        else:
            action = np.argmax(self.q_table[state])
        return action

    def get_reward(self, target):
        dx = target.rect.x - self.rect.x
        dy = target.rect.y - self.rect.y
        distance = math.hypot(dx, dy)
        reward = -distance
        return reward

    def get_direction(self, action):
        if action == 0:
            return 1, 0
        elif action == 1:
            return -1, 0
        elif action == 2:
            return 0, 1
        else:
            return 0, -1

init 메서드 에서 우리는 가능한 각 작업에 대한 Q 값을 나타내는 4개의 0 배열의 기본값으로 q_table 사전을 초기화합니다. 학습률, 할인율, 탐색률 하이퍼파라미터도 설정합니다.

업데이트 방법 에서 우리는 현재 상태를 얻고, 현재 상태와 탐색 속도에 따라 행동을 선택하고, 현재 상태에 대한 보상을 얻고, 현재 상태-행동 쌍에 대한 Q-값을 업데이트합니다. 그런 다음 고스트를 선택한 방향으로 이동합니다.

get_state 메서드는 Pac-Man 스프라이트 의 위치에 따라 유령의 상태를 반환합니다. 상태는 x 및 y 방향으로 반올림된 거리를 10으로 나눈 튜플입니다.

get_action 메서드는 현재 상태와 탐색 속도를 기반으로 작업을 선택합니다 . 탐색 속도가 0과 1 사이의 임의의 숫자보다 크면 임의의 작업을 선택합니다. 그렇지 않으면 현재 상태에 대해 가장 높은 Q 값을 가진 작업을 선택합니다.

get_reward 메서드는 Pac-Man 스프라이트와 유령의 거리를 기준으로 보상을 계산합니다 .

get_direction 메서드 는 선택한 작업에 따라 x 및 y 방향을 반환합니다.

5단계: 고스트 이동을 위한 신경망 구현

AI 제어 고스트를 구현하는 또 다른 접근 방식은 신경망을 사용하는 것입니다. 신경망은 데이터의 복잡한 패턴을 학습할 수 있는 기계 학습을 위한 강력한 도구입니다.

유령 이동에 신경망을 사용하려면 유령의 현재 상태를 받아들이고 취해야 할 최선의 행동을 출력하는 신경망 모델을 만들어야 합니다. 그런 다음 강화 학습을 사용하여 모델을 훈련하여 시간이 지남에 따라 성능을 향상시킬 수 있습니다.

Keras를 사용하여 고스트 이동을 위한 신경망 모델을 구현하는 코드는 다음과 같습니다.

from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import Adam

class NNGhost(Ghost):
    def __init__(self, color):
        super().__init__(color)
        self.model = self.create_model()

    def create_model(self):
        model = Sequential()
        model.add(Dense(32, input_shape=(2,), activation='relu'))
        model.add(Dense(32, activation='relu'))
        model.add(Dense(4, activation='linear'))
        model.compile(loss='mse', optimizer=Adam(lr=0.001))
        return model

    def update(self, target):
        state = self.get_state(target)
        action = self.get_action(state)
        reward = self.get_reward(target)

        next_state = self.get_state(target)
        next_action = self.get_action(next_state)

        q_values = self.model.predict(np.array([state]))
        q_values[0][action] = reward + 0.9 * np.max(self.model.predict(np.array([next_state])))

        self.model.fit(np.array([state]), q_values, verbose=0)

        dx, dy = self.get_direction(action)
        self.rect.x += dx * self.speed
        self.rect.y += dy * self.speed

    def get_state(self, target):
        dx = target.rect.x - self.rect.x
        dy = target.rect.y - self.rect.y
        state = np.array([dx, dy]) / 10
        return state

    def get_action(self, state):
        q_values = self.model.predict(np.array([state]))
        return np.argmax(q_values[0])

    def get_reward(self, target):
        dx = target.rect.x - self.rect.x
        dy = target.rect.y - self.rect.y
        distance = math.hypot(dx, dy)
        reward = -distance
        return reward

    def get_direction(self, action):
        if action == 0:
            return 1, 0
        elif action == 1:
            return -1, 0
        elif action == 2:
            return 0, 1
        else:
            return 0, -1

init 방법 에서 Keras를 사용하여 3개의 조밀한 계층과 출력 계층에 대한 선형 활성화 함수가 있는 새로운 신경망 모델을 생성합니다. 또한 옵티마이저와 학습률 하이퍼파라미터를 설정합니다.

update 메소드 에서는 현재 상태를 가져오고 get_action 메소드 를 사용하여 현재 상태에 따라 조치를 선택하고 get_reward 메소드를 사용하여 보상을 얻은 다음 다음 상태 및 조치를 가져옵니다. 그런 다음 Bellman 방정식을 사용하여 현재 상태 및 동작에 대한 Q-값을 업데이트하고 업데이트된 Q-값을 사용하여 모델을 적합합니다.

get_state 메서드는 대상까지의 x 및 y 거리를 10으로 나눈 값인 고스트의 상태를 반환합니다 .

get_action 메서드는 현재 상태 에 대해 가장 높은 Q 값을 가진 작업을 반환합니다.

get_reward 메서드는 대상까지의 거리를 기준으로 보상을 계산합니다 . 마지막으로 get_direction 메서드는 선택한 작업을 기반으로 x 및 y 방향을 반환합니다.

6단계: 모두 합치고 게임하기!

강화 학습 과 신경망을 모두 사용하여 AI 제어 유령이 있는 Pac-Man 게임이 있으므로 이제 모두 함께 게임을 플레이할 시간입니다!

이 튜토리얼에서는 플레이어의 전략에 적응하는 AI 제어 고스트 캐릭터로 Pac-Man 버전을 만들어 보다 도전적이고 역동적인 게임 플레이 경험을 제공합니다. 우리는 Python을 프로그래밍 언어로 사용하고 고스트 이동을 위해 강화 학습과 신경망이라는 두 가지 AI 기술을 구현했습니다.

이 튜토리얼에서 얻은 지식을 사용하여 다양하고 흥미로운 기능으로 Pac-Man 게임을 더욱 확장하고 향상시킬 수 있습니다.

예를 들어 게임 플레이를 매력적이고 재미있게 유지하는 추가 레벨, 파워업 및 도전 과제를 추가할 수 있습니다. 또한 다양한 강화 학습 및 신경망 알고리즘을 실험하여 새롭고 훨씬 더 까다로운 고스트를 생성할 수 있습니다.

또한 이 자습서에서 다루는 개념과 기술을 다른 게임 개발 프로젝트에 적용하여 새로운 가능성을 탐색하고 훨씬 더 혁신적이고 흥미로운 게임을 만들 수 있습니다.

다양한 AI 알고리즘을 실험하거나 새로운 그래픽을 통합하거나 처음부터 완전히 새로운 게임을 만들 수 있습니다. 가능성은 무궁무진하므로 이 튜토리얼에 제시된 기초를 바탕으로 계속 탐색하고 학습하는 것이 좋습니다.

더 많은 콘텐츠: