3

私の目標は、(非常に単純な) 戦略ゲームを実装することです。

とりあえず、マップと 2 人のキャラクターから始めて (地形の影響が異なるようにしたい)、パスファインディングを試してみます。

問題は、オブジェクト指向設計の経験がほとんど、またはまったくないことです。以前に C++ クラスを使用したことがありますが、それは非常に簡単でした。たとえば、AStar メソッドを使用して、セットの配列を使用して実装されたクラス Graph です。「複数のプレイヤー」という概念は考えていませんでした。

次の要素/クラスを考えました: ゲーム、マップ、およびキャラクター。最終的にはパスファインダークラス。

最初の質問: キャラクターの位置は、ゲームが知っておくべきことですか? 地図?それとも各キャラ?

(私はゲームがすべきだと思います)

2 番目の質問: 「findPath」メソッドに適しているのはどこですか?

  • ゲーム?

  • 経路探索アルゴリズムは Map のメソッドであるべきですか? map.findPath(character, srcpos, dstpos) のようなもの

  • キャラクタークラスで?character1.findPath(map, srcpos, dstpos) を実行する方が理にかなっています

  • Pathfinder クラスを追加した場合、最短パスを決定するためにマップの独自の表現を作成する必要があります。その前に、地形が各プレイヤーにどのように影響するかをマップに「尋ねる」必要があります。

(私は後者の方が好きです)

適用する補助構造の構築 (およびマップへの要求) のようです。たとえば、A* は避けられないものです。

4

2 に答える 2

2

オブジェクト指向にすることはゴールではなく、理にかなっている場合に使用するツールです。C++ は多くの機能を備えた言語であり、簡単に夢中になれるものです。そのため、私のアドバイスは、物事をシンプルかつ簡単にすることです。

これは、データとロジックを密にまとめたり、完全に分離したりすることを意味します。

最初の質問: 私の最初の反応は、キャラクターは自分の位置を知っているべきだということです。しかし、それをデータでどのように表現するかは、それをどのように使用するかによって異なります。したがって、ゲーム、キャラクター、そして場合によってはマップの両方が、キャラクターがどこにいるかを知る必要があります。

2 番目の質問: Map クラスが何であるかによって異なります。プログラムの残りの部分に公開される必要な機能を備えたマップ自体を表すオブジェクトですか、それともマップの単純なデータ表現で機能する関数のツールボックスですか?

Map クラスがマップを表す場合、Pathfinder クラスがマップ上で動作するために必要な機能を公開する必要があります (パスファインディング アルゴリズムには、マップから派生した追加のデータが必要です。これは一時的なものであったり、永続的なものである可能性があります)。

Map クラスがマップを表していない場合は、パスファインディング機能を配置できます。その場合はそこに属すると思います。パスファインディング コードが原因で Map クラスが大きくなりすぎる場合は、それを独自のクラスに分割する必要があります。

于 2012-11-28T18:04:41.587 に答える
1

最初の質問:キャラクターの位置は、私にとってキャラクター自体の一部である必要があります(このように意味があります)。

2番目の質問:パスを論理的に見つけることは、マップの一部にすることはできません。次に、 OOPの原則の1つ、つまり単一責任に違反することになります。

私によると、PathFinderクラスを作成する必要があります。あなたはそれをこのように設計することができます

class PathFinder{
      PathFinderAlgorithm algorithm;
      //other required values according to your design

      Path findPath(){
          algorithm.apply();
      }

      //other required methods according to your design

}

PathFinderAlgorithmインターフェースです。これを使用して、パスを見つけるために使用しているアルゴリズムを変更することもできます。将来、最長のパスを見つける必要がある場合と同様に、あなたがしなければならないのは、最長のパスを見つけてPathFinderクラスで置き換える別のクラスを作成することだけです。

于 2012-11-29T09:33:47.857 に答える