언어/C

[C] 포인터 - 어항 속 물고기 게임

돌멩이수프 2022. 4. 25. 14:20
728x90
#include <stdio.h>
#include <time.h>

int fishbowl[6];
int level;
int* cursor;

void initData();
void printFish();
void decreaseWater(long elapseTime);
int checkWater();

int main(void)
{
	long startTime = 0;
	long totalTime = 0;
	long prevTime = 0;

	int num;

	initData();

	cursor = fishbowl;
	startTime = clock();

	while (1)
	{
		printFish();
		printf("몇 번 어항에 물을 주시겠습니까? : ");
		scanf_s("%d", &num);
		printf("\n");

		if (num < 1 || num>6)
		{
			printf("잘못된 입력입니다.\n");
			continue;
		}

		totalTime = (clock() - startTime) / CLOCKS_PER_SEC;
		printf("총 경과 시간 : %d초\n", totalTime);
		prevTime = totalTime - prevTime;
		printf("직전 물주기부터 경과 시간 : %d초\n", prevTime);
		
		decreaseWater(prevTime);

		if (cursor[num - 1] == 0)
		{
			printf("물고기가 이미 죽었습니다.\n");
			exit(0);
		}
		else if (cursor[num - 1] < 100)
		{
			printf("%d번 어항에 물을 줍니다.\n", num);
			cursor[num - 1] += 1;
		}

		if ((totalTime / 20) > level - 1)
		{
			printf("\n\n***%d레벨에서 %d레벨로 업그레이드 됐습니다.***\n\n", level, level+1);
			level++;
			if (level == 5)
			{
				printf("\n\n최종 레벨입니다. 게임을 종료합니다.\n\n");
				exit(0);
			}
		}

		if (checkWater() == 0)
		{
			printf("모든 물고기가 죽었습니다. 게임을 종료합니다.\n\n");
			exit(0);
		} 
		else
		{
			printf("물고기가 살아있습니다.\n\n");
		}

		prevTime = totalTime;
	}

	return 0;
}

void initData()
{
	level = 1;
	for (int i = 0; i < 6; i++)
	{
		fishbowl[i] = 100;
	}
}

void printFish()
{
	printf("%3d번 %3d번 %3d번 %3d번 %3d번 %3d번\n", 1, 2, 3, 4, 5, 6);
	for (int i = 0; i < 6; i++)
	{
		printf(" %4d ", fishbowl[i]);
	}
	printf("\n\n");
}

void decreaseWater(long elapseTime)
{
	for (int i = 0; i < 6; i++)
	{
		fishbowl[i] -= (level * 3 * (int)elapseTime);
		if (fishbowl[i] < 0)
		{
			fishbowl[i] = 0;
		}
	}
}

int checkWater()
{
	for (int i = 0; i < 6; i++)
	{
		if (fishbowl[i] > 0)
		{
			return 1;
		}
		return 0;
	}
}

모두가 포기한다는 포인터를 활용하는 게임이다.

1. 게임 내에 시간 지정

2. 어항 속 물 데이터 함수로 불러오기

3. cursor, startTime 지정

4. 무한루프

4-1. 어항 상태 출력

4-2. 물을 줄 어항 선택 (1보다 작거나 6보다 크면X)

4-3. 시간 정리 (totalTime, prevTime)

4-4. 시간, 레벨에 따라 물 줄어들게 하기

4-5. 물이 0이면 물고기 죽이고, 100보다 적으면 물 주기

4-6. 20초마다 레벨업

4-6-1. 레벨 5면 게임 끝

4-7. 모든 어항에 물이 0이면 게임 끝, 하나라도 있으면 물고기가 살아있습니다.

4-8. 직전 시간 관리.

clock()을 사용하기 위해 time.h를 선언해줬다. 직접 플레이 하기에 은근 재밌고, 어렵다.

void decreaseWater(long elapseTime)
{
	for (int i = 0; i < 6; i++)
	{
		fishbowl[i] -= (level * 3 * (int)elapseTime); // 여기서 숫자 3을 2, 1로 바꾸면 난이도가 확 내려간다.
		if (fishbowl[i] < 0)
		{
			fishbowl[i] = 0;
		}
	}
}
728x90