2013-03-17 4 views
0

Я работаю над проблемой для школы, и я получаю «необъявленный идентификатор» в каждой строке с моими костюмамиInHand или 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 не объявлен в этой области. suitsInHand объявляется в рамках main функция не в dealACard scope.

Чтобы исправить это, вы можете добавить параметр к своим функциям, чтобы пройти suitsInHand или объявить suitsInHand в области файлов.

То же самое относится к facesInHand.

1

youve объявил suitsInHand в основном, но это не значит, что он доступен для других функций, вам необходимо передать его другим функциям, чтобы они имели к нему доступ.

вы добираетесь до точки, где вы проходите довольно много вещей вокруг, что вы должны поместить их в структуру, а затем передать структуру вокруг.

Кроме того, в целом ваша сделка может быть очень неприятной. Особенно, если в колоде есть только 1 карта, для получения правильного случайного числа для обработки последней карты в колоде может потребоваться очень много времени.

+0

Я еще не начал работу над структурами, но я рассмотрю Это. Спасибо. – user2030222