fix: 실패한 타일 제외

This commit is contained in:
21in7
2026-03-25 21:20:20 +09:00
parent bc7bb4d1e6
commit c99ca1e43c
9 changed files with 36 additions and 8 deletions

View File

@@ -113,3 +113,4 @@ planner.set_goal(
- 순수 플레이이므로 **걷기, 채굴, 제작에 실제 시간이 소요**됩니다
- AI가 "move 먼저 → 작업" 패턴을 학습하도록 프롬프트가 설계되어 있습니다
- `agent_log.jsonl`에 모든 행동과 타임스탬프가 기록됩니다
- `mine_resource`에서 실패한 채굴 타일 제외(`exclude`)는 Lua와 Python 양쪽에서 정수 타일 좌표(`tx, ty`) 키로 통일해, 제외한 좌표가 반복 선택되지 않도록 합니다.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -134,14 +134,14 @@ rcon.print("WALK:" .. string.format("%.1f", dist))
before_count = self._get_item_count(ore)
target_count = before_count + count
total_mined = 0
failed_positions = set() # 실패한 좌표 기억
failed_positions: set[tuple[int, int]] = set() # Lua exclude 키와 동일한 정수 타일 좌표만 저장
for round_num in range(15): # 최대 15번 시도
# 1. Lua에서 가장 가까운 광석 찾기 (실패한 좌표 제외)
# 제외 좌표를 Lua 테이블로 전달
exclude_lua = "local exclude = {}\n"
for i, (fx, fy) in enumerate(failed_positions):
exclude_lua += f'exclude["{fx:.0f},{fy:.0f}"] = true\n'
exclude_lua += f'exclude["{fx},{fy}"] = true\n'
find_result = self.rcon.lua(P + f"""
{exclude_lua}
@@ -156,9 +156,12 @@ table.sort(res, function(a, b)
end)
-- 제외 목록에 없는 가장 가까운 광석 찾기
for _, e in ipairs(res) do
local key = string.format("%.0f,%.0f", e.position.x, e.position.y)
-- Lua 키를 "정수 타일"로 통일 (반올림/절삭 방식 차이로 exclude가 빗나가는 문제 방지)
local tx = math.floor(e.position.x + 0.5)
local ty = math.floor(e.position.y + 0.5)
local key = string.format("%d,%d", tx, ty)
if not exclude[key] then
rcon.print(string.format("%.1f,%.1f", e.position.x, e.position.y))
rcon.print(key)
return
end
end
@@ -176,14 +179,14 @@ rcon.print("ALL_EXCLUDED")
return False, f"{ore} 근처 타일 {len(failed_positions)}개 모두 접근 불가 — 다른 위치로 이동 필요"
try:
parts = find_result.split(",")
ox, oy = float(parts[0]), float(parts[1])
parts = find_result.strip().split(",")
ox, oy = int(parts[0]), int(parts[1])
except:
return False, f"좌표 파싱 실패: {find_result}"
# 2. 광석 위치로 걸어가기
print(f" [채굴] 광석({ox:.0f},{oy:.0f})으로 이동... (시도 {round_num+1}, 제외: {len(failed_positions)}개)")
ok, msg = self.move(int(ox), int(oy))
print(f" [채굴] 광석({ox},{oy})으로 이동... (시도 {round_num+1}, 제외: {len(failed_positions)}개)")
ok, msg = self.move(ox, oy)
if not ok:
print(f" [채굴] 이동 실패: {msg}")
failed_positions.add((ox, oy))

24
docs/plan.md Normal file
View File

@@ -0,0 +1,24 @@
## 채굴 실패 시 제외 좌표 반복 버그 수정 계획
### 문제 재현/관찰
- `mine_resource`에서 실패한 타일을 `failed_positions`에 추가한 뒤 Lua에 `exclude` 테이블로 전달하지만,
다음 시도에서도 동일 좌표(예: `388,2`)로 다시 이동하는 로그가 발생합니다.
### 원인 후보
- Lua에서 제외 판정에 쓰는 좌표 키가 `string.format("%.0f,%.0f", ...)` 기반인 반면,
Python에서 `exclude["{fx:.0f},{fy:.0f}"]`를 만들 때 반올림/절삭 방식이 Lua와 1:1로 일치하지 않는 케이스가 있을 수 있습니다.
- 이 경우 `exclude[key]`가 항상 false가 되어, Lua가 “가장 가까운 광석”을 계속 같은 엔티티로 반환할 수 있습니다.
### 변경 목표
1. `failed_positions`를 “Lua 키 생성과 동일한 정수 타일 좌표(tx, ty)”로만 저장합니다.
2. Lua에서 후보 광석 엔티티를 검사할 때도 정수 타일 좌표를 계산해 키/반환/마이닝 좌표에 일관되게 사용합니다.
3. 그 결과, 제외한 좌표는 다음 루프에서 절대로 다시 선택되지 않도록 보장합니다.
### 구현 범위
- `action_executor.py`
- `mine_resource` 내부에서 좌표 처리 로직을 정수 타일 기반으로 통일
- Lua 반환값을 `tx,ty` 정수 문자열로 변경하고 Python 파싱을 이에 맞춤
### README 업데이트 계획
- 채굴 제외(exclude) 로직이 “정수 타일 키 기반으로 통일”되도록 README의 기술/동작 설명(또는 체크리스트)을 업데이트합니다.