경제 기반 게임을 코드로 어떻게 모델링해야합니까?


10

고대 문명을 기반으로 경제 게임을 만들고 싶습니다. 디자인 방법을 잘 모르겠습니다. "Space Invaders"와 같은 작은 게임을하고 있다면 다음과 같이 구성하는 데 아무런 문제가 없습니다.

  • 메인 컨트롤 클래스
  • 그래픽스 클래스
  • 플레이어 클래스
  • 적 클래스

나는 경제 게임과 같은 더 큰 프로젝트를 위해 이것을 어떻게하는지 이해할 수 없다. 여러 도시가 포함 된 국가 클래스를 작성합니까? 도시에는 많은 건축 수업이 포함되어 있습니까? 플레이어가 접근 할 수있는 경로 찾기 수업을 만들 수 있습니까?


3
엔터티-컴포넌트-시스템 (여기서 정식 참조 ) 의 어떤 형태를 사용하고 싶을 수 있습니다. 엔터티가 전혀 자신을 갖지 않도록하십시오 (특히 많은 것을 가지고있는 경우).
ThorinII

9
대부분의 "큰"게임이 얼마나 끔찍하고, 무질서하며, 해킹 당했는지에 대해 놀랄 것입니다. 마감일과 이정표를 중심으로 만들어졌습니다. 게임을 작성하기 만하면 작성해야 할 구조에서 벗어나는 구조는 대부분의 AAA 게임보다 나아지지는 않을 것입니다.
Sean Middleditch

ECS를 완전히 사용하지 않더라도 코드를 복제하지 않는 것이 좋으면 컨트롤러가 엔티티를 반복하고 렌더러를 호출하거나 렌더러를 스캔하도록하십시오. 100 곳에서 사소한 코드를 업데이트하는 것은 쉽지 않습니다.
MickLH

1
당신이 설명한대로 Space Invaders에서 복잡한 게임으로 점프하는 것은 약간 과감합니다. 큰 게임 프로젝트를 시작하기 전에이 두 게임 사이에 더 많은 학습 단계가 있습니다. 2D sidecroller 플랫폼을 구축하고 점차 게임의 복잡성을 증가시키는 것을 고려하십시오. 첫 번째 기어에서 다섯 번째 기어로 이동하면 최대 120km / h까지 걸릴 수 있지만 레벨별로 이동하는 경우와 동일한 효율 (시간 / 노력)로는 그렇지 않습니다.
Emir Lima

2
여기에 두 가지 질문이있는 것 같습니다. 더 중요한 것이 무엇인지 알 수 없습니다. 첫 번째는 객체에 대한 많은 참조를 전달하지 않는 방법에 관한 것이고, 두 번째는 게임의 논리 엔티티를 코드의 클래스에 매핑하는 방법에 관한 것입니다. 이러한 질문에는 명확한 답변이 있으므로 별도의 질문을 게시해야한다고 생각합니다. "통과 참조 피하기"부분을 편집하겠습니다. 다시 게시하십시오 (또한 답변이 매우 유사하기 때문에 "싱글 톤과 글로벌을 피하십시오"에 대한 주제에 대해서는이 사이트를 검색하는 것을 고려하십시오).

답변:


5

여러 도시가 포함 된 국가 클래스를 작성합니까?

확실한.

도시에는 많은 건축 수업이 포함되어 있습니까?

확실한.

플레이어가 접근 할 수있는 경로 찾기 수업을 만들 수 있습니까?

확실한.

위에서 제안한 모든 것이 합리적으로 보입니다. 장기적으로는 가장 좋은 방법은 아니지만 괜찮습니다. 처음 나온 조직 모델이기 때문에 분명히 알 수 있습니다. 그것을 가져 와서 구현을 시작하는 것이 중요합니다. 작업을 시작할 때 종종 개발자를 괴롭히는이 초기 "디자인 마비"를 시작하게하고, (어떤 방식 으로든 결함이있는 경우) 장단점에 대해 한두 가지를 가르쳐줍니다. 디자인에 대한 특정 접근 방식의

당신은 자연스럽게 당신의 머리 속에있는 개념들을 취해서 몇 가지 간단한 규칙에 따라 코드로 그룹화했습니다 :

  • 이 개념이 이미 가지고 있거나 다른 개체의 데이터와는 다른 점이 있습니까? (국가와 사람들은 의미있는 데이터 나 행동을 거의 공유하지 않으므로 게임 내에서 고유 한 유형으로 표시되어야합니다).
  • 이 개념을 코드에서 중요한 방식으로 조작해야할까요? (게임이 개별 사람들을 다루는 경우 해당 Person클래스 가 필요할 수 있지만 게임이 SimCity의 이전 버전과 같이 집합 적으로 만 관심이 있다면 도시 인구의 1 : 1 매핑을 만들기 위해 해당 유형이나 해당 유형의 인스턴스가 필요하지 않을 int populationCount수 있습니다.
  • 이 개념에는 상태가 필요합니까 ? 그렇다면 어떻게 든 무료 함수가 아닌이 상태 (클래스)를 저장할 수 있도록 캡슐화해야합니다. (경로 찾기 구현에는 유사한 실제 객체가 없지만 맵에서 이미 고려한 노드와 같은 데이터를 추적해야하며, 묶음에 저장하는 것보다 클래스를 통해 수행하는 것이 좋습니다. 숨겨진 글로벌 및 독립 기능 제공).

간단하지만, 이러한 질문에 대답하면 정신 개념을 소스 코드로 변환할지 여부와 방법을 결정할 때 많은 도움이 될 수 있습니다. 객체 지향 설계 의 SOLID 원칙 을 읽어 볼 수도 있습니다 .

주석으로 작성된 엔터티 / 구성 요소 시스템의 제안은 유효한 접근 방법이지만 프로젝트를 더 작게 재조정하지 않는 한 여기에서 그것을 피할 것입니다. 너무 어려워서 다른 것에 중점을두면 얻을 수있는 교육 혜택이 희석 될 수 있습니다. 구성 요소 지향 모델에서 위의 질문에서 "유형"은 코드의 구체적인 유형이 아니라 엔터티를 구성하는 구성 요소 모음에 의해 정의 된 암시 적 유형이 더욱 암시 적으로됩니다. 동일한 지침 원칙이 적용될 수 있습니다.


1

당신이 묘사 한 것 (모든 주요 유형의 논리 게임 객체에 대한 클래스)은 단순한 게임처럼 완벽하게 이해됩니다. 이런 종류의 게임을 처음 작성하는 경우, 이런 식으로하는 것이 좋습니다.

몇 가지 팁 :

  • A는 플레이어 에서 정말 다른 ? 많은 기능이 동일 할 수 있으므로 일반적으로 동일한 클래스이거나 동일한 기본 클래스에서 확장되어야합니다. HumanPlayerAIPlayer라는 두 개의 서브 클래스가 있는 AbstractPlayer 기본 클래스를 고려하십시오. 모든 공통 기능은 AbstractPlayer에 있습니다.
  • 상속보다는 컴포지션으로 개체를 구성 하는 것이 좋습니다. 상속 계층을 너무 깊게 만들지 마십시오. ForgeWithSteelAnvil 클래스를 호출하기 시작 하면 걱정해야합니다. ForgeBuilding 의 서브 클래스 일 수 있지만 사용 된 앤빌 유형은 건물 내에 포함 된 오브젝트 여야합니다.
  • 마찬가지로 수백 개의 약간 다른 객체 클래스를 추가하는 대신 객체를 구성 할 수있는 속성 을 선호 합니다 .

좀 더 복잡한 게임에는 사용할 수있는 고급 기술이 있지만 기본 OOP 접근 방식에 매우 익숙해지기 전에는이 기술을 사용 하지 않는 것이 좋습니다 (예 : 몇 가지 완성 된 게임을 성공적으로 만들었습니다). 보다 고급 접근 방식은 다음과 같습니다.

  • 프로토 타입 기반 개체 모델 -모든 게임 개체에 단일 클래스를 사용하고 속성 / 속성 및 구성을 통해 모든 개체를 모델링합니다. 표준 OOP보다 훨씬 유연하고 역동적이지만 관리하기가 까다 롭습니다 (특히, 어리석은 일을한다면 컴파일러가 도움이되지 않습니다). 나는 이것을 작은 Roguelike 게임 Tyrant ( https://github.com/mikera/tyrant ) 에서 효과적으로 사용했습니다.
  • 엔터티 구성 요소 시스템 -다양한 유형의 게임 개체에서 혼합하고 일치시킬 복잡한 동작이 많은 경우에 좋습니다. 매우 강력하지만 제대로 이해하기 어렵습니다.

0

엔터티 및 데이터 집합을 구성하는 데 사용할 수있는 방법은 거의 없습니다. 스프레드 시트 문서를 작성하고 데이터를 앞뒤로 이동하여 효율성을 높이는 것을 선호합니다. 게임을 직접 만드는 경우에는 이해가 필요하다는 것을 기억하십시오. 때로는 가장 효율적인 경로는 코드를 조금 덜 효율적으로 만들어 프로젝트를 더 단순하게 만듭니다.

콘텐츠 구성에 도움이 더 필요한 경우 비슷한 구조 나 스타일을 사용하는 오래된 게임 소스 코드를 찾고 해당 솔루션을 찾으십시오. 그런 다음 수정하고 원하는대로 수정하십시오.


-1, 이것은 코드 구성을 다루지 않고 게임이 내린 디자인 결정의 트레이드 오프를 이해하는 방법을 논의하지 않고 다른 게임이하는 일을 맹목적으로 복사하는 제안으로 보이지 않습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.