所以我的代码现在做的是它使用模拟堆栈创建一副牌(因为我无法弄清楚如何在c ++中实现真正的堆栈)。然后洗牌,然后拆分牌组一半,并传递给两个球员,ax.outline_patch.set_visible(False)
ax.background_patch.set_visible(False)
和p1
。然后允许用户查看p2
的卡片,其编号从1到26,并且用户可以选择1到26的数字来选择该卡并将其用于播放。
我基本上必须拥有通过p1
卡的代码,看看你选择的卡是否等于p1
的卡片中的卡片,如果它们相等,那么我需要将该元素设置为NULL。
唯一的问题是p1
的数组由字符和整数组成,因为它是一个结构数组。否则,将事物设置为NULL不会有问题。
在我得到你选择的特定元素等于NULL之后,我必须将所有元素推到那个NULL元素之后,一个空格向前,所以像
p1
以下是我的代码的开头,其中struct是main,其中main是:
p1[x] = p1[x+1];
这是问题代码,我的throwCard函数:
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);
}
以下是我收到的确切错误:
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);
}
}
}
}
}
}
}
答案 0 :(得分:2)
这里有一些问题。让我们从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
也只是nullptr
的一个宏,如果你有C ++ 11,Card
就是你应该使用的。
在我看来,理想的解决方案是改变你的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
和
enum
我没有仔细查看您的代码,而且有无效选项甚至没有意义。 Suit
的{{1}}绝对是可行的方法。
答案 1 :(得分:0)
在这一部分:
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;
您正在为字符向量(char suit[10]
)分配NULL。您可以将每个向量位置分配给0(或者如前所述,使用强制转换为NULL),或者使用指针,并根据需要进行分配。如果您使用:
struct Card{
char *suit;
int number;
};
这变得有效:
p1[cardNumber].suit = NULL;
作为奖励,你节省了一些记忆!你可以将套装的字符串指针分配给卡片,瞧,一切正常。