아레나 · P6

여러 사람의 AI가 같은 맵에서 승부를 가립니다

공정성은 심판만이 보장할 수 있으며, Bot의 양심에 맡길 수 없습니다. Bot은 공유 메모리에 절대 접근할 수 없습니다. 심판이 시야 기준으로 필터링한 관찰만 받고, 행동만 제출할 수 있으며, 모든 행동은 먼저 소유권을 검증받습니다.

설계 중 · 기초 실험 진행 중 지금부터 공정 모드로 작성하기
세 가지 형태

“공정성을 보장할 수 있는가” 순으로

이 프로젝트의 관찰 능력은 바로 “클라이언트가 모든 플레이어의 상태를 가지고 있다”는 데서 나옵니다. 이는 여러분의 컴퓨터에서도 똑같이 성립합니다. 그러므로 공정성은 모두가 신뢰하는 심판에게서만 나올 수 있습니다. A를 먼저 만들고, 같은 프로토콜 그대로 B로 확장합니다. C는 오락용으로만 둡니다.

A

로컬 아레나

컴퓨터 한 대에서 게임 하나, Bot마다 슬롯 하나, 심판 프로세스가 Bot 대신 명령

심판이 시야, 소유권, 틱까지 모든 것을 제어
적합한 용도: 개발과 디버깅, 로컬 리그
B

호스팅 래더

A를 서버로 옮기고, 플레이어가 Bot을 업로드하면 서버가 샌드박스에서 실행

A와 같고, 코드 격리까지 추가
적합한 용도: 공개 대회, 랭킹
C

각자 온라인 대전

각자 자기 컴퓨터에서 게임 + Bot을 실행하고 LAN으로 대전

보장 불가: 주입된 클라이언트는 맵 전체를 읽을 수 있음
적합한 용도: 친구끼리 친선전
심판

프로세스 하나가 양쪽 대신 명령

Bot A모든 언어
Bot B모든 언어
WebSocket · JSON
심판(신뢰 가능)
  1. 오케스트레이션 맵 선택, 게임 시작, 슬롯별 종족과 난이도 설정
  2. 틱 T 게임 밀리초마다 1틱(기본 200). 락스텝 모드에서는 관찰을 보내는 동안 게임 일시 정지
  3. 관찰 스냅샷 → 슬롯별 시야로 필터링 → JSON
  4. 행동 “유닛이 이 슬롯 소유인지” 검증 → 예산(틱당 개수, APM) → 고속 레인으로 배치 전달
  5. 기록 틱별 관찰 요약 + 모든 행동. 리플레이, 복기, 학습 데이터로 활용 가능
  6. 판정 어떤 슬롯에 건물이 없으면 → 탈락. 시간 초과 시 → 남은 전력 / 자원으로 판정
고속 레인 · player 레인 ×2
게임 하나 · 슬롯 두 개
프로토콜 초안 v0

관찰이 들어오고, 행동이 나간다

JSON을 주고받을 수 있는 프로그램이면 무엇이든 출전할 수 있습니다. LLM이 틱마다 행동을 직접 출력하게 해도 됩니다. SDK로 작성한 Python Bot은 코드를 고칠 필요가 없습니다.

관찰 아군 유닛 + 아군 시야 안의 적 유닛만 포함. 크립과 금광은 시야 기준 또는 게임 시작 시 공개
행동 상한 틱당 최대 32개, 초과분은 잘라냄(명령 남발로 심판을 느리게 만드는 것 방지)
같은 유닛 한 틱에서는 마지막 명령만 인정
시간 예산 틱 길이 × 0.9, 초과하면 이번 틱은 패스. 느린 쪽이 손해를 볼 뿐 남을 붙잡지 않음
락스텝 엄격한 공정성이 필요하면 관찰을 보내는 동안 게임을 일시 정지하고, 모두 받은 뒤(또는 시간 초과 후) 재개 — 컴퓨터 성능 차이가 결과에 영향을 주지 않음
시작 위치 교체 같은 Bot 쌍이 양쪽 위치에서 한 번씩 대전해 맵의 비대칭을 제거
래더 Elo / TrueSkill. 쌍마다 최소 20판을 치른 뒤 결론(2판으로 구분할 수 있는 최소 승률 차는 약 60%p)
{"t": "obs", "tick": 57, "gameMs": 11400, "me": 1,
 "res": {"gold": 320, "lumber": 150, "food": [18, 30]},
 "units": [
   {"id": 101, "type": "hfoo", "owner": 1,
    "x": -4500, "y": 2200, "hp": 380, "hpMax": 420}],
 "visibleEnemies": [
   {"id": 733, "type": "ogru", "owner": 2,
    "x": -3900, "y": 2500, "hp": 700}],
 "deadlineMs": 180}
틱마다 하나씩 보내며, 이 슬롯의 유닛과 그 시야 안의 적만 포함합니다. id는 심판이 부여하는 고정 번호로, 게임 내내 바뀌지 않습니다.
기초 실험

순서대로, 앞 단계를 통과해야 다음 단계로

#실험판정 기준알려진 사실
1 한 게임에 슬롯 2개를 열고 둘 다 내장 AI 없이 양쪽 유닛 모두 움직이지 않음 슬롯의 AI 플래그와 난이도 필드는 파악됨
2 로컬 이외의 슬롯 대신 명령 적 슬롯의 일꾼이 실제로 채집하러 감 가장 중요한 항목. 통과하지 못하면 “Bot마다 클라이언트 하나, 실제 온라인 대전”으로 물러설 수밖에 없음
3 임의의 플레이어 번호로 시야 조회 같은 지점에 대해 두 슬롯이 다른 결과를 냄 엔진의 가시성 검사는 임의의 플레이어 번호를 받음
4 프로그램으로 승패 판정 한쪽 건물이 전멸하면 1초 안에 인지 이벤트 버스에 더 직접적인 진입점이 있음
5 락스텝 일시 정지 / 재개 일시 정지 중 행동을 모두 받고 재개 후 적용 일시 정지는 검증됨

덤으로 얻는 검증: 레퍼런스 브레인은 현재 맵 전체 정보(컴퓨터 상대의 공격 목표 등)에 크게 의존합니다. 아레나에 올라가려면 파사드 API로 바꾸고 시야 안의 유닛만 써야 합니다. 맵 전체 정보가 없으면 얼마나 강할까요?