0

私は大学のコースの課題をやっていますが、私と私のパートナーは問題を抱えています。私たちが作っているプログラムはゲームです。

Creature と呼ばれる基本クラスから継承するいくつかのクラスがあります。これらはすべて、プレイヤーが対処する必要がある敵であり、すべて独自の AI を実行します。4 つの異なるタイプの子クラスがあり、すべて名前空間 Creature(親、Creature を含む) 内にあり、1 つのクラスだけが必要とする特別な機能を持っています。このクラスはバニーと呼ばれます。

今、私の仕事は、必要に応じて AI 関数を呼び出すことです。問題は、私がどのクラスを呼び出しているかを常に知っているとは限らないことです。そのため、ゲームボードにどのクリーチャーを取得するかを教えてもらうように依頼するときです。

すべての敵は、ゲーム ボードの四角形に次のようにポインターとして保存されます。

    struct Square
    {   
        // Pointers to Morso class, where the enemy is saved
        Creature::Creature* creature;
        //Undeeded stuff removed

    };

特別な機能にアクセスする必要があるまでは、これで問題ありません。ププは特定の条件を満たすと増殖します。そのため、Pupu では、正しく動作することを確認するために呼び出す必要がある関数はほとんどありません。

しかし、ここで問題が発生します。

ボード クラスを呼び出して、指定した座標にあるクリーチャーを取得します。

void GameEngine::GameEngine::runAI()
{
    Creature::Creature* creature= NULL;

    for(unsigned int y = 0; y < dimY; y++)
    {
        for(unsigned int x = 0; x < dimX; x++)
        {
            Coordinate target;

            target.setX(x);
            target.setY(y);

            creature= board_->returnCreature(target);

            //If there is a creature in the target, run its AI
            if(creature!= NULL)
            {

                //If it is, check special procedures
                if(creature->returnType() == "bunny")
                {
                    bunnyReproduce(creature);
                }

                creature->ai();
            }

        }//for x

    }//for y
}

今、 :

void GameEngine::GameEngine::bunnyReproduce(Ccreature::Creature* creature)
{

//Checks that it really is a bunny
if( creature->returnType() != "bunny"){ return; }

//Check is there another bunny near
creature->checkForMate();


}

問題は、クリーチャーがこの時点で、Bunny の public メンバーである checkForMate を呼び出すことができないが、Creature を呼び出すことができないことです。仮想機能をクリーチャーにする必要がありますか?

checkForMate を Creature::Bunny にしようとしましたが、元の値が Creature クラスなので、できません。Creature クラスで空の仮想関数を作成し、それを Bunnyclass でオーバーライドする必要がありますか?

QT 5.0.2 で Qt Creator 2.7.0 を実行しています。

4

2 に答える 2

3

仮想関数reproduceCreatureクラスに追加Bunnyして、または後でゲームに追加する可能性のある他のクリーチャーに実装する必要があります。あらゆる生物が独自の方法で自己複製できるように。この場合、クリーチャー タイプを確認する必要さえありません。再現性のない生き物がいる場合は、reproduce何もしない空のメソッドとして実装するだけです。

于 2013-04-25T10:54:47.023 に答える
1

理想的には、エンジンは、どの種類のクリーチャーを操作しているかを気にする必要がまったくないはずです。

バニーが各ステップで再生するようにしたい場合は、バニーai()でそれを実行してみませんai()か?
結局のところ、万能の外部エンジンではなく、いつ繁殖するかを決定するのはバニーの責任ではないでしょうか?

void Creature::Bunny::ai()
{
    if (niceMateNearby())
        reproduce();
    else
        eatCarrotsAndJumpAround();
}
于 2013-04-25T11:18:09.377 に答える