-
Notifications
You must be signed in to change notification settings - Fork 0
유한 상태 기계를 이용한 게임 진행 모델링
저희가 정의한 마피아 게임의 규칙은 아래와 같습니다.

특징적인 부분은 각 단계가 이산적으로 구분된다는 것입니다. 이러한 특징을 바탕으로 게임의 진행을 유한 상태 기계로 모델링했습니다. 각 단계를 상태로 표현하고 조건에 따라 상태의 전이가 가능하도록 만들었습니다. 아래는 위의 규칙을 바탕으로 모델링한 유한 상태 기계를 그래프로 표현한 것입니다.

실제 구현에서는 상태 패턴(State Pattern)을 사용했습니다. MafiaState, DoctorState 등의 클래스는 추상 클래스인 GameState 클래스를 상속받고 GameState 클래스에 추상 메소드로 정의된 handle 메소드를 구현합니다. 또한, 각각의 클래스들은 다음으로 전이할 상태를 참조하고 있습니다. 클래스들 간의 관계를 아래에 클래스 다이어그램으로 나타냈습니다.

GameContext 클래스는 현재 상태를 의미하는 state와 게임 진행에 관련된 정보를 담고 있는 room을 필드로 가지며 run 메소드가 호출되면 state의 run 메소드로 실행을 위임합니다.
state의 run 메소드에서는 상태의 전이를 담당하는 함수 next를 정의해 handle 메소드를 호출하며 context와 함께 인자로 전달합니다. handle 메소드에서는 정해진 역할을 수행한 후 인자로 받은 next 함수를 호출해 다음 상태로 전이합니다.
각 상태 클래스에서 역할에 따라 handle 메소드를 다르게 구현하므로 GameContext의 run 메소드는 현재 상태가 무엇인지에 따라 다르게 동작합니다.
web12-MafiaCamp