如何根据这些说明加载一副牌? 13 C

时间:2018-02-28 09:05:43

标签: c

这些是我教授给我的C实验室指示

- 解决 -

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

您的程序必须具有以下命名的函数:

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

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

CheckDup()会收到试用号和卡片组作为输入,并返回一个布尔值。

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

LoadSuit()将通过套牌并使用类似于“LoadFace()”的方法将适当的套装值放入“套装”中,其中套装字符串为“HDCS”。

DealCards()将显示卡片。

**我的问题是,如果没有大量的if语句,如何检查每件套装中是否没有重复的面孔?请忽略我没有将“cardnum”作为参数发送到LoadFace和LoadSuit函数的事实,我也使用srand(1)进行调试。到目前为止,输出具有唯一的卡号和正确数量的面和套装(13,4),但我不知道如何从这里插入非重复元素。任何建议都会有所帮助。此外,不允许对数组进行简单的赋值和随机播放:( **

EDIT checkDup和LoadDeck目前正在加载具有唯一卡号的卡组,但不是唯一的卡面和套装。它只计算A面数2面3面国王面等。它还确保每个套装中有13张牌。我想在stuct数组中插入唯一的面和套装,这样我就不会说两个黑桃了。

#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

3 个答案:

答案 0 :(得分:2)

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

  

LoadFace()将通过套牌并输入适当的值   &#34;面部&#34;只使用&#34; cardnum&#34;模数算子   从字符串&#34; A23456789TJQK中提取值。&#34;

想象一下,您已经按照卡号的顺序列出了每张卡片。

 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放入两次,您就知道您的套牌将始终包含唯一的卡片。

答案 1 :(得分:0)

  

CheckDup将收到试用号和卡片组作为输入,并返回布尔值。

将转换为以下声明

bool CheckDup( const int trial, const struct singlecard deck[], const unsigned int deckSize );

如果deck卡尚未存在,则应检查trial(如果找到重复,则可能true),可能是通过迭代deck。 / p>

答案 2 :(得分:0)

这是我从你的问题中理解的。

你想知道,如果该卡已被发出,则使用checkDup()

您可以维护已发出的卡号的数组(或列出任何内容)。然后,每次调用checkDup时,只需搜索该数组。