World of ClaudeCraft: 브라우저에서 돌아가는 오픈소스 MMO이자 에이전트 강화학습 환경

World of ClaudeCraft 소개

World of ClaudeCraft는 브라우저에서 바로 플레이할 수 있는 클래식 시대풍의 완성형 MMO이면서, 동시에 AI 에이전트를 학습시킬 수 있는 강화학습 환경을 함께 제공하는 오픈소스 프로젝트입니다. 별도의 설치 없이 worldofclaudecraft.com 에서 바로 플레이할 수 있고, 명령 한 줄로 직접 서버를 띄워 호스팅할 수도 있습니다. 게임을 사람이 직접 즐기는 것뿐 아니라, 파이썬으로 에이전트를 붙여 실제 게임을 상대로 학습시킬 수 있다는 점이 이 프로젝트를 머신러닝 관점에서 흥미롭게 만듭니다.

이 프로젝트의 핵심은 하나의 게임 코어가 세 곳에서 그대로 돌아간다는 설계입니다. 오프라인 브라우저 월드에서는 Play Offline을 누르면 바로 게임이 시작되고, 권위 서버(authoritative server)에서는 PostgreSQL 기반 계정이 하나의 라이브 월드를 공유하며, 헤드리스 강화학습 환경에서는 파이썬이 Gym 인터페이스를 통해 실제 게임을 구동합니다. 세 실행 환경은 같은 시드(seed)로 같은 월드를 만들어내며, 마을과 몬스터, 주문 아이콘, 사운드까지 대부분이 미리 만들어 둔 에셋이 아니라 런타임에 생성됩니다.

이렇게 같은 코어가 강화학습 환경으로도 동작하기 때문에, 에이전트는 게임을 재구현한 대체물이 아니라 실제 게임을 상대로 학습합니다. 본 게시물에서는 World of ClaudeCraft의 하나의 시뮬레이션, 세 실행 환경 구조와 이를 강화학습 환경으로 사용하는 방법, 그리고 게임 자체의 구성을 정리합니다.

World of ClaudeCraft의 구조: 하나의 시뮬레이션, 세 실행 환경

World of ClaudeCraft를 지탱하는 설계 원칙은 "하나의 시뮬레이션, 세 호스트"로 요약됩니다. src/sim/ 에 있는 결정론적 게임 코어가 오프라인 브라우저 월드, 온라인 서버, 강화학습 환경 모두를 구동하며, 세 곳에서 동작이 동일해야 한다는 원칙을 테스트로 지킵니다. 렌더러와 HUD는 구체적인 월드 구현이 아니라 IWorld 인터페이스하고만 통신하므로, 새 기능은 해당 인터페이스를 먼저 확장한 뒤 오프라인과 온라인 양쪽에 반영됩니다.

시뮬레이션은 초당 20틱(DT = 1/20)의 고정 틱으로 진행되고, 모든 무작위성은 시드가 지정된 하나의 난수 생성기(Rng)를 거칩니다. src/sim/ 은 DOM, 브라우저, Three.js에 대한 의존성을 전혀 갖지 않으며, 바로 이 점 덕분에 같은 코드가 코드 한 줄 바꾸지 않고도 Node 환경 서버, 권위 게임 루프, 브라우저 탭으로 각각 번들링됩니다. 온라인에서는 서버가 권위를 가져, 클라이언트는 이동 의도와 명령을 20Hz로 스트리밍하고 모든 전투 판정과 전리품, 퀘스트 진행은 서버에서 결정됩니다.

World of ClaudeCraft를 강화학습 환경으로 사용하기

같은 결정론적 코어가 Gymnasium 환경으로 실행되기 때문에, 에이전트는 게임을 다시 구현한 시뮬레이터가 아니라 실제 게임을 상대로 학습합니다. 환경 서버(headless/env_server.ts)는 하나의 Sim 을 감싸 표준 입출력으로 줄 단위 JSON을 주고받고, python/ 의 파이썬 바인딩이 이를 서브프로세스로 띄워 익숙한 reset / step / close 루프를 제공합니다.

npm run build:env    # 환경 서버를 dist-env/env_server.cjs 로 번들링
npm run env          # 직접 실행 (표준 입출력으로 NDJSON)
npm run bench        # IPC 없는 인프로세스 처리량 벤치마크

# 파이썬에서 구동
pip install gymnasium numpy
python python/example_random_agent.py
from wow_env import WoWClassicEnv

env = WoWClassicEnv(player_class="warrior")   # 아홉 개 직업 중 하나
obs, info = env.reset(seed=42)
obs, reward, terminated, truncated, info = env.step(env.action_space.sample())
env.close()

관찰 공간과 행동 공간은 게임 콘텐츠에서 파생되며 게임이 커지면 함께 늘어나므로, 하드코딩하지 않고 시작 시 환경의 info 응답에서 조회하도록 권장됩니다. 행동 공간은 이동, 타겟 지정, 공격, 전체 능력 세트, 상호작용, 먹기·마시기를 포함하는 Discrete 공간이고, 관찰 공간은 자신과 능력, 타겟, 주변 몬스터, 가장 가까운 상호작용 대상, 퀘스트 진행을 담은 Box 공간입니다. 보상은 틱마다의 카운터 변화량(획득 경험치, 가한 피해와 받은 피해, 처치 수, 사망, 퀘스트 진행, 레벨업)의 가중합으로 계산되며 리셋할 때마다 조정할 수 있습니다. 각 step 은 하나의 행동을 적용하고 기본적으로 5개의 시뮬레이션 틱을 진행하므로, 시뮬레이션 시간 기준 초당 약 4번의 의사결정이 이루어집니다.

강화학습 환경으로서 중요한 특성은 결정론입니다. World of ClaudeCraft의 코어는 실제 시계나 Math.random 을 사용하지 않으므로, 리셋에 시드를 지정하면 에피소드가 정확히 동일하게 재현됩니다.

World of ClaudeCraft의 게임 콘텐츠

게임 자체도 클래식 MMO의 구성을 갖추고 있습니다. 아홉 개의 직업은 각각 레벨에 따라 등급이 오르는 능력 세트와 직업당 세 개(총 27개)의 특성 트리를 가지며, 1레벨부터 20레벨까지 이어지는 세 개의 오픈월드 존과 약 80개의 퀘스트, 그리고 하나로 연결된 스토리라인이 있습니다. 다섯 개의 인스턴스 던전(그중 넷은 5인 정예 레이드, 하나는 솔로 지하묘지)과 상위 난이도인 히로익(Heroic) 티어, 오픈월드 월드 보스가 준비되어 있고, 한두 명이 AI 동료와 함께 도는 소규모 모드인 딜브(Delve)도 있습니다. 랭크가 매겨지는 PvP 아레나 애쉔 콜로세움(Ashen Coliseum)에서는 1대1과 2대2 래더를 즐길 수 있습니다.

멀티플레이 요소로는 파티, 길드, 거래, 결투가 있으며, 채집·제작 직업과 플레이어 주도 경매장인 월드 마켓, 우편 서비스 레이븐포스트(Ravenpost)도 구현되어 있습니다. 게임은 22개 로케일로 현지화되어 있습니다. 이와 별개로 Solana 토큰 $WOC와 연동되는 web3 기능이 있지만, 지갑 연결은 선택 사항이며 잔액과 장식용 홀더 배지를 표시할 뿐 플레이에 필요하지 않습니다.

World of ClaudeCraft 설치 및 실행

오프라인 브라우저 월드는 저장소를 받아 개발 서버를 띄우면 바로 실행됩니다.

npm install
npm run dev        # http://localhost:5173 을 열고 Play Offline 클릭

계정과 지속되는 캐릭터가 있는 실제 클라이언트/서버 게임을 직접 호스팅하려면, .env 에 무작위 POSTGRES_PASSWORD 를 설정한 뒤 Docker Compose로 PostgreSQL과 게임 서버를 함께 띄웁니다.

cp .env.example .env
# .env 를 열어 긴 무작위 POSTGRES_PASSWORD 설정
docker compose up -d --build     # postgres + 게임 서버
# http://localhost:8787 에서 계정, 캐릭터, 월드 전체 이용

World of ClaudeCraft의 라이선스

World of ClaudeCraft는 MIT 라이선스로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다.

:video_game: World of ClaudeCraft 플레이하기

:github: World of ClaudeCraft 프로젝트 GitHub 저장소




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로도 새 글 알림을 받으실 수 있습니다. :smiley:

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck: