-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
미해결
질문있습니다!
22.10.10 21:19 작성 조회수 261
0
자꾸 알 수 없는 오류가 발생해서 여기저기 찾아보고 해결해보려고 헤더에 <stdlib.h>도 넣고 해봤고 나도코딩 님께서 올리신 소스코드를 그대로 복사 붙여넣기 해서 실행하는데도 아래 사진과 같은 상태로 에러가 나서 여쭤봅니다.
혹시 왜 에러가 나는지, 그리고 그 해결법을 알 수 있을까요..?
혹시 몰라 소스코드도 첨부합니다.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
// 10마리의 서로 다른 동물 (각 카드 2장씩)
// 사용자로부터 2개의 입력값을 받아서 -> 같은 동물 찾으면 카드 뒤집기
// 모든 동물 쌍을 찾으면 게임 종료
// 총 실패 횟수 알려주기
int arrayAnimal[4][5]; // 카드 지도 (20장의 카드)
char* strAnimal[10]; // 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("뒤집을 카드를 2개 고르세요 : ");
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\n");
failCount++;
}
if (foundAllAnimals() == 1)
{
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()
{
// ㅁㅁㅁㅁㅁ 0 1 2 3 4
// ㅁㅁㅁㅁㅁ 5 6 7 8 9
// ㅁㅁㅁㅁㅁ 10 11 12 13 14
// ㅁㅁㅁㅁㅁ 15 16 17 18 19
// 이 배열에서 빈 공간 두 곳에 랜덤으로 동물을 배치
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 2; j++)
{
int pos = getEmptyPosition(); // 비어있는 위치 반환
int x = conv_pos_x(pos);
int y = conv_pos_y(pos); // 반환한 값을 (x,y) 좌표로 변환
arrayAnimal[x][y] = i;
}
}
}
// 좌표에서 빈 공간 찾기
int getEmptyPosition()
{
while (1)
{
int randPos = rand() % 20; // 0~19 사이의 숫자 반환
// ex) 19 = (3,4)
int x = conv_pos_x(randPos);
int y = conv_pos_y(randPos);
if (arrayAnimal[x][y] == -1)
{
return randPos;
}
}
return 0; // int로 반환하는 함수이기 때문에 적은것이지, 큰 의미는 없음
}
int conv_pos_x(int x)
{
// ex) 19 = (3,4)
return x / 5;
}
int conv_pos_y(int 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\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;
}
답변을 작성해보세요.
1
oort_cloud98
2022.10.11
컴파일러 버전이 달라서 그런 것 같습니다.
strAnimal 변수 선언시
const char* strAnimal[10] 으로 선언해주시면 될 것 같습니다.
답변 1