본문 바로가기

Programming/C

[C언어] 프로젝트 6. 물고기 키우기

반응형

01234
물고기 키우기

선수 과목

  1. 주소값
  2. 포인터
  3. 또다른 포인터
  4. 배열과 포인터의 관계
  5. Swap
  6. 포인터로 배열 값 변경하기
#include <stdio.h>
#include <time.h>


//물고기가 6마리가 있다
//이들은 어항에 살고 있는데, 사막이에요
//사막이 너무 더워서, 너무 건조해서 물이 아주 빨리 증발을 해요
//물이 다 증발하기 전에 부지런히 어항에 물을 줘서 물고기를 살려주세요
//물고기는 시간이 지날수록 점점 커져서 .. 나중에는 매운탕을 해먹을수있어요...

int level;
int arrayFish[6];
int *cursor; //물고기를 가리키는 역할 (미션맨)

void initData();
void printFishes();
void decreaseWater(long elapsedTime);

int main(void)
{
	long startTime = 0; //게임 시작 시간
	long totalElapsedTime = 0; // 총 경과 시간
	long prevElapsedTime = 0; //직전 경과 시간(최근에 물을 준 시간 간격)

	int num; // 몇 번 어항에 물을 줄 것인지, 사용자 입력
	initData();
	
	cursor = arrayFish; //cursor[0] ...  cursor[1] 포인터변수를 이용 배열처럼 사용

	startTime = clock(); // 현재 시간을 millisecond (1000분의 1초) 단위로 반환
	while (1)
	{
		printFishes();
		//getchar(); //임시로 사용자 입력 대기 -무한루프 방지
		printf("몇 번 어항에 물을 주시겠어요?");
		scanf_s("%d", &num);

		//입력값 체크
		if (num < 1 || num>6)
		{
			printf("\n입력값이 잘못되었습니다.\n");
			continue;
		}
		//총 경과 시간
		totalElapsedTime = (clock() - startTime) / CLOCKS_PER_SEC; 
		printf("총 경과 시간 :%ld 초\n", totalElapsedTime);
		//초단위로 변환 //총경과시간 표출=시작시간-사용자입력까지의시간
		//직전 물 준 시간(마지막으로 물 준 시간) 이후로 흐른 시간
		//특정 시간 동안 물이 얼마나 흘렀는지 계산
		prevElapsedTime = totalElapsedTime - prevElapsedTime;
		printf("최근 경과 시간 : %ld 초\n", prevElapsedTime);

		//어항의 물을 감소(증발)
		decreaseWater(prevElapsedTime);

		//사용자가 입력한 어항에 물을 준다
		//1. 어항의 물이 0이면? 물을 주지 않는다.
		if (cursor[num - 1] <= 0)
		{
			printf("%d번 물고기는 이미 죽었습니다. 물을 주지 않습니다.\n", num);

		}
		//2. 어항의 물이 0이 아닌 경우? 물을 준다 ! 100을 넘지 않는지 체크
		//현재 어항의 물+1 <=100

		else if (cursor[num - 1] + 1 <= 100)
		{
			//물을 준다
			printf("%d번 어항에 물을 줍니다\n\n", num);
			cursor[num - 1] += 1; //cursor[num-1] =cursor[num-1]+1
		}

		//레벨업을 할 건지 확인 (레벨업은 20초마다 한번씩 수행)
		if (totalElapsedTime / 20 > level - 1) //처음레벨이 1이므로 0.XXX는 int에서 0으로 취급
		{
			level++; //level :1 -> level :2 -> level :3..
			printf(" ***축 레벨업! 기존 %d 레벨에서 %d레벨로 업그레이드 *** \n\n", level - 1, level);
			//기존레벨은 지금레벨보다 1낮기때문에

			//최종 레벨 :5
			if (level == 5)
			{
				printf("\n\n 축하합니다. 최고 레벨을 달성하였습니다. 게임을 종료합니다.\n\n");

				exit(0); //모든 프로그램 종료 동작
			}
		}

		//모든 물고기가 죽었는지 확인

		if (checkFishAlive() == 0)
		{
			//물고기 모두 죽었음
			printf("모든 물고기가.. ㅠㅠ흑흑...\n");
		}
		else
		{
			//최소 한마리 이상의 물고기 살아있음
			printf("물고기가 아직 살아 있어요!\n");
		}
		prevElapsedTime = totalElapsedTime; 
		
		// 10초 -> 15초 (5초 : prevElapsedTime -> 15초) -> 25초 (10초...?)
		//25초에서 15초를 빼기위한 임시값 지정 while 때문에

	
	
	}
	return 0;
}

void initData()
{
	level = 1; //게임 레벨 (1~5)
	for (int i = 0; i < 6; i++)
	{
		arrayFish[i] = 100; //어항의 물 높이 (0~100)
	}
}

void printFishes()
{
	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 elaspedTime) //최근경과시간
{
	for (int i = 0; i < 6; i++)
	{
		arrayFish[i] -= (level * 3 *(int) elaspedTime); //3은 난이도조절값, 10초인경우 30만큼 감소
		if (arrayFish[i] < 0)
		{
			arrayFish[i] = 0; 
		}
	}
}

int checkFishAlive()
{
	for (int i = 0; i < 6; i++)
	{
		if (arrayFish[i] > 0)
			return 1; //참 True
	}
	return 0;
}
반응형