문제

이는 게임의 비즈니스 로직의 일부이기 때문에 모델의 일부일 수 있습니다.

컨트롤러의 일부로 간주되는 플레이어 입력을 시뮬레이션하는 것으로 볼 수 있기 때문에 컨트롤러의 일부일 수 있습니다. 그렇죠?아니면 그럴까요?

Mario의 Goomba와 같은 일반적인 적은 어떻습니까?

업데이트:와, 정말 내가 기대했던 대답은 아니네요.내가 아는 한, A.I.자율 게임 시스템의 내부 부분이므로 모델입니다.나는 아직도 확신하지 못한다.

도움이 되었습니까?

해결책

MVC는 원래 순전히 GUI 아키텍처 패턴이라는 것을 기억하십시오. 따라서 AI, 네트워킹 등에 잘 매핑되지 않는다는 것은 놀라운 일이 아닙니다. 그러나 여기서는 여전히 이점이 있습니다. 그러나 코드가 달성하는 것은 체인의 위치만큼 중요하지 않습니다. 무언가가 내부 인 것처럼 보이기 때문에 그것이 그대로 계산되지 않아야한다는 의미는 아닙니다.

예를 들어. 봇을 쓰는 경우 캐릭터를 조작하기 위해 스크립트를 작성할 가능성이 높습니다. 그런 의미에서 스크립트 인터페이스는 기존 컨트롤러이며 스크립트는 완전히 외부입니다. 당신은 그 높은 수준의 ai를 쓰기 위해 모델 근처에 가지 않습니다 ..

이제 당신이 최초의 프로그래머라면, 낮은 수준 AI 기능을 작성 해야하는 원래 프로그래머라면, 플레이어 상호 작용 (예 : 걷기 시작하기 위해 어딘가에 클릭하는 것) 또는 봇 스타일 스크립트로 트리거됩니다. 모델로.

'AI'와 같은 단일 개념을 모델, 컨트롤러를 통해, 컨트롤러를 조작하는 사람이나 무엇이든간에 단일 개념을 갖는 것은 직관적이지 않은 것처럼 보일 수 있지만, 2 개의 매우 다른 개념을 매핑하려고 시도 할 때의 방식입니다. 서로. 개발자가 플레이어 문자와 동일한 인터페이스를 제시하려고하는 개발자의 관점에서 볼 때 분명합니다. 궁극적으로 AI는 외부의 배우가하는 높은 수준의 의사 결정을 모두 포함해야합니다. 이 시스템은 일반적으로 시스템 내에서 플레이어와 비 플레이어 모두에게 존재하는 낮은 레벨 구현 외에도 가능합니다.

다른 팁

MVC는 많은 응용 프로그램을위한 아키텍처로 매우 잘 작동합니다. 일부 응용 프로그램은 MVC가 외부 인터페이스, 특히보다 복잡한 아키텍처의 일부로 사용자 인터페이스.

자신이 패턴에 문제를 "강제로 맞추려고"시도한다면 아마도 올바른 패턴이 아닐 것입니다. UI에 MVC를 사용하십시오 - 다른 패턴 (메시지 버스 또는 관찰자/청취자 등) 또는 AI에 대한 기타 OO 기술을 사용하십시오 (@Bill의 도마뱀의 전략 제안이 여전히 적용됨).

망치뿐만 아니라 전체 도구 상자를 사용하십시오. ;-)

적 AI 모델이 있습니다 - 게임을하는 방법을 지정하는 지능형 내부 - 컨트롤러를 사용합니다 인간 플레이어와 NPC 모두가 게임 환경에서 상태를 조작 할 수 있습니다.

Tic-Tac-Toe와 같은 간단한 게임을 생각해보십시오. 각 난이도 수준을 만드는 경우 a 전략, 다른 구현에서 쉽게 삭제하기 쉽습니다.

인간 플레이어를 시뮬레이션하는 것처럼 보이므로 인간 플레이어가 같은 위치에 있어야합니다. 따라서 컨트롤러와 상호 작용하는 외부 요소입니다. (명백한 이유로, 디스플레이는 실제로 필요하지 않습니다.)

편집 : 사실, 나는 그것을 되 찾습니다. 그것은 인간이 읽을 수있는 디스플레이가 없을 것입니다. "디스플레이"는 직렬화 된 데이터를 스트리밍하는 것을 의미하더라도 게임 상태 정보를 AI에 전달하는 책임이 있습니다.

2 부 : 아, 알겠습니다. 제가 생각했던 것과 같은 유형의 AI가 아닙니다. 나는 그것이 여전히 같은 방식으로 처리 될 수 있다고 생각하지만, 이로 인해 새로운 기능이 컨트롤러에 노출되도록 강요 할 것입니다. (예를 들어, 컨트롤러는 플레이어의 장치와 컴퓨터 유닛을 모두 이동해야합니다.)

나는 모델에 동작을 넣을 것입니다.

Goomba.move()
{
    /* Move Goomba forward one unit. */
}

그런 다음 해당 동작의 호출은 컨트롤러에 들어갑니다.

Controller.advanceTime()
{
    foreach(Goomba goomba in state.getGoombas())
    {
        goomba.move();
    }
}

적 AI 모델은 게임의 규칙을 알고 해당 규칙에 따라 내부 상태를 변경합니다.게임 컨트롤러는 내부 상태를 어떻게 변경해야 하는지 결정하는 데 사용할 수 있는 외부 게임 상태에 대한 지식을 AI에 제공합니다.

(여기서 처음 쓴 내용입니다 :)

게임 세계와 상호 작용하는 AI 부분은 컨트롤러에 있습니다.자율 에이전트로서 결정을 내리는 AI의 일부는 모델에 있습니다.컨트롤러는 결정의 기반이 되는 상태로 AI 모델을 업데이트하고, 컨트롤러는 AI 모델의 변경 사항에 따라 게임을 수정하고 뷰를 렌더링합니다.

Goomba의 경우 게임 컨트롤러는 Mario의 위치(시야에 있는 경우)로 Goomba 모델을 업데이트하고 Goomba 모델은 이동하려는 위치를 자체적으로 업데이트합니다.그러면 컨트롤러는 장애물이 없으면 Goomba를 이동(즉, 모델 위치 업데이트)하고 Goomba의 새 상태로 뷰를 렌더링합니다.

MVC에 어디에 적합한 지 잘 모르겠습니다. 이 psudo 코드는 내가 AIS를 찾는 경로를 수행 한 방식의 극도로 단순화 된 버전입니다.

sprite {
  x,y
  image // this object contains everything about drawing
  path[] // an array of path nodes generated by my AI
  onNode(node) {
    if (x == node.x) && (y == node.y) return true
    return false
  }
  update () {
    moveto(path.last())
    if (onNode(path.last())) path.pop()
    if (path.empty()) path = doAI()
  }
  doAI() {
    ...
    return newPath
  }
  moveto(node) {
    ...
  }
  draw (screen) {
    if (screen.over(x, y)) image.draw(x-screen.x, y-screen.y)
  }
}

screen = //something the platform would create
spriteCollection = //my game objects

foreach (sprite in spriteCollection) {
  sprite.update()
  sprite.draw(screen)
}

내 생각에, 모든 MVC 구현에서 모델은 도메인 로직을 보유해야합니다. 자율 객체가 될 때마다 (논리가 메서드 내부에 늘어납니다) 또는 소켓 스트림 래퍼 (외부 리소스를 통해 논리가 수행되는 경우 - 예, 멀티 플레이어에 대해 생각하십시오). . 컨트롤러는 일부 외부 변수 (예 : CLI 매개 변수, 이벤트 디스패처)를 기반으로 모델의 발신자/핸들러로 사용해야합니다. 그런 다음 필수 데이터 (배열, 직렬화 된 Vars 또는 일부 종류의 데이터 전송 개체)를 적절한보기 (GamesCreen, Console Terminal)로 반환합니다.

건배, 앨런

어느 것도 아니다. AI를 컨트롤러를 통해 모델과 통신하는 독립적 인 에이전트로 프로그램합니다. 또는 원한다면 AI는입니다 모델이지만 그렇지 않습니다 그만큼 모델.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top