나는 Pyrolistical의 대답에 동의하고 그의 일을하는 방식을 선호합니다 (나는 다른 대답을 훑어 보았습니다).
우연히도 그의 "GamePhase"이름도 사용했습니다. 기본적으로 턴 기반 보드 게임의 경우 Pyrolistical에서 언급 한 것처럼 GameState 클래스에 추상 GamePhase의 개체가 포함되도록하는 것입니다.
게임 상태는 다음과 같습니다.
- 롤
- 움직임
- 구매 / 구매 안함
- 교도소
각 상태에 대한 구체적인 파생 클래스를 가질 수 있습니다. 최소한 다음을위한 가상 기능이 있어야합니다.
StartPhase();
EndPhase();
Action();
StartPhase () 함수에서 상태에 대한 모든 초기 값을 설정할 수 있습니다 (예 : 다른 플레이어의 입력 비활성화 등).
roll.EndPhase ()가 호출되면 GamePhase 포인터가 다음 상태로 설정되었는지 확인합니다.
phase = new MovePhase();
phase.StartPhase();
이 MovePhase :: StartPhase ()에서 예를 들어 활성 플레이어의 남은 움직임을 이전 단계에서 굴린 양으로 설정합니다.
이제이 디자인을 사용하면 Roll 단계에서 "3 x double = jail"문제를 해결할 수 있습니다. RollPhase 클래스는 자체 상태를 처리 할 수 있습니다. 예를 들면
GameState state; //Set in constructor.
Die die; // Only relevant to the roll phase.
int doublesRemainingBeforeJail;
StartPhase()
{
die = new Die();
doublesRemainingBeforeJail = 3;
}
Action()
{
if(doublesRemainingBeforeJail<=0)
{
state.phase = new JailPhase(); // JailPhase::StartPhase(){set moves to 0};
state.phase.StartPhase();
return;
}
int die1 = die.Roll();
int die2 = die.Roll();
if(die1 == die2)
{
--doublesRemainingBeforeJail;
state.activePlayer.AddMovesRemaining(die1 + die2);
Action(); //Roll again.
}
state.activePlayer.AddMovesRemaining(die1 + die2);
this.EndPhase(); // Continue to moving phase. Player has X moves remaining.
}
나는 플레이어가 커뮤니티 상자에 착륙 할 때를 포함하여 모든 것에 대한 단계가 있어야한다는 점에서 Pyrolistical과 다릅니다. 이 모든 것을 MovePhase에서 처리합니다. 순차 단계가 너무 많으면 플레이어가 너무 "안내"된 느낌을받을 가능성이 높기 때문입니다. 예를 들어 플레이어가 부동산 만 구매하고 호텔 만 구매 한 다음 집만 구매할 수있는 단계가 있다면 자유가없는 것과 같습니다. 모든 부품을 하나의 BuyPhase로 묶어 플레이어가 원하는 것을 구매할 수있는 자유를 제공하십시오. BuyPhase 클래스는 합법적 인 구매를 쉽게 처리 할 수 있습니다.
마지막으로 게임 보드를 다루겠습니다. 2D 배열이 좋지만 타일 그래프 (타일이 보드의 위치)를 갖는 것이 좋습니다. 독점의 경우 이중으로 연결된 목록이 될 것입니다. 그런 다음 모든 타일에는 다음이 있습니다.
- previousTile
- nextTile
따라서 다음과 같이하는 것이 훨씬 쉬울 것입니다.
While(movesRemaining>0)
AdvanceTo(currentTile.nextTile);
AdvanceTo 함수는 단계별 애니메이션 또는 원하는 모든 것을 처리 할 수 있습니다. 물론 남은 움직임도 줄입니다.
GUI에 대한 관찰자 패턴에 대한 RS Conley의 조언은 좋습니다.
나는 전에 많이 게시하지 않았습니다. 이것이 누군가를 돕기를 바랍니다.