2014-05-22 2 views
2

MVC 패턴이있는 턴 기반 카드 게임을 만들려고합니다. 올바른 디자인에 대해 몇 가지 의구심이 있습니다. mvc 카드 게임 설계

나는 이러한 클래스로 구성된 모델을 만들어 :

  • 카드 (사용 정장)
  • 갑판 (40 개 카드, 추출물 카드 방법, 남아있는 카드의 수)
  • 정장 (enum)
  • 플레이어 (명함, 명함, 수중 카드, 생각한 카드)
  • GameModel (Deck, Table d는 생성자에서 두 명의 플레이어가 필요합니다.)

사용자가 "새 게임"버튼을 누르면 플레이어 개체와 GameModel (컴퓨터 및 플레이어)이 만들어집니다. 이것이 올바른 진행 방법입니까? (저는 전략 패턴을 추측하지 않아도됩니다)

GameModel 클래스와 GameFrame (보기) 클래스에 대한 참조가있는 GameController 클래스를 만들었습니다.

컴퓨터가 재생 중일 때 누군가가 손을 잡고 테이블에서 카드를 선택하면 일종의 "일시 중지"를 구현해야하므로 게임 루프로 Runnable 클래스를 만들어야합니다. 옳은?

이 클래스들은 어떻게 상호 작용해야합니까? (이 올바른 영어를 d?)

플레이어 액션 예 :

클릭 카드 버튼 ->의 actionListener -> 작업 가능 여부를 확인 GameController 메소드를 호출 (내 차례 내가 재생할 수있는 컴퓨터 재생) -> 가능한 경우 GameController를 업데이트하면 GameModel -> GameLoop이 GameModel 변경을 확인하고 일부 Thread.sleep (...)으로보기를 업그레이드하는 일부 UI 메서드를 호출합니다. 가능합니까?

그러나이 모든 경우에 나는 AI를 넣어야합니까? 도움을 주셔서 감사합니다.

+0

이 질문을 http://programmers.stackexchange.com/ – fxm

+0

@fxm으로 옮기시겠습니까? http://gamedev.stackexchange.com을 방문하십시오. – Val

+0

고마워, 나는이 사이트를 알지 못했다. – Loris

답변

2

이것은 한 가지 방법으로 만 대답 할 수있는 질문이 아닙니다. 싱글 플레이어 또는 멀티 플레이어로 만들고 싶습니까? 싱글 플레이에서는 아마도 쓰레드가 필요 없을 것입니다. 처음에는 다음을 제안 할 것입니다 :

  • GameController에는 게임 루프를 배치해야합니다. Like while(gameNotFinished()) { player = determineNextPlayer(); player.makeTurn(); }
  • 다른 MVC 계층을 추가하십시오 : PlayerView PlayerController PlayerModel. 그것은 당신의 코드를 더 읽기 쉽게 만들어 줄 것이다. 이 경우 PlayerController (makeTurn())는 인터페이스 일 수 있으므로 HumanPlayerController 및 ComputerPlayerController (보기가 필요없고보기가 필요하지 않음)로 구현할 수 있습니다.
  • GameController는 ActionListener를 구현합니다. 컨트롤러를 모든 버튼에 추가하기 만하면됩니다. 그러면 사용자 입력을 처리하게됩니다.
  • 보기에 제어 코드를 쓰지 않도록하십시오. 보기는 사용자 요청 만 컨트롤러에 전송합니다.
  • 보기 및 모델에 Observer 패턴을 사용하십시오. java.util.Observer 및 java.util.Observable을 참조하십시오. 모델이 변경되면 (예 :카드를 놓으면) 옵저버 (모든 뷰)에 알리고 뷰는 새 카드를 맨 위에 놓습니다.

이 진행하는 올바른 방법인가?
"새 게임"버튼과 설명 된 동작이 왜 문제가되는지 알 수 없습니다. 어쩌면이 동작에서 모든 것을 "재설정"할 수 있으므로 플레이어는 언제든지 버튼을 누를 수 있습니다.

"일시 중지"의 종류의 컴퓨터가
를 재생하는 컴퓨터 플레이어가 자신의 차례를 완료 할 때까지 별도의 대기 시간을 하시겠습니까? 나는 그가 가능한 한 빨리 경기하도록하십시오. 플레이어가 자신의 턴을 마쳤을 때만 게임이 지속되는 한.

사용할 수 있습니까?
내가 다음으로 변경합니다 : -> GameController합니다 (ActionListener를한다) -
클릭 카드 버튼 ( 내 차례> 방법 작업이 가능 여부를 확인하고 난 재생할 수 있습니다, 컴퓨터 카드 수 연주 컨트롤러가 당신의 차례 일 때 당신에게 연락한다! 턴이 가능할 때 카드 버튼을 끄고 makeTurn()이 그것을 다시 가능하게 할 것이다) -> 가능한 경우 GameController를 업데이트한다 GameModel -> GameModel이 모든 옵서버에게 알린다. (조회수) 업데이트 후 업데이트됩니다.

나는 AI를 넣어야합니까?
PlayerController 인터페이스를 구현 한 HumanPlayerController 옆에서 앞에서 설명한대로.

+0

현재 게임은 멀티 플레이어가없는 인간 대 컴퓨터가 매우 쉽습니다. 컴퓨터가 이미 연주되거나 사용자가 이미 연주 한 경우 "일시 중지"가 필요하며 누가 손을 determine 것인지 결정해야합니다. 그렇지 않으면 사용자는 아무 것도 이해하지 못합니다. 어쨌든 팁을 주셔서 감사합니다, 그것은 좋은 시작이 될 수 있지만 게임의 모든 동작이 순간적 일 수는 없습니다. – Loris

+0

원하는 위치에 Thread.sleep (timeInMilliSeconds)을 추가하여 게임 속도를 늦출 수 있습니다. 또는 "계속"버튼을 원하십니까? – Thomas

+0

실행 파일에서 "Thread.sleep (...)"을 사용하는 것이 안전합니까? 나는 전망을 얼어 버릴 위험에 놓기를 원하지 않는다. 그러나, 당신이 "GameModel 구현 ActionListener"위에 쓴 것으로 나타났습니다. 어쩌면 당신은 "GameModel"대신에 "GameController"를 의미했을까요? Ps : 내 GameController 클래스는 싱글 톤입니다. – Loris