我有Go Fish Card游戏的这个功能。
//从玩家的手中取出一张卡
// In:_index要从数组中删除的卡的索引
// _discard在
中存储该值的引用// //返回:如果实际存储了该索引的卡,则为真。
//如果索引为"为空"
,则为falsebool Player::Discard(int _index, Card& _discard)
{
return true;
}
应将请求的卡存储到传入的引用中。 在那之后,"转移"数组回来显示此卡已被删除。
实施例: [7♥3♣5♦9♥] m_numCards:4
[7♥5♦9♥9♥] m_numCards:3
即使它看起来有两个9♥,我们也不会向用户显示它,如果第一个被覆盖,它将被覆盖 另一张牌被添加到手中。 ** /
//在这里进行编译
我有这个成员变量。
char m_name[32];
Card m_hand[7];
int m_numCards;
int m_maxCards;
int m_score;
我有这个内部做第一部分但我很确定我错过了什么。
if (m_hand[_index] != FALSE)
{
_discard = m_hand[_index];
return true;
}
else
return false;
答案 0 :(得分:1)
如果你定义了"手"作为一个数组:
Card m_hand[7];
然后你总是有7张牌。当然你可以添加一个" sentinel" Card
价值或其他东西,但实际上总有7张牌。您无法删除或附加到原始数组。另一方面,如果您使用动态容器:
std::vector<Card> m_hand;
现在,你可以拥有一个可变大小的牌,并根据你的需要添加和删除牌。您的丢弃功能变得简单:
bool Player::Discard(int _index, Card& _discard)
{
if (m_hand.size() > _index) {
_discard = m_hand[_index];
m_hand.erase(m_hand.begin() + _index);
return true;
}
else {
return false;
}
}
虽然使用Go Fish,按价值丢弃卡片可能更有意义:
bool Player::Discard(Card const& card)
{
size_t cur = m_hand.size();
m_hand.erase(std::remove(m_hand.begin(), m_hand.end(), card), m_hand.end());
return m_hand.size() != cur;
}
答案 1 :(得分:0)
标准套牌中有52张牌,无符号字符可以代表超过52种不同的值。
将零指定为“无卡”值,并使用值1 - 52表示卡。不要从阵列中移除卡然后重新排列,只需用零覆盖要擦除的值。
将卡添加到数组时,迭代直到找到值为零的索引。
答案 2 :(得分:0)
好的,所以我想出来了
bool Player::Discard(int _index, Card& _discard)
{
if (_index < m_numCards)
{
_discard = m_hand[_index];
for (int i = _index + 1; i < m_numCards; ++i)
{
m_hand[i - 1] = m_hand[i];
}
m_numCards -= 1;
return true;
}
else
return false;
}
答案 3 :(得分:-1)
尽管这可能是家庭作业,但您应该在std::vector
或std::list
等对象中使用内置方法。如果您确实想要使用数组,可以通过将所有元素移动到之后 要删除的元素来删除元素。它看起来像这样:
for (int i = 0; i < cardsLength; i ++) {
if (cards[i] == theCardYouWantToDelete) {
for (int j = i; j < cardsLength - 1; j ++) {
cards[j] = cards[j + 1];
}
break; // to break out of outer for loop
}
}