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

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

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

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

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

집을 짓다

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

심기

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

양조

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

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



답변

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

목재 절단

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

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

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

단점 :

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

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


답변

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

배송의 경우 : 예 : 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 (집으로 배달 또는 유닛으로 배달)에 의해 지배됩니다.
  • 각 작업에는 자원의 적절한 잠금 및 잠금 해제가 필요합니다 (단위가 임의의 단계에서 사망 한 경우 잠금 된 자원을 해제해야 함)

답변

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

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

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

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

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

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

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