-2

我非常接近完成这个,至少我希望如此,因为如果我不这样做,我会发疯的。我已经设法摆脱所有语法和错误以摆脱编译器,我开始它希望我最终会完成然后......它崩溃了......

为了大致了解它的工作原理,假设从“甲板”中打印出五个值 - 然后再次随机打乱打印(以显示打乱)

我是如此接近。我可以尝尝!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 52

enum faces{Ace = 0, Jack = 10, Queen, King};
char * facecheck(int d); 
void shuffle( int deck[]);
void draw(int deck[SIZE]); 
void cards(int hand);
int main() 
{ 
    int deck[SIZE], i, n;
    char suits[4][9] = 
    {
        "Hearts",
        "Diamonds",
        "Clubs",
        "Spades"};


    srand( time( NULL ) ) ;

    for(i = 0; i<SIZE; i++)
    {
        deck[i] = i;
        i++;
    };

    draw(deck);
    shuffle(deck); 
    draw(deck);




    return 0; 
}  

char * facecheck(int d)
{
    static char * face[] = 
    {
        "Ace",
        "Jack",
        "Queen",
        "King" };

    if(d == Ace)
        return face[0];
    else
    {
        if(d == Jack) 
            return face[1];
        else
        {
            if(d == Queen)
                return face[2];
            else 
            { 
                if(d == King)
                    return face[3];
            }
        }
    }
}



void shuffle( int deck[]) 
{
     int i, j, temp; 

     for(i = 0; i < SIZE; i++)
     {
           j = rand() % SIZE; 
           temp = deck[i];
           deck[i] = deck[j];
           deck[j] = temp;
           }
     printf("The deck has been shuffled \n"); 
} 

void draw(int deck[SIZE])
{
     int i; 
     int hand[i];

     for(i = 0; i < 5; i++)
     {
           cards(hand[i]);
           putchar('\n');
           }
}

void cards(hand)
{
     int i; 

         char suits[4][9] = 
    {
        "Hearts",
        "Diamonds",
        "Clubs",
        "Spades"};

         for(i=0; i<SIZE; i++)
    {       
        if(i%13 == 0 || i%13 == 10 || i%13 == 11 || i%13 == 12)
            printf("%s ", facecheck(i%13) );
        else printf("%d ", i%13+1);
        printf("of %s \n", suits[i/13]);
    }

}
4

3 回答 3

2

它可能会崩溃,因为这里:

for(i = 0; i<SIZE; i++)
{
    deck[i] = i;
    i++;
};

你增加 i 两次。删除i++行:

for(i = 0; i<SIZE; i++)
{
    deck[i] = i;
};

也在这里:

void draw(int deck[SIZE])
{
     int i; 
     int hand[i];

该行int hand[i]可能会失败,因为 i 不是常量(它也没有初始化)。

于 2013-04-05T23:00:50.373 回答
0

一些注意事项:

void draw(int deck[SIZE])
{
    int i; 
    int hand[i];

    for(i = 0; i < 5; i++)
    {
        cards(hand[i]);
        putchar('\n');
    }
}

i默认情况下未初始化,并且将包含之前该内存地址中的任何内容,然后您创建一个此随机长度的数组-您是要这样做吗?

然后你将 hand[0], hand[1], ..., hand[4] 传递给卡片,即使它们是未定义的。

这可能会导致崩溃。

也许你想要类似的东西:

void draw(int deck[SIZE])
{
    int numCards = 5;
    int i; 
    int hand[numCards];
    int card;
    for(i = 0; i < numCards; i++)
    {
        card = deck[i];     /* Draw a card */
        hand[i] = card;     /* Store it in a "hand" array (even though you dont use it) */
        cards(card);        /* Display info about the card */
    }
}

在这里,无论您的牌组如何排序,您都可以打印出每张牌的整数值。

void cards(hand)
{
    int i; 

    char suits[4][9] = 
    {
        "Hearts",
        "Diamonds",
        "Clubs",
        "Spades"};

    for(i=0; i<SIZE; i++)
    {       
        if(i%13 == 0 || i%13 == 10 || i%13 == 11 || i%13 == 12)
            printf("%s ", facecheck(i%13) );
        else 
            printf("%d ", i%13+1);
        printf("of %s \n", suits[i/13]);
    }

}

我不认为你打算这样做。我想你的意思是

void cards(int card)
{
    char suits[4][9] = 
    {
        "Hearts",
        "Diamonds",
        "Clubs",
        "Spades"};


    if(card%13 == 0 || card%13 == 10 || card%13 == 11 || card%13 == 12)
        printf("%s ", facecheck(card%13) );
    else 
        printf("%d ", card%13+1);
    printf("of %s \n", suits[card/13]);
}

由于您已经在每张卡上调用此函数,因此没有理由循环任何内容。

于 2013-04-05T23:11:05.847 回答
0
for(i = 0; i<SIZE; i++)
{
    deck[i] = i;
    i++;
};

for循环中分号的错误?

for(i = 0; i<SIZE; i++)
{
    deck[i] = i;
    i++; //one of the answer stated to remove this sentence
}
于 2013-04-06T17:45:36.847 回答