더북(TheBook)

8.4.7 전체 코드 확인하기

코드를 완성했습니다. 설명이 좀 길었는데 실행하면서 문제가 없는지 확인해 보겠습니다.

8.5 프로젝트.c

#include <stdio.h>
#include <time.h> // 헤더 파일 추가
#include <stdlib.h> // 헤더 파일 추가

// 전역변수 선언
int arrayAnimal[4][5]; // 카드 지도 배열(카드 20장)
char * strAnimal[10]; // 동물 이름 배열
int checkAnimal[4][5]; // 카드 뒷면, 앞면 확인 

// 함수 선언
void initAnimalArray(); 
void initAnimalName(); 
void shuffleAnimal();
int getEmptyPosition(); 
int conv_pos_x(int x); 
int conv_pos_y(int y);
void printAnimals(); 
void printQuestion();
int foundAllAnimals();

int main(void) {
    srand(time(NULL)); // 난수 초기화
    initAnimalArray(); // 카드 지도 배열 초기화
    initAnimalName();  // 동물 이름 배열 초기화
    shuffleAnimal();   // 카드 섞기
    int failCount = 0; // 총 실패 횟수
    while (1) {
        int select1 = 0; // 사용자가 선택한 첫 번째 번호 저장 
        int select2 = 0; // 사용자가 선택한 두 번째 번호 저장 
        printAnimals();  // 카드 지도 출력 함수 호출
        printQuestion(); // 문제 출력 함수 호출
        printf("\n뒤집을 카드 2장을 고르세요.(예: 12 4) -> "); 
        scanf_s("%d %d", &select1, &select2); // 입력받기
        if (select1 == select2) { // 같은 카드 선택 시 무효 처리
            continue; // 반복문 시작 지점으로 돌아가기
        }
        // 입력받은 카드 번호를 x, y 좌표로 변환
        int firstSelect_x = conv_pos_x(select1);
        int firstSelect_y = conv_pos_y(select1);
        int secondSelect_x = conv_pos_x(select2);
        int secondSelect_y = conv_pos_y(select2);
        // 두 카드가 같은 동물이고 뒷면인 경우
        if ((checkAnimal[firstSelect_x][firstSelect_y] == 0 
                && checkAnimal[secondSelect_x][secondSelect_y] == 0) 
                && (arrayAnimal[firstSelect_x][firstSelect_y] == 
                arrayAnimal[secondSelect_x][secondSelect_y])) { 
            printf("\n\n빙고! %s 발견\n\n", strAnimal[arrayAnimal[firstSelect_x][firstSelect_y]]);
            checkAnimal[firstSelect_x][firstSelect_y] = 1;
            checkAnimal[secondSelect_x][secondSelect_y] = 1;
        } else { // 두 카드가 다른 동물이거나 앞면인 경우
            printf("\n\n땡! 서로 다른 동물 카드이거나 이미 뒤집힌 카드입니다.\n");
            printf("%d : %s\n", select1, strAnimal[arrayAnimal[firstSelect_x][firstSelect_y]]);
            printf("%d : %s\n", select2, strAnimal[arrayAnimal[secondSelect_x][secondSelect_y]]);
            printf("\n");
            failCount++; // 실패 횟수 1 증가
        }
        if (foundAllAnimals() == 1) { // 모든 동물을 찾았는지 여부, 1 : 참, 0 : 거짓
            printf("\n\n축하합니다! 모든 동물을 찾았습니다.\n");
            printf("총 %d번 실패했습니다.\n", failCount);
            break;
        }
    }
    return 0;
}

void initAnimalArray() { // 카드 지도 배열 초기화 함수
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 5; j++) {
            arrayAnimal[i][j] = -1; // 카드 뒷면 설정
        }
    }
}

void initAnimalName() { // 동물 이름 배열 초기화 함수
    strAnimal[0] = "원숭이";
    strAnimal[1] = "하마";
    strAnimal[2] = "강아지";
    strAnimal[3] = "고양이";
    strAnimal[4] = "돼지";
    strAnimal[5] = "코끼리";
    strAnimal[6] = "기린";
    strAnimal[7] = "낙타";
    strAnimal[8] = "타조";
    strAnimal[9] = "호랑이";
}

void shuffleAnimal() { // 카드 섞기 함수 
    for (int i = 0; i < 10; i++) { 
        for (int j = 0; j < 2; j++) { 
            int pos = getEmptyPosition(); // 카드 지도에서 빈 공간 찾기 
            int x = conv_pos_x(pos); // 카드 번호를 x 좌표로 변환
            int y = conv_pos_y(pos); // 카드 번호를 y 좌표로 변환
            arrayAnimal[x][y] = i;   // 카드 지도 배열에 동물 번호 저장
        }
    }
}

int getEmptyPosition() { // 카드 지도에서 빈 공간 찾기 함수
    while (1) {
        int randPos = rand() % 20; // 무작위로 뽑은 카드 번호 반환(0~19)
        int x = conv_pos_x(randPos); // 반환한 카드 번호를 x 좌표로 변환
        int y = conv_pos_y(randPos); // 반환한 카드 번호를 y 좌표로 변환
        if (arrayAnimal[x][y] == -1) { // 해당 위치가 비었는지 확인
            return randPos; // 비었으면 카드 번호 반환
        }
    }
    return 0; // 빈 공간이 하나도 없으면 0 반환
}

int conv_pos_x(int x) { // x 좌표 변환 함수 
    return x / 5; // x 좌표, 카드 번호를 5로 나눈 몫
}

int conv_pos_y(int y) { // y 좌표 변환 함수
    return y % 5; // y 좌표, 카드 번호를 5로 나눈 나머지 
}

void printAnimals() { // 동물 위치 출력 함수 
    printf("\n========= 동물 위치를 보여 줍니다. =========\n\n"); 
    for (int i = 0; i < 4; i++) { // arrayAnimal 배열 접근
         for (int j = 0; j < 5; j++) {
            // 카드 지도 좌표로 동물 이름 출력
            printf("%8s", strAnimal[arrayAnimal[i][j]]); 
        }
        printf("\n"); 
    }
    printf("\n===========================================\n"); 
}

void printQuestion() { // 카드 지도 출력 함수 
    printf("\n(문제)\n\n"); 
    int seq = 0; // 변수 선언 및 초기화
    for (int i = 0; i < 4; i++) { // 카드 지도에 접근
        for (int j = 0; j < 5; j++) {
            if (checkAnimal[i][j] != 0) { // 카드가 앞면이면 
                printf("%8s", strAnimal[arrayAnimal[i][j]]); // 동물 이름 출력
            } else { // 카드가 뒷면이면
                printf("%8d", seq); // 카드 번호 출력
            }
            seq++; // 다음 카드를 확인하러 넘어가기
        }
        printf("\n");
    }
}

int foundAllAnimals() { // 게임 종료 확인 함수  
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 5; j++) {
            if (checkAnimal[i][j] == 0) {
                return 0; // 뒤집지 않은 카드가 있음
            }
        }
    }
    return 1; // 모든 카드 뒤집음
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.