![](/img/trans.png)
[英]How do I check whether an index of array is empty and then, if it is, skip to the next?
[英]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
[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::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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.