동물카드 뒤집기 프로젝트

admin 2025-02-23 13:44:19

/******************************************************************************
프로젝트: 동물카드 뒤집기
1.카드앞면에는 각각 다른 동물이 있고, 뒷면에는 모두 동일한 그림이 있다.
2. 앞면의 동물 총 10종, 1종당 카드가 2장씩, 총 20장이 있다.
3. 게임시작 처음에는 모두 뒷면이 보인다. 
4. 사용자는 2장씩 뒤집는다..
5. 같은 동물이 나오면 나온 상태로 유지(동물의 모양이 보인다.)
6. 같은 동물 카드를 모두 찾으면 게임 종료.
7. 총 몇번 틀렸는지를 알려줍니다.

Step 1. 초기화(Initialization)
Step 2. 동물이름 저장하기
Step 3. 카드 섞기
Step 4. 카드 뒤집기
*******************************************************************************/
#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);    //x좌표 반환 함수 선언
int conv_pos_y(int y);    //y좌표 반환 함수 선언
void printAnimals();      //카드지도 출력함수 선언
void printQuestion();     //문제출력 함수 선언

int main()
{
    initAnimalArray();   //카드지도 배열 초기화함수 호출
    // for(int i=0; i<4; i++){
    //     for(int j=0; j<5; j++){
    //         printf("%d ", arrayAnimal[i][j]);
    //     }
    //     printf("\n");
    // }
    initAnimalName();    //동물이름 배열 초기화 함수 호출
    shuffleAnimal();     //카드 섞기 함수 호출
    while(1){            //게임끝날때까지 반복
        int select1 = 0; //사용자가 선택한 첫번째 번호
        int select2 = 0; //사용자가 선택한 두번째 번호
        printAnimals();   //카드지도 출력함수 호출
        printQuestion(); //문제 출력함수 호출
        printf("\n뒤집을 카드 2장을 고르세요.(예: 12 4) -> ");  //안내문구
        scanf("%d %d", &select1, &select2);      //숫자2개 입력받기
        if(select1 == select2){                  //같은 카드 선택시 무효처리
            continue;                    //반복문의 시작지점으로 돌아가기
        }       
    }
    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++){    //동물이름수(10개)만큼 반복
        for(int j=0; j<2; j++){ //같은 동물 2번 반복
            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++){
        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");
    }
}