我正在编写一个个人项目,让玩家从牌组中抽牌。然后,玩家激活纸牌(有不同类型的纸牌,每种纸牌具有不同的效果),最后,他将纸牌放回甲板的底部。
到目前为止,我已经设法从卡组中抽出卡并将其存储在播放器中。假设我只有两种类型的卡:
class card
{
public:
virtual void activate() = 0;
};
class moveAnywhere : public card
{
public:
virtual void activate();
};
class bonusQuestion : public card
{
public:
virtual void activate();
};
然后我有我的套牌(玩家是朋友):
class deck
{
private:
std::queue<std::unique_ptr<card>> cards;
public:
friend class player;
};
最后是我的播放器:
class player
{
private:
std::list<std::unique_ptr<card>> usableCards;
public:
void drawCard(deck&);
};
void player::drawCard(deck& theDeck)
{
usableCards.push_back(std::unique_ptr<card>(std::move(theDeck.cards.front())));
theDeck.cards.pop();
}
这样,我设法从卡组中取出第一张卡,并将其存储在玩家的手中。但是我的问题是如何激活卡并将卡退还给卡组。
1)最好使用
card::activate(player&)
,以便我知道谁激活了这张卡(由于这张卡属于玩家,所以看起来很奇怪,因此不需要指定它)。2)最好在卡中添加一个私人成员,例如
player owner;
,并且每次有人抓到卡片时,都会为卡片分配所有者。3)或如何从播放器内部激活卡,并在卡的效果中使用该播放器。
4)将卡片退回卡座的逻辑方式是什么?那应该是发牌,玩家,套牌的方法吗?
我相信我使情况变得过于复杂,我只是感到困惑,需要向正确的方向稍作努力。
最佳答案
根据现实的直觉,当真人纸牌玩家需要将牌退还给副牌时,通常会要求牌手将牌打出然后再放回副牌中(与更常见的情况相反)卡在没有玩家参与的情况下将自己放回卡组中-通常留给魔术使用:))
因此,我将采用类似以下内容:
std::unique_ptr<card> player :: activateAndReturnCard()
{
// code for the player-object to choose a card to
// remove from his hand, activate it, and then return it
}
...然后,套牌类(或任何人)可以在适当的播放器对象上调用上述方法,并将结果返回到套牌中。鉴于以上所述,在卡对象上进行玩家对象调用
activate(*this);
是合理的(因为卡的激活逻辑可能需要以某种方式读取和/或更新玩家对象的状态)。关于c++ - 我怎么知道谁拥有某些指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55348205/