문제

저는 게임 개발에 비교적 새로운 것이므로 경험과 엔터테인먼트 모두에 대한 취미 프로젝트를 처음부터 만들고 싶다고 결정했습니다. 특정 게임은 알려진 포커와 유사합니다 3 개의 카드 자랑. 게임은 영화에서 재생됩니다 잠금, 재고 및 2 개의 흡연 배럴.

나는 게임 개발에 관한 주제 중 일부를 읽고 있었지만 대부분 이 질문. 이것은 내가 객체를 만드는 원래의 방식을 개선하는 데 도움이되었습니다.

내가 가진 특별한 문제 중 하나는 게임 상태를 정의하는 것입니다. 나의 초기 접근법은 모든 것을 분리하는 것이 었습니다 (예 : 칩 스택을 Player 클래스) 그러나에 대한 응답을 읽은 후 의문 이전에 언급했는데, 게임의 가능한 모든 상태가 GameState 물체. 내가 생각해 낸 것은 본질적으로 다음과 같습니다.

abstract class CardGameState
{
    protected List<Player> _Players;
    protected Player _CurrentPlayer;
    protected Dictionary<Player, int> _Chips;
    protected Dictionary<Player, Hand> _CurrentHand;
    protected Dictionary<Player, PlayerStatuses> _PlayerStatus; // PlayerStatuses.InHand, PlayerStatuses.Folded, PlayerStatuses.SittingOut, etc.
    /* etc. */

각각 CardGameState 어떤 조치로 수정됩니다.

public interface IAction
{
    string Name { get; }

    CardGameState Apply(CardGameState state);
    bool IsLegal(CardGameState state);
}

이제 플레이어와 관련된 데이터 (이 경우 그의 칩 스택, 핸드 및 현재 상태)가 Player 물체.

반면에, 플레이어가 내기를 높이려면 RaiseAction 그것을 구현합니다 IAction, 하지만 IAction 인터페이스는 현재 게임 상태 만 허용합니다. 칩 스택이 Player 수업.

기본적으로, 내 질문은 : 게임 상태를 정확하게 표현할 수 있도록 두 세계를 최대한 활용할 수 있습니까? 동시에 모든 데이터가 주어진 객체 내의 게임 상태 내의 객체와 관련하여 동시에 유지할 수 있습니까?

도움이 되었습니까?

해결책

온라인 게임에서 명령 패턴 (당신의 IACTION)은 표준이며 입증 된 방법입니다. 그것은 플레이어의 의미에서 객체 지향적이지는 않지만, 행동은 객체 지향적이므로 순전히 이론적 인 관점에서 견고한 디자인 패턴을 생각합니다. 그리고 실제로 그것이 내가 본 모든 성공적인 온라인 게임이 그것을 구현하는 방식이지만, 액션 게임은 일반적으로 일종의 흐름이 될 때까지 매우 작은 신중한 액션/패킷을 사용한다는 점에 유의합니다.

편집하다:

내가 이것에 대답 한 지 오래 된 후, 나는 여기로 돌아와서이 문제에 대한 또 다른 해결책이 게임 선수, 데크 등을 구현하는 것임을 깨달았다. istate 수업 적용 (IACTION ACTION) 회원. 이런 식으로 객체는 응용 프로그램이 객체에 동작을 적용하는 대신 행동을 스스로 적용합니다. 이것은 동작을 매핑하고 상태를 방문자 패턴 명령 패턴 대신. 방문자가 더 큰 오버 헤드와 더 많은 캡슐화를 갖는 곳에서는 솔루션이 작동하지만 명령은 캡슐화가 적은 쉬운 솔루션입니다.

다른 팁

객체 지향을 위해 객체 지향적 인 것 같습니다 ...

밥 마틴의 클래식처럼 보입니다 볼링 게임 문제.

편집 : -Summary-
오래 읽은 독서이지만 기본적으로 TDD와 Refactoring을 통해 볼링 스코어링 응용 프로그램은 많은 클래스와 다형성이있는 거대한 클러스터에서 20 또는 30 개의 우아한 코드 라인으로 진행되었습니다. 왜요? 처음에 거기에있을 필요가 없었기 때문에

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top