2013-03-17 112 views
0

我正在努力解決學校問題,並在每一行中使用我的suitsInHand或facesInHand數組獲得「未聲明的標識符」。最後一次發生這種情況是因爲我沒有在塊的頂部聲明我的變量,但據我所知,這並不是出於同樣的原因。誰能告訴我我做錯了什麼?已申報未申報的標識符?

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

#define SUITS 4 
#define FACES 13 
#define AVAILABLE 0 
#define TAKEN 1 

void dealACard(char *suits[], char *faces[], int deck[][FACES]); 
void dealAHand(char *suits[], char *faces[], int deck[][FACES]); 
void analyzeHand(char *suits[], char *faces[]); 

int main(void){ 
    int suitsInHand[4] = {0}; 
    int facesInHand[13] = {0}; 
    char *suits[4] = {"Hearts", "Diamonds", "Spades", "Clubs"}; 
    char *faces[13] = {"Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King", "Ace"}; 
    int deck[4][13] = {AVAILABLE}; 

    srand(time(NULL)); 
    dealAHand(suits, faces, deck); 

    system("pause"); 
    return 0; 
} 

void dealAHand(char *suits[], char *faces[], int deck[][FACES]){ 
    int i; 
    for(i=0;i<5;i++) 
     dealACard(suits,faces,deck); 
} 

void dealACard(char *suits[], char *faces[], int deck[][FACES]){ 
    int suitIndex, faceIndex; 
    memset(suitsInHand, 0, sizeof(suitsInHand)); 
    memset(facesInHand, 0, sizeof(facesInHand)); 

    suitIndex = rand() % 4; 
    faceIndex = rand() % 13; 
    while (deck[suitIndex][faceIndex]==TAKEN){ 
     suitIndex = rand() % 4; 
     faceIndex = rand() % 13; 
    } 
    deck[suitIndex][faceIndex]=TAKEN; 
    suitsInHand[suitIndex]++; 
    facesInHand[faceIndex]++; 

    printf("%s of %s.\n", faces[faceIndex], suits[suitIndex]); 
} 

void analyzeHand(char *suits[], char *faces[]){ 
    typedef enum {false, true} bool; 
    int num_consec = 0; 
    int rank, suit; 
    bool straight = false; 
    bool flush = false; 
    bool four = false; 
    bool three = false; 
    int pairs = 0; 

    for(suit=0;suit<SUITS;suit++) 
     if(suitsInHand[suit]==5) 
      flush = true; 

    rank = 0; 
    while (facesInHand[rank]==0) 
     rank++; 

    //for(;rank<FACES && facesInHand[rank]; rank++) 
    // num_consec++; 

    if(num_consec == 5){ 
     straight = true; 
     return; 
    } 

    for(rank = 0;rank<NUM_RANKS; rank++){ 
     if(facesInHand[rank]==4) 
      four = true; 
     if(facesInHand[rank]==3) 
      three = true; 
     if(facesInHand[rank]==2) 
      pairs++; 
    } 

    if(straight == true && flush == true) 
     printf("Straight flush.\n\n"); 
    else if(four == true) 
     printf("Four of a kind.\n\n"); 
    else if(three == true && pairs == 1) 
     printf("Full house.\n\n"); 
    else if(flush == true) 
     printf("Flush.\n\n"); 
    else if(straight == true) 
     printf("Straight.\n\n"); 
    else if(three == true) 
     printf("Three of a kind.\n\n"); 
    else if(pairs == 2) 
     printf("Two pairs.\n\n"); 
    else if(pairs == 1) 
     printf("Pair.\n\n"); 
    else 
     printf("High card.\n\n"); 


} 

回答

2

這裏:

void dealACard(char *suits[], char *faces[], int deck[][FACES]){ 
    int suitIndex, faceIndex; 
    memset(suitsInHand, 0, sizeof(suitsInHand)); 

suitsInHand不在此範圍內聲明。 suitsInHandmain函數範圍內聲明,而不在dealACard範圍內。

爲了解決這個問題,你可以添加一個參數給你的函數來傳遞suitsInHand或聲明suitsInHand在文件範圍。

這同樣適用於facesInHand

1

你已經在main中聲明瞭suitsInHand,但這並不意味着它可用於其他函數,你需要將它傳遞給其他函數以供它們訪問它。

你已經到了要傳遞很多東西的地步,你應該把它們放到一個結構體中,然後傳遞結構體。

此外,一般來說,您的dealACard函數可能非常非常討厭。特別是如果牌組中只有1張牌,可能需要很長時間才能獲得正確的隨機數來處理牌組中的最後一張牌

+0

我還沒有開始建立結構,但我會研究它。謝謝。 – user2030222 2013-03-17 23:41:56