繁体   English   中英

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

[英]How can I check if a index in an array is empty and how to shift an array

我具有Go Fish Card游戏的此功能。

//从玩家手中取出卡

// In:_index要从阵列中删除的卡的索引

// _discard将该值存储在的引用

// //返回:如果在该索引处实际存储有卡,则为True。

//如果索引为“空”,则为False

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

应该将请求的卡存储到传递的引用中。此后,将阵列“移回”以显示该卡已被移除。

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

  • 丢弃索引1(3♣)*

[7♥5♦9♥9♥] m_num卡数:3

  • 即使看起来有两个9♥,我们也不会向用户显示该数字。如果将另一张卡添加到手上,它将是第一个被覆盖的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;

如果将“手”定义为数组:

Card m_hand[7];

那么您总是有7张卡。 当然,您可以添加“前哨” 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;
}

一个标准牌组中有52张卡片,一个未签名的char可以代表52个以上的不同值。

将零指定为“无牌”值,并使用值1-52表示牌。 无需从阵列中取出卡然后重新排列,只需将要擦除的值覆盖为零即可。

将卡添加到阵列时,进行迭代,直到找到值为零的索引。

好,所以我想通了

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;

   }

即使这可能是家庭作业,您也应该在诸如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
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM