我正在用C++写一个纸牌游戏。我有一个玩家类,它处理操作(即选择一张要放置的卡片)。如果玩家是人类,它将使用GUI类,如果是计算机,则使用AI类。
为了让AI类做出决定,它需要了解每个玩家在游戏中的变化情况,例如手上的牌数。现在,我在AI类的向量中为每个玩家存储一个播放器指针。
然而,这导致了我的问题,AI类需要#包括Player类,而player类需要#包含AI类。
也许解决方案不是如何处理#include,而是构建类的更好的方法?
发布于 2014-02-03 19:20:18
我想玩家和AI类对于那个纸牌游戏都有共同的方法(得到牌,放牌,洗牌,下注,全部都在.)它可以从基类CardPlayer继承,也可以在运行时使用接口进行组合(参见战略模式)。
要将Human类与GUI接口,请创建一个合适的界面,例如:
typedef struct PlayerInfoStruct {
---player info variables here---
};
class IGUIPlayer {
virtual PlayerInfoStruct GetPlayerInfo(...) = 0;
---other methods exclusive to the GUI-player interaction here---
};并在继承它的HumanPlayer中实现该接口:
class HumanPlayer : public CardPlayer, public IGUIPlayer {
PlayerInfoStruct GetPlayerInfo() {---method---}
---other methods here---
}在您的GUI中,您使用它的界面指向每个人类玩家:
---somewhere in your GUI Class---
IGUIPlayer* humanplayer1 = <pointer to HumanPlayer>;在这种情况下,GUI类依赖于IGUIPlayer。HumanPlayer同时依赖于IGUIPlayer和CardPlayer。AIPlayer只依赖于CardPlayer。不要循环的东西!
使用界面意味着,您可以随时在GUI中提供AI玩家的信息,只需将IGUIPlayer继承到AIPlayer并实现纯虚拟方法,而无需修改GUI。我花了一些时间才习惯了这一点(我还在继续学习),但我无法抗拒它的潜移默化。
发布于 2014-02-03 18:53:02
有时,为了使用类,不需要包含类的标头。例如,如果只使用指针或对类的引用,则可以转发-声明它:而不是
#include "player.h"
class AI
{
std::vector<player *> pl;
};你可以写
class player;
class AI
{
std::vector<player *> pl;
};https://stackoverflow.com/questions/21535239
复制相似问题