我正在用C ++写一个纸牌游戏。我有一个播放器类,它处理动作(即选择要放置的牌)。如果播放器是人类,它将使用 GUI类,如果它是计算机,它将使用 AI类。
为了让AI课程做出决定,它需要了解游戏过程中每个玩家变化的一些事情,例如手头的牌数。现在我在AI类的向量中存储每个玩家的玩家指针。
然而,这导致了我的问题,AI类需要#include Player类,而玩家类需要#include AI类。
也许解决方案不是如何处理#includes,而是构建类的更好方法?
答案 0 :(得分:1)
我猜玩家和AI类都有这种纸牌游戏的常用方法(获得卡,放卡,随机播放,下注,全部...),这些方法可以从基类继承 CardPlayer 或者在运行时使用接口编写(参见Strategy Pattern)。
要将Human Player类与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位。我花了一些时间来适应这个(我仍然继续学习),但我无法抗拒它的强大力量。
答案 1 :(得分:0)
有时,为了使用它,没有必要包含类的标题。例如,如果您只使用指针或类的引用,则可以向前声明它:而不是
#include "player.h"
class AI
{
std::vector<player *> pl;
};
你可以写
class player;
class AI
{
std::vector<player *> pl;
};