AI/4목 게임 (connect 4)

[4목 게임 인공지능 제작] 0. AI 학습을 위한 환경 제작

가나타르트 2022. 8. 9. 20:04

AI 게임 선정

포카전을 준비하기 위해 포스텍 알고리즘 동아리인 POSCAT의 인공지능 세미나를 진행하게 되었다. 이번 포카전에서 진행되는 게임으로 세미나를 진행하기에는 게임이 복잡할 것 같아 간단한 게임으로 세미나를 진행할 예정이다.

따라서 세미나에서 어떤 게임을 이용하여 연습할지를 정해야 했다. 포카전처럼 2인 대전 게임 형식이되 크게 복잡하지 않은 4목 게임(Connect 4)으로 선정하였다. State가 복잡하지 않고, action의 종류도 7가지로 적은 편이며 규칙도 간단하기 때문에 4목 게임으로 선정하였다.

4목 게임은 가로 7칸, 세로 6칸 크기의 판에서 진행되는 게임이다. 이 게임의 특징은 말을 놓을 '열'만 정할 수 있다는 점이다. 열을 정하고 나면, 해당 열의 빈칸 중 가장 아래에 있는 칸에 내 말이 놓이게 된다. 두 명이서 번갈아가며 말을 놓다가 먼저 4목을 완성하는 사람이 이기게 된다.

AI 구현은 파이썬이 가장 편리하기 때문에 파이썬에서 구현을 하였다. 파이썬 버전은 평소에 사용하던 버전인 3.9.13을 사용하였다.

게임 설계

게임 자체는 아래와 같이 총 5개의 파일로 구성하였다.

 

  1. game.py: 게임을 구현한 파일이다.
  2. agent.py: 게임을 하는 주체를 구현한 파일이다.
  3. config.py: 다양한 파라미터를 저장한 파일이다.
  4. exception.py: 사용자 정의 예외를 정의하는 파일이다.
  5. utils.py: 여러 편의 기능을 구현한 파일이다.

중요한 프로젝트라면 gym environment를 상속받아 환경을 구성하였겠지만, 세미나와 AI공부를 위한 작은 프로젝트라 상속받지 않고 직접 구현하였다.

게임 구현

지역 변수, 지역 함수는 파이썬 코딩의 관례에 따라 이름 앞에 언더바(_)를 추가하였다.

game.py의 Connect4 class에 게임을 구현해두었다. 게임의 상태인 state는 6 x 7 크기의 numpy array로 저장하였다. 빈칸은 0, 나의 칸은 1, 적의 칸은 -1을 저장하였다.

reset() 함수로 게임을 시작할 수 있고, step() 함수로 내 차례를 진행한다. gym environment를 따라서 reset() 함수는 초기 상태를 반환하고, step() 함수는 행동을 입력받아 다음 상태, 보상, 게임의 종료 여부, 그리고 디버깅을 위한 추가 정보를 반환한다. 또한 render() 함수를 호출하여 디버깅을 위해 현재 진행 상황을 출력하도록 하였다. 여유가 있다면 GUI를 써서 출력하도록 해보고 싶다.

이번 게임은 2인 대전 게임이기 때문에, 환경을 구성할 때 대전할 agent class를 받아 게임 환경을 구성하도록 하였다.

 

agent.py에는 알고리즘 별로 에이전트를 구현할 예정이다. 매 세미나마다 특정 에이전트를 이기는 것을 목표로 진행할 예정이다. abc 모듈을 이용하여 에이전트의 추상 메서드를 정의하였다. 에이전트의 action() 함수는 6 x 7 numpy array 상태를 입력받아 int형 행동을 반환하는 함수이다.

가장 기본적인 랜덤한 행동을 하는 에이전트를 구현해 두었다. 먼저 게임 판의 가장 위에 있는 행을 봐서 행동할 수 있는 액션을 찾은 뒤, 가능한 행동 중 랜덤한 하나를 수행하도록 하였다.

파이썬에서 랜덤한 행동을 하기 위해서는 random 모듈을 사용한다. 하지만 random 모듈의 기능을 바로 사용하면 seed가 global로 정의된다. 따라서 한 에이전트의 행동이 global seed에 따라 변할 수 있다. 즉, 한 에이전트에서 random 모듈의 함수를 사용하여 다른 에이전트의 행동이 변하게 된다. 따라서 각 에이전트를 생성할 때, random 모듈의 Random 클래스를 가져와, 각 에이전트가 본인만의 seed를 가지도록 하였다.

추후 계획

알고리즘 별 인공지능 에이전트를 만들고 개선할 예정이다. 기본적인 그리디 알고리즘부터 alpha beta pruning, 몬테카를로 트리까지 다양한 알고리즘을 구현해보고 평가해볼 예정이다.

 

링크