문서 도구

AI 스킴

스킴 하나가 곧 완전한 AI 하나입니다. Farsight에서 클릭 한 번으로 바꾸고, 진행 중인 게임도 즉시 새 AI가 넘겨받을 수 있습니다. zip으로 내보내 공유하고, 다른 사람의 스킴을 가져와 테스트하며, 스킴마다 전적이 자동으로 집계됩니다.

스킴 하나 = 완전한 AI 하나: 폴더 하나 + 매니페스트 scheme.json + 코드. 게임 인스턴스마다 스킴을 하나씩 고르며, Farsight에서 클릭 한 번으로 바꿀 수 있고 진행 중인 게임도 즉시 새 스킴이 넘겨받습니다.

다른 사람이 공유한 스킴을 가져오면 별도의 영역에 들어가므로 여러분의 스킴과 서로 영향을 주지 않습니다. 고치고 싶다면 “내 스킴으로 복사”하세요.

schemes/
  mine/<id>/          내 스킴: 직접 쓴 것, 또는 다른 스킴에서 복사해 고친 것(마음대로 수정, 다음 게임부터 적용)
  installed/<id>/     설치됨: 다른 사람이 공유한 zip을 여기에 풂(처음 실행하기 전에 신뢰 확인 필요)
brains/xwar3/         내장: 레퍼런스 브레인(완전한 AI)
brains/examples/      내장: 교육용 예제 4개 hello / rush / macro / micro, 동료 예제 buddy, 게임플레이 모드 2개(영웅 로그라이크, 무한 디펜스)

스킴이 꼭 여러분 대신 싸우는 AI일 필요는 없습니다. kind: mod인 스킴은 하나의 게임 규칙입니다. 여러분이 직접 플레이하고 스킴은 과제를 냅니다. 게임플레이 모드를 참고하세요.

Farsight에서 사용하기

“AI 스킴” 페이지(왼쪽 사이드바 “시스템 → AI 스킴”):

작업하는 일
스킴 가져오기(zip)installed/에 설치. 같은 id가 이미 설치되어 있으면 교체할지 물음(교체하면 신뢰를 다시 확인해야 함)
인스턴스에 적용…인스턴스 선택 + “즉시 적용”(현재 AI를 멈추고 새 스킴이 이 게임을 넘겨받음) 또는 “다음 테스트 시작부터 적용”
내 스킴으로 복사mine/에 복사본을 만들고, 작성자는 “나”, 버전은 0.1.0으로 기록하며, 어느 스킴의 어느 버전에서 복사했는지도 기록
zip 내보내기<id>-<버전>.zip으로 묶음. 다른 사람에게 보내면 그것이 곧 공유
폴더 열기탐색기에서 스킴 폴더를 열어 코드를 직접 수정
신뢰다른 사람의 스킴은 처음 실행하기 전에 반드시 눌러야 함(아래 “신뢰와 보안” 참고)
최근 전적이 스킴의 게임별 승패, 경기 시간, 종료 사유
삭제“내 스킴”과 “설치됨”만 삭제 가능. 인스턴스가 사용 중이면 삭제 불가

인스턴스 카드에도 “AI 스킴” 줄이 추가되었습니다. 드롭다운에서 스킴을 고르고 → “전환(즉시 적용)”. 인스턴스가 실행 중이 아닐 때는 버튼 이름이 “선택”이며, 다음에 “테스트 시작”을 누르면 그 스킴으로 AI를 시작합니다.

매니페스트 scheme.json

{
  "format": 1,
  "id": "fast-rush",
  "name": "3분 러시",
  "version": "1.2.0",
  "author": "홍길동",
  "description": "이 AI가 어떤 전략을 쓰는지 한 문장으로 설명",
  "entry": "rush_bot.py",
  "class": "RushBot",
  "fair": true,
  "hz": 5,
  "races": ["human", "orc"],
  "license": "MIT"
}
필드필수설명
id✔영문 소문자, 숫자, -, _. 2 ~ 41자
entry✔스킴 폴더 안의 .py 파일 하나(절대 경로 불가, .. 불가)
kind기본값 bot(openwar3.Bot의 하위 클래스, 여러분 대신 싸움). mod = 게임플레이 모드(openwar3.Mod의 하위 클래스. 항상 공정 모드를 쓰지 않으며, 대전 규칙으로 승패를 판정하지 않음)
class진입 파일 안의 Bot(또는 Mod) 하위 클래스 이름. 생략하면 진입 파일의 마지막 openwar3.Bot 하위 클래스를 사용
fair기본값 true: 시야 안의 것만 보며, 아레나와 같은 규칙. false = 맵 전체가 보이며, 이때만 JASS 채널을 쓸 수 있음(동료에게 필요)
judge기본값 true: 대전 규칙으로 승패 판정. RPG / 동료 스킴은 false
hzon_tick을 초당 몇 번 호출할지. 기본값 5
format매니페스트 형식 버전. 현재 1. 이 컴퓨터의 OpenWar3보다 새 버전이면 거부하고 업데이트를 안내
기타name, version, author, description, races, license, homepage, forked_from은 표시용

스킴 폴더는 Python 모듈 검색 경로에 추가되므로, 진입 파일에서 같은 폴더의 다른 파일을 import할 수 있습니다. 서드파티 패키지(numpy, torch……)는 자동으로 설치되지 않습니다 — 무엇이 필요한지 description에 분명히 적으세요.

가장 작은 스킴은 파일 두 개면 충분합니다:

# my_bot.py
from openwar3 import Bot

class MyBot(Bot):
    def on_tick(self, g):
        for w in g.idle_workers():
            mine = g.nearest(g.gold_mines(), w)
            if mine:
                g.gather(w, mine)
{"id": "my-first", "name": "나의 첫 AI", "entry": "my_bot.py"}

schemes/mine/my-first/에 넣고 Farsight를 새로 고치면 바로 보입니다. 더 간편한 출발점: “내장”에서 예제를 하나 골라 “내 스킴으로 복사”를 누르세요.

실행 방식과 전적

스킴은 스킴 러너가 실행합니다(Farsight의 “테스트 시작 / 전환”이 띄우는 것이 바로 이것입니다).

python tools/run_scheme.py --inst 20 --scheme builtin/micro --hours 6
  • 인스턴스마다 상주하는 감독 프로세스가 하나 있고, 게임마다 자식 프로세스를 하나 띄워 스킴을 실행합니다. 스킴 코드가 죽어도 감독 프로세스는 영향을 받지 않으며, “내 스킴”의 코드를 고치면 다음 게임부터 자동으로 새 코드를 씁니다.
  • 게임이 끝날 때마다 전적을 한 줄 기록합니다: 스킴, 버전, 작성자, 승패, 사유, 게임 시간, 오류 횟수. Farsight의 승률은 여기서 집계합니다.

승패 판정 방법:

상황기록
상대 건물이 전부 없어짐승
아군 건물이 전부 없어짐(병력이 살아 있어도 마찬가지 — 대전에서는 이렇게 패배를 판정함)패
아군 유닛이 전부 없어짐패
Farsight에서 수동으로 종료 / 중지미정
전환 시점에 이 게임이 이미 60 게임 초 이상 진행됨(중간에 넘겨받음)따로 집계하며 승률에 넣지 않음
게임 시계가 오랫동안 멈춤미정

승패가 가려지면 러너가 결과 화면을 닫고 “다음 게임 설정”에 따라 다음 게임을 시작하며, 스킴이 이어서 넘겨받습니다 — 밤새 켜 두고 전적을 쌓을 수 있습니다. 일시정지는 종료가 아닙니다. 일시정지 중에도 Bot은 평소처럼 돌아가고, 게임 시계만 멈춥니다.

신뢰와 보안

스킴은 코드이며, 실행되면 여러분 본인과 같은 권한을 가집니다(파일을 읽고 쓰고, 네트워크에 접속할 수 있음). 그래서:

  • installed/의 스킴은 기본적으로 신뢰되지 않으며, 여러분이 “신뢰”를 누를 때까지 Farsight와 러너 모두 실행을 거부합니다.
  • 같은 id의 스킴을 교체 설치하면 신뢰가 초기화됩니다(새 버전 = 새 코드).
  • 가져올 때 검사합니다: zip은 50 MB 이하, 파일 2000개 이하. 절대 경로와 ..는 허용하지 않습니다(스킴 폴더 밖에 쓰는 것을 방지). 매니페스트가 올바르지 않거나 진입 파일이 없으면 바로 거부합니다.

신뢰하기 전에 “폴더 열기”로 코드를 한 번 읽어 보세요. 믿을 수 있는 사람에게서만 스킴을 받으세요.

API(스크립트용)

API설명
GET /api/schemes스킴 목록 + 전적 + 인스턴스별로 선택된 스킴과 실행 중인 스킴
GET /api/schemes/results?ref=한 스킴의 최근 30게임
POST /api/schemes/importzip 가져오기
GET /api/schemes/export?ref=zip 다운로드
POST /api/schemes/fork내 스킴으로 복사
POST /api/schemes/trust신뢰
DELETE /api/schemes?ref=삭제(인스턴스가 사용 중이면 거부)
POST /api/instances/{n}/scheme인스턴스의 스킴 변경: 이 게임을 즉시 넘겨받거나, 다음 테스트 시작부터 적용

Python에서는 라이브러리를 바로 쓰면 됩니다: from openwar3 import schemes(list_schemes, install_zip, export_zip, fork, trust, stats……).

앞으로: 스킴 웹사이트

내보낸 zip이 곧 공유 단위이므로, 웹사이트는 그 바깥에 한 겹만 더하면 됩니다. Farsight에서 클릭 한 번으로 업로드하고, 웹사이트에서 받은 스킴은 “스킴 가져오기”와 완전히 같은 검사를 거치며 마찬가지로 신뢰를 확인해야 합니다. 전적 보고를 선택할 수 있고, 웹사이트는 버전별로 승률을 집계합니다. Farsight의 “스킴 웹사이트에 공유” 버튼은 이미 자리를 마련해 두었습니다. 진행 상황은 로드맵을 보세요.