我正在为大学的课程做作业,我和我的搭档有问题。我们正在制作的程序是一个游戏。
我们有几个类,它们都是从基类继承的,称为生物。这些都是玩家需要对付的敌人,他们都有自己的人工智能。有4种不同类型的子类,都在命名空间生物(包括父类、生物类)中,其中一个类只有它需要的特殊功能。这门课叫兔子。
现在,我的工作是根据需要调用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();
}问题是,在这一点上,生物不能调用checkForMate,它是兔子的公共成员,而不是生物。我们需要把虚拟功能变成生物吗?
我试着把checkForMate变成了生物::兔子,但是由于我尝试给它的原始值是生物类,所以我不能这样做。我们是否需要在生物类中创建一个空虚拟函数,然后重写它,Bunnyclass?
我使用QT5.0.2运行2.7.0。
发布于 2013-04-25 10:54:47
您应该将virtual函数reproduce添加到Creature类中,并在Bunny或以后添加到游戏中的任何其他生物中实现它。这样任何生物都会以自己的方式繁殖。在这种情况下,你甚至不需要检查生物类型。因为如果您有一些不可复制的生物,那么您只需将reproduce实现为空方法,就什么也不做了。
发布于 2013-04-25 11:18:09
理想情况下,你的引擎根本不需要关心它使用的是哪种生物。
如果你想让兔子在ai()的每一步上复制,为什么不在兔子的ai()上做呢?
毕竟,决定何时繁殖不是兔子的责任吗,而不是某种强大的外部引擎?
void Creature::Bunny::ai()
{
if (niceMateNearby())
reproduce();
else
eatCarrotsAndJumpAround();
}https://stackoverflow.com/questions/16212307
复制相似问题