我怎么知道谁拥有某个指针



我正在写一个个人项目,让玩家从一副牌中抽牌。然后玩家激活卡牌(有不同类型的卡牌,每种卡牌都有不同的效果),最后他将卡牌放回牌组底部。

到目前为止,我已经设法从套牌中抽出卡片并将其存储在我的播放器中。假设我只有两种类型的卡:

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
}

。然后,deck 类(或任何人)可以在适当的玩家对象上调用上述方法,并在返回后将结果放回 deck 中。 鉴于上述情况,在卡牌对象上activate(*this);玩家对象调用是合理的(因为卡牌的激活逻辑可能需要以某种方式读取和/或更新玩家对象的状态)。

老实说,这是非常基于意见的。我可能会选择这样的事情,让player在游戏控制器指示take_turn()时负责玩自己的牌(本例中为循环)。

class card
{
public:
virtual void activate() {}
};
class deck
{
private:
std::queue<std::unique_ptr<card>> cards;
public:
std::unique_ptr<card> draw()
{
auto c = std::move(cards.front());
cards.pop();
return c;
}
void put_back(std::unique_ptr<card> c)
{
cards.push(std::move(c));
}
};
class player
{
private:
deck& cards;
std::list<std::unique_ptr<card>> hand;
std::unique_ptr<card> select_card()
{
// select the best card from the hand
// and return it
auto c = std::move(hand.front()); // something cleverer than this!
hand.pop_front();
return c;
}
public:
player(deck& cards): cards(cards) {}

void take_turn()
{
// draw a card from the deck
auto c = cards.draw();
hand.push_back(std::move(c));
// select the best card to activate
c = select_card();
c->activate();
// return card to deck
cards.put_back(std::move(c));
}
};
int main()
{
deck cards;
player wendy(cards);
player bob(cards);
while(true)
{
wendy.take_turn();
bob.take_turn();
}
}

相关内容

  • 没有找到相关文章

最新更新