/******************************************************************************
프로젝트: 동물카드 뒤집기
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");
}
}