2013-07-25 12 views
8

자바로 첫 게임을 만들었습니다. 게임은 독점입니다. 나는 턴 기반 구조 (플레이어 턴을 관리)를 모델링하기 위해 게임을 어떻게 디자인해야하는지 고심하고있다. 나는 인간이 제어하는 ​​한 명의 AI 제어 선수와 한 명 또는 여러 명의 AI 통제 선수 모두가 게임을 할 수 있도록하고 싶다.회전 기반 게임 디자인 : 이벤트 중심 vs. 게임 루프

내 특정 문제는 게임 루프를 구현할지 여부를 모른다는 것입니다. 즉, 플레이어를 관리 할 수있는 루프와 모노 폴리 게임과 직접 관련된 변수를 의미합니다 (각 플레이어에게 턴에 다음 플레이어로 턴을 증가 시키거나 각 플레이어로부터 주사위를 굴린다. 나는 스크린의 프레임을 그리거나, 물리학을 업데이트하거나, 특정 시간에 AI를 업데이트하는 것과 관련이있는 "게임 루프"라는 용어의 더 낮은 수준의 의미를 언급하지는 않습니다.

  1. 는 이러한 게임 루프가없는 완전 이벤트 구동 프로그램을 구현, 또는
  2. 이 게임 루프 인 구현 :

    나의 이해는 내가 필요로하는 것을 구현하려고 내 옵션 중 하나가 있다는 것입니다 백그라운드에서 장기간 실행되고 게임이 실행되는 동안 기본적으로 끝나지 않는 무언가. 이것은보다 절차적인 접근 방법이 될 것입니다.

이 문제를 처음 해결하기 시작했을 때, 게임 루프가 끝나지 않아서 실행중인 스레드를 완전히 소모했기 때문에 UI가 멈추는 문제가 발생했습니다 (매우 간단하게 만들었습니다. 루프는이를 설명합니다). 그래서 저는 게임 루프를 캡슐화하기 위해 SwingWorker을 만들려고했습니다. UI의 정지 문제가 해결되었지만 잘못된 경로를 따라 가고 있는지 궁금해졌습니다.

일반적으로 웹에서의 대부분의 조언은 이벤트 기반의 모든 접근 방식을 선호하는 것으로 나타났습니다. 따라서 SwingWorker을 사용하는 현재 구현은 잘못된 방향으로 나아갈 수 있습니다. 그러나이 특정 작업 (게임 루프가 없음을 의미)을 위해 완전히 이벤트 기반 시스템을 구현하는 방법을 완전히 파악할 수는 없습니다. 플레이어 회전을 관리하기 위해 어딘가에 루프가 있어야한다고 생각합니다. 여기

내 구체적인 질문은 다음과 같습니다

  1. 이 (내가 그들을 설명하고로)와 같은 턴 기반 게임에 적합한 게임 루프 있습니까 모노 폴리 - 특히 플레이어를 대기 서서 자신의 차례에 적합한 선수를 자극에 대한 , 한 번에 한 명의 플레이어 (그리고 차례를 구성하는 일련의 단계들의 순서를 대기).
  2. 플레이어 턴을 관리하기위한 순전히 이벤트 중심 시스템을 만드는 경우 각 플레이어를 반복하여 차례를 확인하고 게임이 끝날 때까지 반복을 유지하는 방법은 무엇입니까?
  3. 위에서 설명한 특정 문제를 해결하기 위해 게임 루프를 사용하는 경우 UI가 멈추는 것을 피하기 위해 자신의 스레드 (가능하면 SwingWorker 사용)에서 실행해야합니까? 내 상황은 자바에 따라 다르지만 자바가 아닌 상황에 대한 해답에 대해서도 관심이 있다고 생각한다.

현재 MVC 패턴을 사용하여 코드를 구성했습니다. 내 컨트롤러는 내 게임 루프 (실제 SwingWorker 스레드)가있는 곳입니다. 그것은 완전히 끝나지 않았지만 내가 "게임 루프"라고 부르는 것을 플레이어가 어떻게 처리 하는지를 설명하는 데 도움이됩니다.컨트롤러에서

SwingWorker 코드 :

swingWorker = new SwingWorker<Void, Model>() { 
@Override 
protected Void doInBackground() throws InterruptedException { 
gameLoopRunning = true; 
while (gameLoopRunning) { 

    //to do: use a timer instead of thread.sleep 
    Thread.sleep(1000); 

    //user turn prompt 
    if (model.getActivePlayer().isUserControlled()) { 

     boolean userRolled = false; 
     while(!userRolled) { 
      System.out.println("Roll the dice please..."); 
      Thread.sleep(3000); 
     } 

    } 
    //bot turn prompt 
    else { 
     //insert code for bot rolling dice here 
     model.rollDice(); 
    } 

    publish(model); 

    Thread.sleep(1000); 
    model.incrementPlayerTurn(); 
    publish(model); 

} 
return null; 
} 

@Override 
protected void process(List<Model> chunks) { 
Model gameModel = chunks.get(chunks.size() - 1); 
//hard-coded for 6 players 
for (int i = 0; i < 6; i++) { 
    view.getPlayerPanel(i).setTurn(gameModel.getPlayers().get(i).isTurn()); 
} 
view.getGamePanel().getDice().setDie1(model.getDie1()); 
view.getGamePanel().getDice().setDie2(model.getDie2()); 
} 

}; 
swingWorker.execute(); 
+0

모노 폴리은 체스와 크게 다르지 않습니다. 체스와 같이 규칙을 훨씬 쉽게 구현할 수 있기 때문에 모노 폴리은 체스와 크게 다르지 않습니다. 왜냐하면 각 이벤트가 어떤 상태에 영향을 미치므로 체스와 같은 것입니다. – arynaq

+0

구현 방법에 관계없이 게임 플레이 CPU주기가 UI 스레드에서 수행되는 것을 원하지 않을 것입니다. – Tim

+1

게임 상태 변화를 표현하기 위해 유한 상태 기계를 사용하는 것은 어떻습니까? 한번은 이벤트 기반의 UI 코드로 체커 게임을 개발하기 위해 원유를 사용했습니다. – SirDarius

답변

9

SirDarius에서 코멘트에 장소입니다.

하지만 플레이어 턴을 진행하는 것처럼 단순한 경우에도 완전한 본격적인 유한 상태 시스템을 구현해야 할 필요는 없습니다.

MVC의 측면에서

, 이것은 당신이 인간 선수를 위해해야 ​​할 일이다

  • 모델 : 다음 플레이어 활성 플레이어의 발전과를 통해 실행하는 방법을 제공 " 턴 프로세스 "(즉, 주사위 굴리기, 활성 플레이어 토큰 이동 등). 턴 프로세스의 대부분은 이벤트 구동이므로 이러한 메서드 호출은 컨트롤러의 이벤트 수신기에서 이루어집니다.

  • 보기 : 활성 플레이어는 자신의 차례뿐만 아니라 다양한 다른 입력에 올리는 이벤트를 완료하면 이벤트를 올립니다.

  • 컨트롤러 : 플레이어가 차례를 마칠 때마다 모델에게 다음 플레이어로 진행하고 "프로세스 다시 시작"을 다시 말하십시오. 플레이어가 입력을 제공 할 때마다 모델이 차례의 다음 단계로 진행하도록 알리는 이벤트가 발생합니다.

AI 플레이어의 경우, 동일한 코드의 대부분은 사용할 수 있지만 턴 진행이보기에 의해 구동 될 가지고 이해가되지 않습니다. 대신 모델에는 AI 플레이어를위한 또 다른 "턴 프로세스"방법이 필요합니다. 유일한 차이점은 일련의 이벤트 리스너가 아닌보기에서 입력을 기다리지 않고 코드가 연속적으로 실행된다는 것입니다.

+0

보기에 대한 의견을 따르지 않습니다. 단추를 클릭 할 때보기 실행 이벤트를 이해할 수 있지만 Monopoly에서 시작하여 끝날 때까지 선회를 시작하거나 끝내기위한 전용 단추가 없을 수 있습니다. 그 외에도, AI 봇이 자신의 턴을 시작하고 종료하는 것은 무엇입니까? 분명히 그들은 턴을 관리하는 관점과 상호 작용하지 않습니다. – nairware

+0

@nairware 독점적 인 플레이어 턴은 자연스러운 진행을 따른다. 수행 할 작업은 너무 많으며, 그 중 하나는 주어진 차례에 대한 마지막 작업입니다. 일반적으로 플레이어는 주사위를 굴려서 조각을 움직이고 행동을 취하고 (재산을 구입하고, 벌금을 부과하고, 카드를 뽑는다.), 집을 사서, (선택적으로) 거래를 수행한다. 플레이어가 감옥에있을 때 턴 프로세스가 변경되지만 플레이어가 수행 할 수있는 마지막 액션이 남아 있습니다. 플레이어가 최종 액션을 완료하면 (또는 상황에 맞는 "종료 턴"버튼을 클릭 할 때) 턴이 종료 될 수 있습니다. –

+0

나는 따른다. 물론 턴을 끝내기위한 이벤트가 의미가 있습니다. 저는 왜 그 시각이 필연적으로 그 사건과 관련이 있는지에 대해 명확하지 않았습니다. 나는 "끝 회전"버튼이 있다고 가정하고 있다고 생각합니다.이 경우보기에 대한 설명이 의미가 있습니다.AI가 제어하는 ​​플레이어는 그런 버튼을 클릭하지 않으므로 인간이 제어하는 ​​플레이어 만 추측합니다. 같은 엔드 턴 이벤트는 AI 제어 선수에게만 발생하지만 버튼 클릭이나 다른 뷰와는 관련이 없습니다 (어쨌든 내 의견으로는). – nairware