문제

나는 이 객체 지향 디자인 질문에 대해 한동안 생각해 왔지만 만족스러운 해결책을 찾지 못했기 때문에 여기 있는 군중에게 공개하여 의견을 구해야겠다고 생각했습니다.

나는 게임 턴 기반 보드 게임을 나타내는 클래스인 경우 이 질문의 목적에 따라 Monopoly와 유사하다고 가정할 수 있습니다.내 디자인에는 플레이어 메소드를 포함하는 클래스 테이크턴.

그만큼 게임 모두를 통해 루프 플레이어s를 실행하고 TakeTurn 메서드를 호출하여 회전을 완료하는 데 필요한 모든 작업을 수행합니다.나는 n명의 플레이어를 가질 수 있고 그들 중 임의의 수를 컴퓨터 플레이어로 설정할 수 있기를 원합니다.그래서 저는 HumanPlayer 클래스와 컴퓨터플레이어 클래스는 둘 다 Player에서 파생됩니다.

그만큼 게임 오직 ~만을 알고 있다 플레이어 수업을 마치고 간단히 테이크턴 각각의 방법 플레이어 차례로.내 문제는 컴퓨터플레이어 객체는 완전히 자동화될 수 있습니다.독점의 예를 따르면서 논리를 사용하여 부동산을 구입하기로 결정할 수 있습니다.이제 휴먼플레이어 객체의 경우, 예를 들어 속성을 구매하려면 실제 사용자로부터 입력을 받아야 합니다. 이는 다른 인터페이스를 암시하고 잠재적으로 파생해서는 안 된다는 것을 의미하는 것 같습니다.

나는 그 문제에 대한 좋은 해결책을 생각해 내지 못했습니다. 게임 클래스는 다양한 실제 구현을 알고 있습니다. 플레이어 명시적으로 수업을 진행합니다.나는 항상 가정을 할 수 있었다 게임 인간과 컴퓨터 플레이어만 있고 확장을 위해 효과적으로 닫을 수 있지만 좋은 OO 프로그래밍처럼 보이지는 않습니다.

이에 대한 어떤 의견이라도 감사하겠습니다.

도움이 되었습니까?

해결책

내 생각에는 Game 클래스가 IO를 처리하도록 해서는 안 된다고 생각합니다.이런 식으로 (차단) TakeTurn 메서드는 게임 보드에서 구현 수단을 숨깁니다.다른 개체를 사용하여 사용자와 통신할 수 있습니다.

Game 클래스가 관심을 가져야 할 모든 것은 보드의 상태와 차례입니다.플레이어는 모두 단일 플레이어 인터페이스를 구현해야 하며 게임에서 모든 구현을 숨겨야 합니다.

다른 팁

게임이 게임 상태를 관리하는 경우 그리고 I/O를 수행하면 게임이 너무 많은 작업을 수행하고 있습니다.

당신은 게임이 규칙과 턴, 상태 변화에만 집중하기를 원합니다.게임은 플레이어가 무엇인지 모릅니다.플레이어가 있다는 것만 알고 있습니다.

플레이어가 게임 상태를 검사하고 자신의 차례 동안 법적 조치를 실행하기를 원합니다.

인간 플레이어와 게임 전체 둘 다 게임 상태를 표시하고 사람의 입력을 요청하는 공통 I/O 패키지를 공유합니다.

Java를 잘 활용할 수 있습니다. Observable I/O 패키지를 만들어서 Observer 게임의.이렇게 하면 게임 상태 변경 사항이 표시나 로깅 또는 둘 다를 위해 I/O에 보고됩니다.

아마 두 개도 없을 거에요 HumanPlayer 그리고 ComputerPlayer 수업은 하나지만 Player 생성 시 적절한 입력 전략으로 구성된 클래스입니다.

플레이어가 게임의 다음 차례에 자신의 움직임을 결정하기 위해 정보를 얻는 방법은 다음과 같습니다. 오직 (적어도 원래 문제 설명과는 다르게) 달라지므로 이를 별도의 추상화로 캡슐화하세요.

게임을 설정하는 상위 클래스가 무엇이든 각각에 대한 적절한 입력 전략을 사용하여 두 세트의 플레이어(사람 하나, 컴퓨터 시뮬레이션 하나)를 생성한 다음 이러한 플레이어 개체를 게임 개체에 제공해야 합니다.그런 다음 Game 클래스는 TakeTurn 각 새로운 턴에 대해 주어진 플레이어 목록에 대한 방법입니다.

게임 클래스에 사람이 한 명뿐이라고 말하는 대신, 게임 메뉴/초기화 중에 해당 입력을 받도록 하면 어떨까요?플레이어가 더 많은 경우 게임 클래스 초기화 전에 일종의 입력(메뉴에서 플레이어 선택)을 통해 결정할 수 있습니다.

인터페이스는 플레이어 에게 선물하다 게임 파생된 동작과 직교합니다. 플레이어 클래스.

시행한다는 사실 테이크턴 구체적인 종류에 따라 다르지만 플레이어 물체가 우려할 만한 원인이 되어서는 안 됩니다.

내 생각 엔 Game 클래스는 플레이어 클래스의 구현에 대해 관심을 가져서는 안 되며 사용자 인터페이스도 무시해야 합니다.

모든 사용자 입력은 HumanPlayer 수업.

내 말은, 게임 클래스는 이것이 컴퓨터 플레이어인지 인간 플레이어인지 상관하지 않습니다.항상 호출해야 합니다. 테이크턴 다음 플레이어 클래스에.이것이 인간 플레이어라면, 이는 플레이어 클래스를 통해 사용자와 소통하고 사용자에게 무엇을 해야 할지 물어봅니다.이는 사용자가 결정을 내릴 때까지 차단된다는 의미입니다.일반적으로 UI 상호작용은 애플리케이션의 메인 스레드에서 발생하므로 차단이 중요합니다. 테이크턴 애플리케이션 전체를 차단하지 않습니다. 그렇지 않으면 사용자 입력을 처리할 수 없습니다. 게임 기다립니다 테이크턴.

대신에 게임 수업 소집 테이크턴 플레이어가 콜해야 하는 모든 플레이어에 대해 테이크턴게임 수업과 게임 클래스는 올바른 플레이어가 자신의 차례를 맡고 있는지 확인해야 합니다.

이는 다음 문제를 해결하는 데 도움이 될 것입니다. 사용자 그리고 컴퓨터 플레이어 문제.

이것이 당신이 원하는 것인지 잘 모르겠습니다

public abstract class Player 
{
  int position;
  DecisionMaker decisionDependency;

  ...

  public void TakeTurn()
  {
    position += RollDice();
    GameOption option GetOptions(position);
    MakeDescion(option);
  }

  protected int RollDice()
  {
    //do something to get the movement
  }

  protected abstract void MakeDecision(GameOption option);

}

Public class ComputerPlayer : Player
{
  public ComputerPlayer()
  {
    decisionDependency = new AIDecisionMaker();
  }

  protected override void void MakeDecision(GameOption option)
  {
    decisionDependency.MakeDecision(option);
    //do stuff, probably delgate toan AI based dependency
  }
}

Public class HumanPlayer : Player
{
  public HumanPlayer()
  {
    decisionDependency = new UIDecisionMaker();
  }

  protected override void void MakeDecision(GameOption option)
  {
    decisionDependency.MakeDecision(option);
    //do stuff, probably interacting with the a UI or delgate to a dependency
  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top