본문 바로가기

c언어 기초

c언어 구조체 프로젝트 struct project - 나도코딩

유튜브 나도코딩 c언어 기초 강의 내용이 포함되었습니다.

#include <stdio.h>
#include <time.h>


// 5마리의 고양이가 있다
// 아무키나 눌러서 랜덤으로 고양이를 뽑되
// 5마리 모두 다 수집을 해서 열심히 키우면 되는 게임 !
// 중복발생가능 !!

// 고양이
// 이름 나이 성격 키우기난이도(레벨)

typedef struct {
	char* name;
	int age;
	char* character;
	int level;

}cat;

// 현재까지 보유한 고양이
int collection[5] = { 0, };

// 전체 고양이 리스트
cat cats[5];

void initcats();
void printcat(int selected);


int main(void)
{
	srand(time(NULL)); 

	initcats();

	while (1)
	{
		printf("두근두근~! 어느 고양이의 집사가 될까요?\n아무키나 눌러서 확인하세요.");
		getchar();

		int selected = rand() % 5; ///0-4 사이의 숫자 반환

		printcat(selected);        // 뽑은 고양이 정보 출력
		collection[selected] = 1;


		int collectAll = checkCollection();
		if (collectAll == 1)
		{
			break;
		}
	}

	return 0;
}

void initcats()
{
	cats[0].name = "깜냥이";
	cats[0].age = 5;
	cats[0].character = "온순";
	cats[0].level = 1;

	cats[1].name = "귀요미";
	cats[1].age = 3;
	cats[1].character = "날카로움";
	cats[1].level = 2;

	cats[2].name = "수줍이";
	cats[2].age = 7;
	cats[2].character = "늘 잠만 잠";
	cats[2].level = 3;

	cats[3].name = "까꿍이";
	cats[3].age = 4;
	cats[3].character = "시끄러움";
	cats[3].level = 4;

	cats[4].name = "돼냥이";
	cats[4].age = 1;
	cats[4].character = "배고픔";
	cats[4].level = 5;

}

void printcat(int selected)
{
	printf("\n\n ==== 이 고양이의 집사가 되었어요 ! ====\n\n");
	printf(" 이름  : %s\n", cats[selected].name);
	printf(" 나이  : %d\n", cats[selected].age);
	printf(" 특징  : %s\n", cats[selected].character);
	printf(" 레벨  : ");

	for (int i = 0; i < cats[selected].level; i++)
	{
		printf("%s", "★");
	}
	printf("\n\n"); 

}

int checkCollection()
{
	// 현재 보유한 고양이 목록도 출력. 다 모았는 지 여부를 반환

	int collectAll = 1;

	printf("\n\n === 보유한 고양이 목록이에요. === \n\n");
	for (int i = 0; i < 5; i++)
	{
		if (collection[i] == 0) // 고양이 수집 x
		{
			printf("%10s", "(빈 박스)");
			collectAll = 0;
		}
		else // 고양이 수집 0
		{
			printf("%10s", cats[i].name);
		}
	}
	printf("\n===========================================\n\n");

	if (collectAll)
	{
		printf("\n\n 축하합니다 ! 모든 고양이를 다 모았어요. 잘 키워\n\n");
	}

	return collectAll;
}

고양이 키우기 게임이다.

구조체를 사용해서 고양이를 선언하고 랜덤으로 고양이를 뽑아서 5마리를 모두 다 모으는 게임.

 

고양이를 랜덤으로 뽑을거니까 헤더파일에 #include <time.h> 추가, 그리고 srand(time(NULL)); 선언

 

구조체를 활용해서 고양이 5마리를 선언해줄건데, typedef를 이용해서 struct cat 을 cat으로 줄여주고

멤버변수는 이름, 나이, 특징, 레벨을 선언해줬다. 이름과 특징은 문자열이 들어갈 것이기 때문에 포인터변수로 넣어줬고, 

전체 고양이 리스트를 전역변수로 구조체 배열을 사용했다. 또 현재까지 보유한 고양이를 알기 위해 collection[5] 배열 변수도 전역변수로 선언해주었다.

 

전역변수 int collection[5]은 모두 0으로 초기화 해뒀는데, 이 변수는 나중에 고양이 5마리를 다 뽑으면 while문을 탈출할 때 쓰일 것이다.

 

initcats는 구조체 배열을 활용해서 고양이 다섯마리를 선언해주었고 

printcat은 랜덤으로 뽑은 고양이의 정보를 출력하게 했는데, 레벨은 숫자만큼 ★를 출력하게 했다.

 

구조체를 활용해 고양이들을 선언 후 while을 이용해 고양이 5마리를 모두 뽑을 때까지 반복하게 했다.

getchar(); 를 써서 엔터키를 눌러야 다음 코드를 실행하도록 했고, 숫자를 랜덤으로 뽑아서 그 뽑은 숫자의 고양이의 정보를 출력하고 보유한 collection[뽑은 숫자]를 1로 만들어 줄 것이다.

 

변수 collectAll은 배열 collection[5]와 함께 고양이 5마리를 다 찾았는지를 확인하기위해 선언했다.

함수 checkCollection 또한 함께 쓰일건데,

checkCollection은 변수 collectAll을 1로 초기화 해주고, 아까 선언했던 배열 collection[5] 에서 collection[i] == 0 이라면

아직 뽑히지 않은 고양이니까 그 때는 (빈 박스)로 출력하는 것과 변수 collection을 0으로 초기화 시켜준다.

그리고 collection[i]가 0이 아니라면 (1이라면) 고양이는 수집 된 것이고 collectAll은 여전히 1, 고양이 이름을 출력하기만 할 것이다.

for문을 이용해서 i를 0~4까지 반복하면, 수집되지 않은 고양이가 한 마리라도 있을 때 (collection[i] ==0인 것이 있을 때) collectAll은 0이 되고 checkCollection의 return값(collectAll)이 0이 되기 때문에 main 함수 내 while문은 멈추지않고 다시 반복할 것이다.

고양이를 다 모았다면 collection[i] ==0 이 없기 때문에 collectAll 또한 0이 되지 않고 return 값이 1이 되어서 main함수 내의 while문을 탈출하게 될 것이다.