エコノミーベースのゲームをコードでモデル化するにはどうすればよいですか?


10

古代文明をベースにした経済ゲームを作りたい。どのように設計すればよいかわかりません。「スペースインベーダー」のコピーのような小さなゲームで作業している場合は、次のように構成しても問題ありません。

  • メインコントロールクラス
  • グラフィッククラス
  • プレイヤークラス
  • 敵クラス

エコノミーゲームのような大規模なプロジェクトでこれを行う方法を理解できません。たくさんの町を含むカントリークラスを作成しますか?町にはたくさんの建築クラスが含まれていますか?ほとんどの人のクラスが含まれていますか?プレイヤーがアクセスするためにアクセスできる経路探索クラスを作成しますか?


3
Entity-Component-System(これは正規の参照です)の何らかの形式を使用したい場合があります-エンティティにまったく自分自身を描画させないでください(特に、エンティティがたくさんある場合)。
ThorinII 2013年

9
ほとんどの「ビッグ」ゲームがどれほどひどく、まとまりがなく、ハッキングされているかに驚かれるでしょう。彼らは締め切りとマイルストーンを中心に構築されています。ゲームを作成するだけで、作成する必要のある構造から外れた構造は、ほとんどのAAAゲームと同じかそれよりも優れたものになります。
Sean Middleditch 2013年

本格的なECSを実行しなくても、コードを複製しないのはいいことです。コントローラーにエンティティを反復させてレンダラーを呼び出すか、レンダラーをスキャンさせます。100か所でマイナーコードを更新するのは面倒です。
MickLH 2013年

1
あなたが説明したように、スペースインベーダーから複雑なゲームにジャンプすることは、私の意見では少し抜本的です。大きなゲームプロジェクトに入る前に、これら2つのゲームの間にさらに学習ステップがあります。2Dサイドスクローラープラットフォームを構築し、ゲームの複雑さを徐々に増やしていくことを検討してください。1速から5速に移動すると、最大120 km / hの速度になりますが、レベルごとに移動する場合と同じ効率(時間/労力)ではありません。
エミールリマ2013年

2
ここでは2つの質問があるようですが、どちらがより重要であるかはわかりません。1つ目は、オブジェクトへの大量の参照を渡さないようにする方法であり、2つ目は、ゲーム内の論理エンティティをコード内のクラスにマッピングする方法です。それらの質問には明確な回答があり、それらに対して個別の質問を投稿する必要があると思います。「参照の通過を回避する」部分を編集します。自由に再投稿してください(回答が非常に似ているため、このサイトで「シングルトンとグローバルの回避」に関するトピックを検索することも検討してください)。

回答:


5

たくさんの町を含むカントリークラスを作成しますか?

承知しました。

町にはたくさんの建築クラスが含まれていますか?ほとんどの人のクラスが含まれていますか?

承知しました。

プレイヤーがアクセスするためにアクセスできる経路探索クラスを作成しますか?

承知しました。

上記で提案したことはすべて妥当なようです。長い目で見ればそれは最善の方法ではないかもしれませんが、それは問題ありません。それが最初にあなたに来たのは組織モデルなので、それはあなたが知っていることは明らかに理にかなっています。それを受け取って、そこから実装を始めることが重要です。それはあなたを開始し、タスクの最初に開発者を悩ませることが多いこの最初の「設計麻痺」を乗り越え、そして(それが何らかの方法で欠陥があることが判明した場合)長所と短所についてあなたに1つまたは2つ教えます。デザインへのその特定のアプローチの。

概念を頭の中で自然に取り入れ、いくつかの単純なルールに従ってコードにグループ化しました。

  • この概念は、動作や、すでに持っている他のオブジェクトのデータと大きく異なりますか?(国や人々は、意味のあるデータや行動を共有しているとしても、ごくわずかなので、ゲーム内では異なるタイプで表す必要があります)。
  • この概念をコード内で大幅に操作する必要がありPersonますか?町の人口の1対1のマッピングを作成するために、そのタイプもそのタイプのインスタンスも必要ない場合がint populationCountあります。
  • この概念には状態が必要ですか?もしそうなら、それは何らかの形でカプセル化されるべきであり、それは私が無料の関数の束ではなくこの状態(クラス)を保存することを可能にします。(パスファインディングの実装には、類似の現実世界のオブジェクトはありませんが、マップ内のどのノードが既に検討したかなどのデータを追跡する必要があります。これは、束に格納するよりもクラスを通じて行う方が適切です。隠しグローバルの作成と独立した関数の作成)。

単純ではありますが、これらの質問に答えることは、精神的な概念をソースコードに変換するかどうか、またどのように変換するかを決定しようとするときに大きなメリットがあります。また、オブジェクト指向設計のSOLID原則について読むこともできます

コメントで行われたエンティティ/コンポーネントシステムの提案も有効なアプローチであることに注意してください。ただし、プロジェクトをより小さくスコープを変更しない限り、ここではそれを避けます(1つのプロジェクトで2つの新しい大きな課題に取り組む可能性があるため)非常に困難であり、そうでなければ1つだけに集中することで得られるであろう教育的利益が薄れる可能性があります。コンポーネント指向モデルでは、上記の質問の「タイプ」がより暗黙的になります。コードの具体的なタイプではなく、エンティティを形成するコンポーネントのコレクションによって定義される暗黙のタイプです。同じ指針が適用できます。


1

あなたが説明したもの(論理的なゲームオブジェクトのすべての主要なタイプのクラス)は、単純なゲームとして完全に理にかなっています。このタイプのゲームを初めて作成する場合は、この方法で作成することをお勧めします。

いくつかのヒント:

  • あるプレイヤーは、から本当に違う?機能の多くは同じである可能性が高いため、これらは通常同じクラスであるか、同じ基本クラスから拡張されている必要があります。HumanPlayerAIPlayerの 2つのサブクラスを持つAbstractPlayer基本クラスを考えてみましょう。すべての一般的な機能はAbstractPlayerで実行できます。
  • でオブジェクトを設定することを好む構図ではなく継承。継承階層を深くしすぎないでください。あなたはクラスの呼び出しを開始した場合ForgeWithSteelAnvilを、あなたは心配する必要があります:A フォージのサブクラスであるかもしれないビルが、使用アンビルの種類は、建物内に含まれるオブジェクトでなければなりません。
  • 同様に、数百のわずかに異なるオブジェクトクラスを追加するのではなく、オブジェクトを設定できるプロパティを優先します

より複雑なゲームでは、より高度な手法を使用できますが、基本的なOOPアプローチに慣れるまで(つまり、いくつかの完成したゲームを正常に作成するまで)使用しないことをお勧めします。より高度なアプローチには次のものがあります。

  • プロトタイプベースのオブジェクトモデル -すべてのゲームオブジェクトに単一のクラスを使用し、プロパティ/属性と構成を通じてすべてのオブジェクトをモデル化します。標準のOOPよりもはるかに柔軟/動的ですが、管理が難しくなります(特に、愚かなことをしてもコンパイラーはあまり役に立ちません)。私はこれを私の小さなローグライクゲームの暴君(https://github.com/mikera/tyrant)で効果的に使用しました
  • エンティティコンポーネントシステム -さまざまな種類のゲームオブジェクトで混合して一致させたい複雑な動作がたくさんある場合に適しています。非常に強力ですが、正しく理解するのは困難です。

0

エンティティとデータセットを整理するアプローチに使用できるいくつかの方法があります。スプレッドシートドキュメントを作成し、データを前後に移動して、効率がよいことを確認したいと思います。あなたが自分でゲームを作っているなら、それはあなたにとって意味をなす必要があることを覚えておいてください。時には、最も効率的な方法は、プロジェクトを単純にするために、コードの効率を少し低くすることです。

コンテンツの構造化についてさらにヘルプが必要な場合は、同様の構造またはスタイルを使用する古いゲームのソースコードを見つけて、その解決策を見つけてください。次に、それを改良し、好みに合わせて修正します。


これは、コードの編成に対処しておらず、ゲームが行った設計上の決定のトレードオフを理解する方法を説明せずに、他のゲームの処理を盲目的にコピーするよう提案しているためです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.