洗牌一副牌,不知怎的崩溃?

时间:2015-12-18 03:10:27

标签: c shuffle

所以我已经相当远了一个项目我正在制作,它基本上它写在甲板上的所有卡(工作正常)但当我试图洗牌他们,它崩溃,我真的不知道什么是错的它,因为它洗牌了一些牌(比如3),然后崩溃了。 另外,到现在为止,我只为12张牌做过,有没有简单的方法。

到目前为止,这是我的代码

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

#define ACE 14
#define JACK 11
#define QUEEN 12
#define KING 13

int main()

{
    int cards[14];
    int temp;
    int i;
    int random;
    int j;
    char *color[] = { "Heart","Diamond","Spade","Clubs"};

    for (j = 0; j < 4; j++){
        for (i = 1; i < 14; i++) {
            cards[i] = i + 1;
            switch (cards[i]) {
            case ACE: printf("Ace");
                break;
            case JACK: printf("Jack");
                break;
            case QUEEN: printf("Queen");
                break;
            case KING: printf("King");
                break;
            default: printf("%d", cards[i]);
            }
            if (j == 0) {
                printf(" of %s\n", color[0]);
            }
            else;
            if (j == 1) {
                printf(" of %s\n", color[1]);
            }
            else;
            if (j == 2) {
                printf(" of %s\n", color[2]);
            }
            else;
            if (j == 3) {
                printf(" of %s\n", color[3]);
            }
        }
    }

    printf("\n----------------------------\n");
    srand(time(NULL));

//The above works fine, its below where the problem is

    for (i = 1; i < 13; i++) {
        random = (rand() % 13 + 1);
        temp = cards[i];
        cards[i] = cards[random];
        cards[random] = temp;
    }
    char *testcolor[64];
    char m;
    for (i = 0; i < 14; i++) {
        m = rand() % 4;
        *testcolor = color[i];
        color[i] = color[m];
        color[m] = *testcolor;

        for (i = 1; i < 14; i++) {
            printf("%d %s\n", cards[i], color[i]);
        }
    }

    system("pause");
    return 0;


}

所以,正如你所见,我不想要任何“重复”,这应该是我猜的顺序,但我希望程序打印出每张卡,但随机,就像一台机器。

我非常感谢任何帮助,因为我现在正在努力工作。

1 个答案:

答案 0 :(得分:1)

我看到的问题:

改变颜色的代码

您混合了用于改变颜色和打印​​卡片的代码。将它们分开。此外,索引的最大值必须为3,而不是13

for (i = 0; i < 4; i++) {
            //  ^^ Needs to be 4, not 14.
   m = rand() % 4;
   *testcolor = color[i];
   color[i] = color[m];
   color[m] = *testcolor;
}

另外,我不清楚为什么你需要:

char* testcolor[64];

您在交换指针时将其用作临时变量。它可以是:

char* testcolor;

然后,需要将交换代码更改为:

testcolor = color[i];
color[i] = color[m];
color[m] = testcolor;

打印代码

你需要两个循环,而不是一个循环。您需要一个卡片索引和另一个颜色索引。

for (i = 1; i < 14; i++) {
   for (j = 0; j < 4; j++) {
      printf("%d %s\n", cards[i], color[j]);
   }
}

<强>其他

您已将m定义为char类型。我从gcc收到以下警告:

warning: array subscript has type ‘char’ [-Wchar-subscripts]

可以是

int m;

避免这种警告。

在用于洗牌的循环中,你有:

for (i = 1; i < 13; i++) {

它不是必须的,但它可以是:

for (i = 1; i < 14; i++) {