황짜장 Adaptive AI Agent
판마다 보상을 받아 다음 판 설정을 스스로 고른다
디아블로 2 레저렉션 오프라인 싱글 플레이를 혼자 도는 에이전트. 게임 메모리를 읽어 지형 · 몬스터 · 아이템을 알고, 화면 글자 인식으로 이름표를 확인해 줍고, 보스 · 열쇠 · 사냥 런 13가지를 순서대로 돈다. 핵심은 학습이다 — 한 판이 끝날 때마다 «분당 처치 − 피해 벌점»을 보상으로 받아, 다음 판에 쓸 동선 · 스킬 · 거리 설정을 스스로 고른다. 판이 쌓일수록 좋은 설정 쪽으로 수렴한다.
판마다 보상을 받아 스스로 전술을 고르는 강화학습 게임 자동사냥 에이전트 — 오프라인 싱글 전용
- 기간
- 2026년 9월 ~ 10월 (계속 개발 중)
- 역할
- 기획 · 게임 데이터 역분석 · 학습 설계 · 비전 · 경로 · 전투 · 패널 UI · 운영
- 분류
- AI, 자동화, 소프트웨어, 데이터
- 등급
- 대표 작업 — 문제부터 결과까지 전부 적어둔 것
돌아가고 있는 상태입니다.
만들었다는 말 대신 켜져 있는 화면을 둡니다. 데모용으로 꾸민 것이 아니라 직접 띄워 찍은 것이고, 비어 있는 값은 비어 있는 채로 두었습니다.

무슨 문제였나
사냥 한 판에는 정답이 없는 선택이 수십 개 들어 있다. 동선을 얼마나 촘촘하게 짤지, 공격 스킬을 쓸지 소환수에게 맡길지, 몬스터에서 몇 칸 떨어질지. 사람이 감으로 정하면 한두 판의 인상으로 결론이 나고, 그 결론은 맵 운에 따라 뒤집힌다. 게다가 봇은 한 번 틀린 값을 배우면 다음 판부터 계속 틀린다.
어떻게 풀었나
설정 후보를 표로 두고 판마다 하나를 골라 돌린 뒤, 그 판의 결과를 보상으로 기록하는 강화학습 루프를 넣었다 — 탐색(아직 덜 해 본 후보)과 활용(지금까지 가장 좋은 후보)을 섞어 고르는 밴딧 방식이다. 같은 판 안에서 여러 표를 겨룰 때 후보끼리 늘 짝지어 바뀌어 효과를 못 가르는 문제가 생겨, 안 해 본 후보는 무작위로 섞게 고쳤다. 결론은 보상 표가 내고, 확정은 사람이 한다. 그리고 판마다 규칙 731개를 자동으로 검사해, 좋아진 것이 다른 곳을 망가뜨리지 않았는지 확인한다.
구조
- 01학습 계층 — 설정 후보 표 · 판마다 보상 기록 · 탐색 15% · 후보마다 최소 2판 · 좋은 쪽으로 수렴 (tune.json)
- 02지형 학습 — 걸어 본 방의 실제 막힘을 방 설계 파일(DS1)별로 누적해 안 가 본 방의 벽 예측을 고친다 · 맵 배치 기록 1,697개
- 03학습값 게이트 — 배운 값이 정상 범위 밖이면 저장 거부, 같은 값으로 20번 연속 성공하면 고정
- 04인식 계층 — 메모리(좌표 · 몬스터 등급 · 면역 · 바닥 아이템) + 화면(이름표 글자 · 색 · 템플릿)
- 05행동 계층 — 런 13가지(보스 7 · 열쇠 3 · 사냥 3) × 단계(이동진 → 입구 → 이동 → 전투 → 줍기 → 나가기), 전투는 종류별 공통 입구 하나(보스 · 정리 · 제자리)
- 06직업 계층 — 악마술사(소환 · 메아리) · 소서리스(블리) · 팔라딘(용딘) 을 같은 전투 틀 위에 갈아 끼움
- 07감시 계층 — 체력 감시 스레드 · 50초 무반응 감시 · 멍때림(0.5초 넘게 서 있음) 기록 · 판 끝 규칙 731개 자동 점검
어려웠던 것
- 딥러닝 대신 밴딧을 골랐다 — 한 판이 4~9분이라 신경망 · PPO 에 필요한 표본이 모이지 않는다. 판 수가 적어도 수렴하는, 강화학습에서 가장 단순한 형태가 이 문제에 맞았다
- 한 판만 보고 «위험하다» 고 말했다가 바로잡은 적이 있다 — 그 뒤로 비교는 표본 수와 함께만 보고한다
- 여러 표를 같은 판에서 겨루니 후보가 늘 짝지어 바뀌어(별 16 ↔ 연타 2, 별 20 ↔ 연타 3) 효과를 못 갈랐다 — 안 해 본 후보는 무작위로 섞게 고쳤다
- 같은 PC에서 다른 게임과 동시에 돌리기를 시도했다 — 창에만 신호를 보내면 키보드는 먹지만 게임은 실제 커서 위치를 읽었다. 코드 주입으로 우회하는 길은 게임 보호 장치 우회라 택하지 않았다
- 윈도우를 새로 깔면서 게임 지형 파일이 사라졌다 — CASC 저장소를 읽는 라이브러리를 ctypes 로 불러 타일 2,549개를 다시 풀어냈다
- 똑같은 아이템이 두 개 떨어지면 둘째 것을 «번호만 바뀐 첫째» 로 착각해 하나를 버렸다 — 옛 번호가 아직 바닥에 있으면 같은 아이템이 아니라는 조건을 넣었다
무엇을 만들었나
- 판마다 보상 = 분당 처치 − 피해/200 − 못 간 지점. 죽지 않는 게 먼저라 피해에 벌점을 건다
- 동선 밀도 · 스킬 사용 · 공전 거리 · 연타 수 · 사냥 방식을 표마다 따로 겨룬다 — 일반 판과 강한 몬스터 판(공포의 영역)은 섞지 않는다
- 지형 학습 — 같은 방 설계는 판이 바뀌어도 같은 자리에 같은 벽이 있다. 칸마다 «본 횟수 · 막힌 횟수» 다수결로 예측을 고친다
- 사용자가 손으로 그려 준 동선(별 · 꽃잎)까지 경로 알고리즘으로 옮겨 겨뤄 본 뒤, 10월부터 젖소방은 격자 · 나선 «한 바퀴»로 정리했다
- 공포의 영역을 읽어 그 시간에 맞는 사냥터로 자동으로 옮겨 가고, 맞는 곳이 없으면 패널 순서대로 돈다
- 한 게임 안에서 여러 런을 묶어 돌기 · 보석 조합 · 창고 재료 줍기 표
- 메모리로 가리킨 아이템 번호를 확인한 뒤에만 누른다 — 흩어진 이름표를 마우스로 훑지 않는다
- 귀한 드랍(높은 룬 · 유니크)은 주우면 텔레그램으로 알린다
- 창고에 못 넣은 것만 버린다 — 유니크 · 세트 · 반지 · 목걸이 · 주얼 · 벡스 이상 룬은 코드에서 절대 안 버리게 막았다
- «죽으면 멈춘다» 는 잠금 규칙 — 점검 목록에서 지워도 코드가 되살리고, 패널에서 못 지운다
- 멈춤 스스로 회복 — 잇단 실패 · 창고 왕복 실패 · 오류 · 입구 막힘은 다시 시도하고, 사망 · 사용자 정지 · 가방 가득은 회복하지 않고 멈춘 채 둔다
- 직업 · 빌드별 스킬 키 칸 — 소서리스 블리는 «8칸 거리 · 눈보라 먼저 → 얼음보주(보스 · 엘리트는 얼음 작렬) → 죽을 때까지 빙하가시 · 전자기장은 틈 봐서»
쓴 기술
무엇이 남았나
- 강화학습 비교로 젖소방 설정 확정 (일반 판 37판, 분당 처치 · 괄호는 판 수): 스킬 끔 112.2(33) vs 켬 97.6(4) · 동선 밀도 24 111.7(30) · 28 106.8(5) · 16 103.3(2) · 공전 5칸 118.7(4) · 2칸 108.3(22)
- 젖소방 한 판 — 본 소 591마리 중 588마리 처치 (99.5%) · 분당 177.9 (2026-09-28)
- 소서리스 추가 첫날 — 안다리엘 한 판 72초 → 24~26초, 보스 처치 1.8~2.2초
- 런 13가지 · 직업 3개(빌드 4개) · 판 끝 자동 점검 규칙 731개
- 최근 기록 174판 중 172판 성공 (2026-10-08)
- 봇 코드 99개 파일 · 29,352줄 · 테스트 파일 43개 (테스트 함수 307개) — 9월 27일 맵핑과 저장소를 나눔
- 개인 오프라인 플레이용 — 배포하지 않았습니다
알게 된 것
강화학습에서 어려운 건 알고리즘이 아니라 보상을 정하는 일이었다. «빨리 잡기» 만 보상에 넣으면 봇은 위험하게 붙는다 — 그래서 피해에 벌점을 걸었고, 강한 몬스터 판은 표를 따로 뒀다. 그리고 보상 표가 결론을 내도 확정은 사람이 한다. 점수 옆에 판 수를 늘 같이 적는 것 — 네 판짜리 1등과 서른 판짜리 1등은 같은 1등이 아니다. 그걸 매번 드러내 놓고 고르는 게 이 에이전트를 만들면서 제일 많이 연습한 일이다.




