gpt4 book ai didi

c - 如何根据这些说明加载一副纸牌? C

转载 作者:行者123 更新时间:2023-11-30 20:53:23 26 4
gpt4 key购买 nike

这些是我的教授给我的关于 C 实验室的说明

--已解决--

struct singlecard
{
int cardnum;
char face;
char suit;
};

您的程序必须具有如下所示的函数:

Main() - 调用“LoadDeck()”和“DealCards()”。

LoadDeck() 将仅用 1 到 52 之间的唯一数字填充数组的“cardnum”。它将通过选择一个随机数字,然后调用函数“CheckDup()”来查看该数字是否是重复的。然后它将调用“LoadFace()”和“LoadSuit()”。

CheckDup() 将接收试用号和牌组作为输入,并返回一个 bool 值。

LoadFace() 将遍历牌组,并通过仅使用“cardnum”模数运算符从字符串“A23456789TJQK”中提取值,将适当的值放入数组的“face”中。

LoadSuit() 将遍历牌组,并使用类似于“LoadFace()”的方法将适当的花色值放入“suit”中,其中花色字符串为“HDCS”。

DealCards() 将显示卡片。

**我的问题是,如何在没有大量 if 语句的情况下检查每个花色中没有重复的面孔?请忽略我没有将“cardnum”作为参数发送给函数 LoadFace 和 LoadSuit 的事实,而且我还使用 srand(1) 进行调试。到目前为止,输出具有唯一的卡号以及正确数量的面和花色(13, 4),但我不确定如何从这里插入不重复的元素。任何建议都会有帮助。另外,不允许对数组进行简单的分配和洗牌:( **

编辑 checkDup 和 LoadDeck 当前使用唯一的卡号加载牌组,但不是唯一的牌面和花色。它只计算 A 面、2 面、3 面、K 面等的数量。它还确保每个花色中有 13 张牌。我想将独特的面孔和花色插入到结构数组中,这样我就没有黑桃的两个 7。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>


struct singlecard {
int cardnum;
char face;
char suit;
};


int i, deckSize = 52;
char suits[] = {"HDCS"};
char faces[] = {"A23456789TJQK"};


void DealCards(struct singlecard Deck[]) {

//SortCards();
printf("\n\n");
for (i = 0; i < deckSize; i++) {
if ((i + 1) % 4 == 0) {
printf("[%d %c-%c] %d\n", Deck[i].cardnum, Deck[i].face, Deck[i].suit, i + 1);
} else {
printf("[%d %c-%c] ", Deck[i].cardnum, Deck[i].face, Deck[i].suit);
}
}

}

int CheckDupe(struct singlecard Deck[],int n) {

int check = 0, j;
for (j = 0; j < deckSize; j++) {
if (n == Deck[j].cardnum || n == 0) {
return check = 1;
}

}
return check;

}

void LoadSuit(struct singlecard Deck[],int n)
{
Deck[i].suit = suits[(n-1) % 4];
}

void LoadFace(struct singlecard Deck[],int n) {

Deck[i].face = faces[(n-1) % 13];

}
void LoadDeck(struct singlecard Deck[]){

srand(time(NULL));

for (i = 0; i < deckSize;) {
int random_number = rand() % 53;
if (CheckDupe(Deck,random_number) == 0) {

Deck[i].cardnum = random_number;
LoadFace(Deck,Deck[i].cardnum);
LoadSuit(Deck,Deck[i].cardnum);
i++;
}
}
}

int main(){
struct singlecard Deck[52];
LoadDeck(Deck);
DealCards(Deck);
return 0;
}

电流输出

[5 5-H] [36 T-S] [6 6-D] [29 3-H]  4
[12 Q-S] [19 6-C] [25 Q-H] [13 K-H] 8
[42 3-D] [38 Q-D] [14 A-D] [22 9-D] 12
[16 3-S] [40 A-S] [51 Q-C] [35 9-C] 16
[24 J-S] [4 4-S] [20 7-S] [43 4-C] 20
[31 5-C] [9 9-H] [11 J-C] [48 9-S] 24
[49 T-H] [18 5-D] [41 2-H] [21 8-H] 28
[50 J-D] [52 K-S] [3 3-C] [27 A-C] 32
[39 K-C] [8 8-S] [33 7-H] [23 T-C] 36
[44 5-S] [17 4-H] [32 6-S] [45 6-H] 40
[30 4-D] [28 2-S] [2 2-D] [7 7-C] 44
[26 K-D] [34 8-D] [15 2-C] [47 8-C] 48
[10 T-D] [37 J-H] [1 A-H] [46 7-D] 52

最佳答案

您面临的问题是因为您没有正确阅读并遵循作业说明,尤其是这一点:

LoadFace() will go through the deck and put the appropriate value in "face" of the array by using just the "cardnum" the modulus operator to extract the value from the string "A23456789TJQK."

假设您已经按照卡号的顺序列出了每张卡。

 1. Ace of Hearts
2. Two of Hearts
....
14. Ace of Diamonds
15. Two of Diamonds

你注意到一个模式了吗?每 13 张牌都有相同的面。模运算符(又名 %)可用于找出这 13 个面中的哪一个与 cardnum 的特定值相关,就像这样。 cardnum % 13 始终在 0 到 12 之间。因为您的第一张卡从 1 开始,所以在获取模数之前需要先减去 1。您的 LoadFace 函数将变成这样。

void LoadFace() {
for (i = 0; i < deckSize;) {
Deck[i].face = faces[(Deck[i].cardnum-1) % 13];
}
}

如果您想根据两张牌的 cardnum 知道两张牌是否具有相同的面,您只需比较 Deck[a].cardnum % 13Deck [b].cardnum % 13.

只要您不将相同的cardnum放入两次,您就知道您的牌组将始终包含唯一的牌。

关于c - 如何根据这些说明加载一副纸牌? C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49025652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com