드워프 요새의 명령 순서 아키텍처


21

AI에 명령 명령 시스템을 구현하는 가장 우아한 방법은 무엇입니까? 예를 들어, 산림을 위해 산림 지역을 표시 할 때 드워프 요새에서 드워프는 다음 순서를 따릅니다.

  1. 나무로 이동
  2. 나무를 잘라
  3. 비축 장에 목재 배달
  4. 다른 나무로 이동
  5. 등등..

이미 스택 명령이 작동하지 않습니다. 1은 유휴 상태에서 트리의 대상 타일에 도달합니다.

내가 두려워하는 것은 다음과 같이 더 많은 주문을 만들 때 이것이 지저분해질 것입니다.

집을 짓다

  1. 비축으로 이동
  2. 건축 지역에 나무를 가져오다
  3. 비축으로 돌아가다
  4. 건축 면적에 돌을 가져와
  5. 건물 스프라이트 애니메이션

심기

  1. 비축으로 이동
  2. 종자를 농장 음모로 가져오다

양조

  1. 비축으로 이동
  2. 식물을 여전히 가져 오십시오
  3. 양조 스프라이트 애니메이션

내 질문은 왜 난쟁이 요새와 같은 명령 주문 시스템을 구현하고 동시에 스파게티 코드를 피하는 것입니까? 공부해야 할 데이터 구조가 있습니까? 명령 시퀀스를 별도의 xml 파일에 넣어야합니까?


1
드워프 요새에는 실제로 그러한 시스템이 없습니다. 드워프는 한 번에 하나의 임무를 부여받으며 유휴 드워프는해야 할 일을 찾습니다. ( "이봐 요, 자르기로 표시된 나무가 있습니다-잘게 썰어 야합니다!"/ "이봐, 비축되지 않은 나무가 있습니다-나는 그것을 가져 가야합니다!")
user253751

1
드워프에게는 플레이어가 아무것도 할당하지 않지만 시스템에서 "지정된"작업을 수행합니다. 이는 정확히 Jed T.에서 설명한 아키텍처입니다. 주문을 생성하면 시스템은 해당 주문을 이행하기 위해 개별 구성 요소 작업을 할당합니다.
Attackfarm

2
이를 작업 할당 및 예약이라고하며 여러 엔지니어링 분야에서 광범위하게 연구됩니다. 이 문제에 대해 많은 논문을 찾을 수 있는데,이 문서는 흥미로울 수 있습니다.
TonioElGringo

@Attackfarm 시스템이 모든 작업을 미리 결정하지는 않습니다. 같은 난쟁이에 여러 작업을 할당하지도 않습니다. 한 작업이 처음에 할당되고 완료되면 다른 작업을 사용할 수있게됩니다.
user253751

답변:


27

처음에는 명령이 목록 형식임을 알 수 있으므로 첫 번째 본능은 해당 구조를 다시 작성하는 것이며 각 난쟁이는 해당 목록을 순서대로 실행합니다. 내가 제안하는 것은 각 단계에 전제 조건이 있는 목록을 단계 로 나누고 전체 명령 을 반대로 실행하는 것 입니다. 예를 들어 설명하겠습니다.

목재 절단

  • 나는 나무를 가지고 다니고 있습니까? : 떨어 뜨려
  • 나는 나무를 나르고 있습니까? : 비축 장으로 이동
  • 나는 나무에 있습니까? : 잘게
  • 위의 모든 것 : 나무로 이동

이것의 장점은 다음과 같습니다.

  • 구현하기 매우 간단
  • 융통성-이 목록을 자유롭게 분해하고, 항목을 추가하고, 항목을 제거하고, 항목을 결합 할 수 있습니다
  • 상태 없음-모든 주에서 난쟁이에 대해 맨 처음부터이 목록을 실행할 수 있으며, 난쟁이는 올바른 일을합니다 TM

단점 :

  • 상태가없고 붙어 있다는 인식이 없기 때문에 루프에 빠지기 쉽습니다.

논리적으로 이러한 명령을 순서대로 표시 할 수 있으며 매번 맨 위에서 실행되며 수행하는 작업은 각 단계에서 예 / 아니오로 응답하는지 여부에 따라 다릅니다. 코드로 구현하든 XML과 같은 외부 파일로 구현 하느냐는 당신에게 달려 있습니다.


2
이것은 또한 상태 무시 명령을 허용한다는 장점이 있습니다 . 그렇다면 모든 것을 버리고 나무 운반 작업과 비슷한 음식을 먹어 작업을 "먹으십시오" .
ratchet freak

7
@ratchetfreak "내 요새의 안전이 민간인을 공격하지는 않지만이 괴물과 싸우는 것에 의존한다는 것을 알고 있습니다. 그런 측면에서 너무 많은 DF처럼하고 싶지 않아 시도 : P
대령 서른 두

나는 이것이 비행기 포장 의 버그가있는 인공물을 허용하는 사용 (또는 적어도 사용 된)과 비슷하다고 생각합니다 (이것은 금지 된 항목으로 인해 반복이 발생했습니다)
Destrictor

3
@ColonelThirtyTwo 어디 fun에서? ;)
Lasse

이를 위해 선언적인 상징적 행동 계획을 사용하지 않는 것이 좋습니다. 디버깅은 기본적으로 불가능하며 바람직하지 않은 동작이 쉽게 발생할 수 있습니다. 절차별로 각 작업에 대한 작업 순서를 훨씬 쉽게 하드 코딩 할 수 있습니다.
mklingen

10

시퀀스를 꽤 일반적으로 만들 수 있다면 스파게티 코드는별로 없습니다.

배송의 경우 : 예 : WorkTask는 WorkPlan과 함께 작동합니다. Workplan은 어떤 종류의 자원 단위, 어떤 종류의 집에서, 어떤 보행 애니메이션 사용, 어떤 작업 애니메이션 사용, 작업 시간 및 모든 세부 사항을 알려줍니다. 결국 WorkTask는 다음과 같습니다.

  1. 지도에서 % resource1 % 찾기
  2. % animation_1 %를 사용하여 해당 위치로 이동
  3. % time %에 % animation_2 %를 사용하여 작업
  4. % req_count1 % 카운트에서 % req_resource1 % 가져 오기
  5. % animation %을 사용하여 % home %으로 이동
  6. % time_2 % 동안 내부에서 % animation_6 % 시작
  7. 기타..

우리는 설명 된 접근법을 성공적으로 사용합니다. 게임에는 ~ 15 개의 작업이 있습니다. 일부 주요 특징 :

  • 작업은 단위 작업을 제공합니다 (가기, 들어가기, 나가기, 여기로 가기, 머물기, 일하기, 가기)
  • 작업이 완료 또는 중단 상태로 끝나서 작업으로 전달
  • 모든 것이 하드 코딩되었습니다 (파서, 인터페이스 메소드, 이전 버전과의 호환성 필요 없음)
  • 각 작업은 몇 가지 일반적인 방법 (생성, 실행, 저장,로드)으로 추상 작업 클래스를 구현합니다.
  • 일반적으로 모듈 당 하나의 작업이지만 유사한 작업이 하나의 모듈에 있습니다.
  • 매우 유사한 작업이 한 클래스 내에 있으며 몇 개의 IF (집으로 배달 또는 유닛으로 배달)에 의해 지배됩니다.
  • 각 작업에는 자원의 적절한 잠금 및 잠금 해제가 필요합니다 (단위가 임의의 단계에서 사망 한 경우 잠금 된 자원을 해제해야 함)

2
이것은 우리가 왜소한 요새 같은 게임에서 사용하는 시스템입니다. 작업은 행동 트리에 의해 수행됩니다. 리소스는 동작에 의해 잠기고 실패하면 잠금이 풀립니다. 그것은 훨씬 더 강력하고 쉬운 상단 응답에 의해 기술 된 행동 계획 접근 방식에 비해 디버그입니다
mklingen

5

이것은 기본적으로 지형 정렬 문제입니다.

그래프가 있고 각 노드는 수행해야 할 작업이며 일부 노드는 다른 노드에 의존합니다 (이는 노드의 종속 노드에서 종속 노드로 그래프의 가장자리로 표시됨). 모든 작업을 수행하려고하므로 지형적으로 정상인 노드의 일부 순서를 생성해야합니다 (종속 노드는 종속 노드 뒤에 있습니다).

이제는 일반적으로 많은 순서가 있습니다 (일부 노드에는 의존성이 없으며 어디에나 둘 수 있기 때문에, 일부 노드는 동일한 의존성을 가지고 서로 의존하지 않기 때문에 그들 사이에 순서가있을 수 있으며, 어떤 노드도 가능합니다) 종속 관계가 완료된 후 그리고 그에 따라 노드가 완료되기 전에 어느 곳에 나 두어야합니다.

그래프 지형을 정렬 할 수있는 방법이 없을 수도 있습니다-그래프에 사이클이있을 때 발생합니다 (나무가 없거나 나무를 자르고 나무를 자르고 나무를 자르고 도끼를 자르고 도끼를 만들 때 발생합니다) 나무 필요). 이러한 경우 알고리즘은 이러한 작업을 수행 할 수 없음을 플레이어에게 표시해야합니다.

또한 노드에 우선 순위를 추가 할 수 있으며, 우선 순위가 더 큰 우선 순위 노드가있는 모든 종속성 중에서 이러한 순서를 찾아야합니다.

또한 회수 작업을 추가 할 수도 있습니다. 가장 쉬운 방법은 완료 될 때마다 시간 초과가있는 작업을 다시 그래프에 추가하는 것입니다.

이제 그것을 해결하는 방법 -http : //en.wikipedia.org/wiki/Topological_sorting

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.