结构数组中的C++设置元素 P>所以我的代码现在使用的是仿真堆栈来创建一副卡,因为我无法计算如何在C++中实现一个真正的堆栈。然后将这些牌洗牌,然后将该层分成两半,传递给两个玩家P1和P2。然后,允许用户查看p1的牌,这些牌的编号从1到26,用户可以选择1到26的数字来选择该牌并将其投入游戏
基本上,我需要有代码来遍历p1的卡,查看您选择的卡是否等于p1的卡堆栈中的一张卡,如果它们相等,那么我需要将该元素设置为NULL。 唯一的问题是p1的数组由字符和整数组成,因为它是一个结构数组。否则,将内容设置为NULL将不会是问题 在我得到您选择的等于NULL的特定元素之后,我必须将该NULL元素后面的所有元素向前推一个空格,类似于结构数组中的C++设置元素 P>所以我的代码现在使用的是仿真堆栈来创建一副卡,因为我无法计算如何在C++中实现一个真正的堆栈。然后将这些牌洗牌,然后将该层分成两半,传递给两个玩家P1和P2。然后,允许用户查看p1的牌,这些牌的编号从1到26,用户可以选择1到26的数字来选择该牌并将其投入游戏,c++,arrays,function,struct,null,C++,Arrays,Function,Struct,Null,基本上,我需要有代码来遍历p1的卡,查看您选择的卡是否等于p1的卡堆栈中的一张卡,如果它们相等,那么我需要将该元素设置为NULL。 唯一的问题是p1的数组由字符和整数组成,因为它是一个结构数组。否则,将内容设置为NULL将不会是问题 在我得到您选择的等于NULL的特定元素之后,我必须将该NULL元素后面的所有元素向前推一个空格,类似于 p1[x] = p1[x+1]; 下面是我的代码的开头,其中struct是,main是: struct Card{ char suit[10]; in
p1[x] = p1[x+1];
下面是我的代码的开头,其中struct是,main是:
struct Card{
char suit[10];
int number;
};
void playGame(Card p1[], Card p2[]);
void fillDeck(Card *deck);
void fillPlayerDeck(Card deck[], Card p1[], Card p2[]);
void printDeck(Card deck[], Card p1[], Card p2[]);
void shuffleDeck(Card *deck);
void throwCard(Card p1[], Card p2[], Card p1cardsThrown[], Card p2cardsThrown[]);
//string toString(Card p1[], Card p2[], Card p1New[], Card p2New[]);
int main (int argc, char *argv[]){
Card deck[52];
Card p1[26];
Card p2[26];
//Card p1New[26];
//Card p2New[26];
Card p1cardsThrown[26];
Card p2cardsThrown[26];
fillDeck(deck);
shuffleDeck(deck);
fillPlayerDeck(deck, p1, p2);
printDeck(deck, p1, p2);
throwCard(p1, p2, p1cardsThrown, p2cardsThrown);
//playGame(p1, p2, p1cardsThrown, p2cardsThrown);
}
下面是问题代码,我的throwCard函数:
void throwCard(Card p1[], Card p2[], Card p1cardsThrown[], Card p2cardsThrown[]){
printf("\nWhich of your cards would you like to play?\n");
int i = 0;
for(i; i < 26; i++){
printf("%d: %d of %s\n", i, p1[i].number, p1[i].suit);
}
int cardNumber;
cin >> cardNumber;
printf("You chose %d: the %d of %s!", cardNumber, p1[cardNumber].number, p1[cardNumber].suit);
//HERE IS WHERE THE PROBLEM IS ACTUALLY HAPPENING
//check which card was thrown, then move that card out of array
for(int x = 0; x<26; x++){
if(p1[cardNumber].number = p1[x].number){
if(p1[cardNumber].suit = p1[x].suit){
p1[cardNumber].number = NULL;
p1[cardNumber].suit = NULL;
for(int y = x; y < 26; y++){
if(p1[y].number = NULL){
if(p1[y].suit = NULL){
p1[y] = p1[y + 1];
printf("This is P1's new deck");
printf("%d: %d of %s\n", x, p1[x].number, p1[x].suit);
}
}
}
}
}
}
}
在本部分:
if(p1[y].suit = NULL)
您应该比较,而不是分配:
if(p1[y].suit == NULL)
现在,关于C++98文档中的作业:
空指针常量是一个整型常量表达式
计算结果为零,例如0或0L
默认情况下,它是一个void*指针,但如果需要,可以将其转换为int。比如:
p1[cardNumber].number = (int) NULL;
这与分配给0相同:
p1[cardNumber].number = 0;
现在,这一条毫无意义:
p1[cardNumber].suit = NULL;
您正在为字符集[10]的向量赋值NULL。您可以像我前面讨论的那样,通过强制转换将每个向量位置指定为0或NULL,或者根据需要使用指针和alloc。如果您使用:
struct Card{
char *suit;
int number;
};
这将在以下情况下生效:
p1[cardNumber].suit = NULL;
作为奖励,您可以节省一些内存!你只需将西装的字符串指针分配给卡片,瞧,一切都正常。这里有一些问题。让我们从if语句开始:
if(p1[cardNumber].number = p1[x].number)
if(p1[cardNumber].suit = p1[x].suit)
if(p1[y].number = NULL)
if(p1[y].suit = NULL)
这些都是作业。您希望使用==,来比较值,而不是=,这将分配给它们:
if(p1[cardNumber].number == p1[x].number)
if(p1[cardNumber].suit == p1[x].suit)
if(p1[y].number == NULL)
if(p1[y].suit == NULL)
NULL用于指针。char[10]和int都是非指针,因此将NULL赋值给它们是无效的,也没有意义。NULL也是0的宏,如果您有C++11,则应该使用nullptr
在我看来,理想的解决方案是更改您的卡结构,如果稍微检查一下:
enum class Suit //declare an enum to represent suit type
{
Invalid,
Spades,
Hearts,
Clubs,
Diamonds
}
struct Card
{
Suit suit_value;
int card_value;
Card() : suit_value(Suit::Invalid), card_value(0) {}
};
及
我没有仔细查看您的代码,甚至可能没有必要使用无效选项。Suit的enum肯定是一个不错的选择。如果你在if中做赋值,那么当你应该做一个比较时,当你应该只赋值0时,你尝试赋值NULL。NULL表示指针,0表示数值。如果您声明一个变量int i=0但int*i=NULL。此外,如果你需要一个栈的现成实现,用C++你可以使用STD::StUng.使用一个像向量一样的标准容器,一旦找到卡片,就将其从向量中删除。我想如果我有p1[cardNumber].number=0,那么我可以在if语句中检查它是真是假,所以是的,这部分工作正常。我只是想与p1[cardNumber].number=0一起使用;我必须做p1[cardNumber].suit=;也可以,但我可以检查数字条件。谢谢几乎正确,但您有一些误解和术语问题。首先,C++中的向量是定义好的,意味着别的东西。事实上,不要把STD::向量定义为一个定义良好的、语言无关的向量,但不要把它与STD::数组错误!
enum class Suit //declare an enum to represent suit type
{
Invalid,
Spades,
Hearts,
Clubs,
Diamonds
}
struct Card
{
Suit suit_value;
int card_value;
Card() : suit_value(Suit::Invalid), card_value(0) {}
};
if(p1[y].number == 0)// have -1 or 0 be an invalid number
if(p1[y].suit = Suit::Invalid)// check for invalid suit