如何检查数组中的索引是否为空以及如何移动数组

时间:2015-09-08 16:13:22

标签: c++ arrays function sorting

我有Go Fish Card游戏的这个功能。

//从玩家的手中取出一张卡

// In:_index要从数组中删除的卡的索引

// _discard在

中存储该值的引用

// //返回:如果实际存储了该索引的卡,则为真。

//如果索引为"为空"

,则为false
bool Player::Discard(int _index, Card& _discard)
{
        return true;
}

应将请求的卡存储到传入的引用中。 在那之后,"转移"数组回来显示此卡已被删除。

实施例: [7♥3♣5♦9♥] m_numCards:4

  • 丢弃指数1(3♣)*

[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;

4 个答案:

答案 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::vectorstd::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
    }
}