私は大学のコースの課題をやっていますが、私と私のパートナーは問題を抱えています。私たちが作っているプログラムはゲームです。
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 を実行しています。