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; // 모든 카드 뒤집음
    }
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.