Programming/TIL

[TIL] C언어 입문 11일차 (프로젝트 - 물고기 키우기)

catPaw 2025. 3. 5. 01:20

 

길벗 코딩 자율학습단 13기

https://cafe.naver.com/gilbutitbook/12930
C언어 입문 p.250 ~ 272


7장 마무리 프로젝트 - 물고기 키우기

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

int level;
int arrayFish[6];
int* cursor;
void initData();
void printfFishes();
void decreaseWater(long elapsedTime);
int checkFishAlive();

int main(void) {
	long startTime = 0;
	int num;
	long totalElapsedTime = 0; //총 경과시간
	long prevElapsedTime = 0; //직전에 물을 준 시간
	initData();
	startTime = time(NULL);
	cursor = arrayFish;
	while (1) {
		printfFishes();
		printf("몇 번 어항에 물을 줄까요?(1~6) ");
		scanf_s("%d", &num);
		if (num < 1 || num >6) {
			printf("\n입력값이 잘못됐습니다.\n");
			continue;
		}
		totalElapsedTime = time(NULL) - startTime;
		printf("총 경과 시간 : %1d초\n", totalElapsedTime);
		prevElapsedTime = totalElapsedTime - prevElapsedTime;
		printf("최근 경과 시간 : %1d초\n", prevElapsedTime);
		decreaseWater(prevElapsedTime);
		if (cursor[num - 1] <= 0) {
			printf("%d번 어항의 물고기는 이미 죽었으므로 물을 주지 않습니다.\n", num);
		}
		else if (cursor[num - 1] + 1 <= 100) {
			printf("%d번 어항에 물을 줍니다.\n\n", num);
			cursor[num - 1] += 1;
		}
		if (totalElapsedTime / 20 > level - 1) {
			level++;
			printf("*** 축하합니다. %d레벨에서 %d레벨로 올랐습니다. ***\n\n", level - 1, level);
			if (level == 5) {
				printf("\n\n축하합니다. 최고 레벨을 달성했습니다. 게임을 종료합니다.\n\n");
				exit(0);
			}
		}
		if (checkFishAlive() == 0) {
			printf("모든 물고기가 죽었습니다. ㅜㅜ \n\n");
			exit(0);
		}
		else
		{
			printf("물고기가 아직 살아 있어요!\n\n");
		}
		prevElapsedTime = totalElapsedTime;
	}
	return 0;
}


//게임 초기화 함수
void initData() {
	level = 1; //레벨 초기화
	for (int i =0; i < 6; i++) {
		arrayFish[i] = 100; //어항 물 높이 초기화
	}
}

//어항 물 높이 출력 함수
void printfFishes() {
	printf("%3d번 %3d번 %3d번 %3d번 %3d번 %3d번\n", 1, 2, 3, 4, 5, 6);
	for (int i = 0; i < 6; i++) {
		printf("  %3d ", arrayFish[i]); //서식 지정자로 출력 결과 정렬
	}
	printf("\n\n");
}

//어항의 물을 줄이는 함수
void decreaseWater(long elapsedTime) {
	for (int i = 0; i < 6; i++) {
		arrayFish[i] -= (level * 3 * (int)elapsedTime);
		//물 높이가 0 미만이면 0으로 고정
		if (arrayFish[i] < 0) {
			arrayFish[i] = 0;
		}
	}
}

//물고기가 얼마나 살아있는지 확인하는 함수
int checkFishAlive() {
	for (int i = 0; i < 6; i++) {
		if (arrayFish[i] > 0) {
			return 1;
		}
	}
	return 0;
}

전역 변수는 main 함수 위에, 즉 전역 공간에 선언한 변수로 지역과 상관없이 어느 곳에서든 접근할 수 있다. 이와 반대로 지역변수는 main() 함수 내부와 같이 중괄호 안에 선언한 변수로 선언한 중괄호 안에서만 접근할 수 있고 중괄호 외부나 다른 함수 등에서는 접근할 수 없다.

 

printfFishes() 함수에서 서식 지정자에 넣은 숫자 3은 서식 지정자에 옵션을 추가할 수 있는 형식 태그이다. 이 숫자는 출력할 값의 폭 또는 너비를 지정하는데, 자릿수라고 보면 된다. 즉 3을 넣어서 3자리를 지정하고 출력할 값이 지정한 너비보다 작으면 지릿수를 맞추기 위해 빈칸으로 채운다. %03d와 같이 % 뒤에 0을 넣으면 빈칸대신 0으로 채운다. 결과를 정렬해서 출력하고 싶을 때 사용한다.

 

decreaseWater () 함수에서 elapsedTime 변수 앞에 (int)는 형변환을 위해 사용한 것이다. C언어에서는 원하는 연산 결과를 얻기 위해 어떤 자료형을 다른 자료형으로 바꾸는 경우가 있는데, 이를 형변환이라고 한다. 바꿀 자료형을 소괄호 안에 적어서 변수 또는 값 앞에 붙이면 된다.


 

실습 - 배열의 톡정 요소 값 바꾸기

#include <stdio.h>

void square(int *num);

int main(void) {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (int i = 0; i < 10; i++) {
		square(&arr[i]);
	}
	for (int i = 0; i < 10; i++) {
		printf("%d", arr[i]);
		if (i + 1 < 10) {
			printf(", ");
		}
	}
	return 0;
}

void square(int *num) {
	if (!(*num % 2)) {
		*num *= *num;
	}
}

알게된 것 / 궁금한 것

1) 서식지정자 형식 태그


후기 (。˃ ᵕ ˂ )b

어렵다 빡세다 그치만 재밌어