1

問題の背景

私は基本的な戦艦のようなスピンオフ ゲームに取り組んでおり、C++ (グラフィックなし) で時間をかけて機能を追加し続けたいと考えています。現在、私はchar 型の 2D ベクトル ( GameBoardと呼ばれる) で表される 50 x 75 のゲーム ボードを持っています。ゲーム ボードを作成し、各場所を「.」で設定します。文字。座標を推測すると、以前に推測した場所は「-」でマークされ、ヒットした場所は「X」でマークされます


私はプログラムでどこにいますか

ゲームを変更して、さらにいくつかの機能を有効にすることにしました。それほど進んでいるわけではありませんが、疑似コードで設計をスケッチすることで、このアップグレードをどのように進めることができるかについてもっと考えるようになりました。

GameBoardを charにする代わりに、Block (ボード上の空きスペース)というクラスを作成します。このクラスには、正しい char を視覚的に表示するための char 変数と共に、ax および y 座標変数が含まれるようになります。ブロックには、「機能」の派生クラスに分割されるオブジェクト「機能」を保持する機能があります。これらのクラスの詳細については、一番下までスクロールできます。

これは私のクラス階層ツリーがどのようになるかです:

                             feature 
                    item               vehicle
               gold     nuke                 plane

助けが必要なこと

私は基本的に、やりたいことのアウトライン/構造のセットアップを持っています。今、すべてを接続するためにキックスタートの助けが必要です. ポインターをいつ、どのように使用するかを決定するのはかなり苦手です。

A.) Blockクラスのポインターを保持するようにGameBoardを変更する必要がありますか? それとも実際の ブロックオブジェクトですか? - また、BlockはFeatureまたは実際のFeatureオブジェクトへのポインターを保持しますか?

B.)空にすることも、値を指定することもできるFeature変数を追加するにはどうすればよいですか? NULLに設定するだけですか?

C.) BlockのFeature値を交換するには、カスタム コピー コンストラクターが必要ですか?

D.)プレイヤーがフィーチャー オブジェクトを使用している場合、ブロックからフィーチャーオブジェクトを削除するにはどうすればよいですか?

E.) 場合によっては、1つのブロックに複数の機能が存在することがありますか?

F.) BlockがFeatureを保持でき、Featureが既に別のクラスから派生しているように、Block クラスと Feature クラスを宣言するにはどうすればよいですか (この投稿には含まれてませ) 。


私のクラスに関する追加の詳細

したがって、GameBoard はブロックを格納するベクトルです。ブロックは基本的に、ボード上の個々のスペースです。ブロックには、その位置の座標、それを表す char、およびFeatureオブジェクトを保持する可能性が含まれていますが、ほとんどの場合、ブロックは機能を保持していません。機能はブロックから派生し、ゲーム内のボーナス報酬として機能します。そのため、Featureはさらに 2 つの派生クラス、Item Feature または Vehicle に分岐します等々。

プレイヤーが座標を選択すると、メソッドは GameBoard 上/内のそのブロックに移動し、最初に char 値が以前に使用されたことのない有効な空間を表しているかどうかを確認します。次に、この Block for Feature の内容をチェックします。Feature は空であるか、派生した Feature オブジェクトを含んでいる可能性があります。

これで私の小説は終わりです。いろいろ書いてすみません。助けを得る最善の方法は、ヘルパーに何が起こっているかを知らせることだと思います。「要点をつかめ」と言って返信しないでください。私は知っています.. 詳細が不足している場合はお知らせください。ありがとう!

4

3 に答える 3

0

GameBoard が GameObject ポインターのコンテナーであるというのは良い考えだと思います。まったく新しいクラスを作成してそれを Block と呼ぶ必要はありません。これはすべて暗示されています。ブロックは順番に配置されているため、ブロックの座標を追跡する必要もありません。ゲームオブジェクトは、ゲーム要素の階層の基本クラスになります。あなたの場合、それは機能になります。私がゲームオブジェクトを使用した理由は、機能があまり説明的ではないためです。用語は範囲が広すぎます。

ゲームが開始されると、GameBoard にヌル ポインターを設定できます。ヌル ポインターは、作成されてボードに追加される実際のゲーム要素に置き換えられます。

データを動的に割り当てた場合にのみ、コピー コンストラクターと代入演算子を実装する必要があります。そうでない場合、コンパイラは生のオブジェクトのコピーを行う完全に適切なバージョンを生成します。

そうは言っても、実際のオブジェクト インスタンスを移動しない方がよいでしょう。代わりにポインターを使用する提案された方法を使用すると、ポインターのみを移動することになり、はるかに簡単で高速になります。

機能を削除する場合は、実際のオブジェクトを削除し、ボード内のポインターを null に設定します。

親子関係を実装すると、各ブロックにゲームオブジェクトのツリーを作成でき、そのツリーを再帰的にトラバースして、ツリー要素を好きなように操作できます。

適切に設計されたポリモーフィック階層では、基本クラスから派生したものである限り、ほとんど何でも配置できます。

于 2013-04-05T01:58:37.197 に答える