반응형
선수 과목
- 주소값
- 포인터
- 또다른 포인터
- 배열과 포인터의 관계
- Swap
- 포인터로 배열 값 변경하기
#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;
}
반응형
'Programming > C' 카테고리의 다른 글
[C언어] 25장-1. C언어의 메모리 구조 (0) | 2021.04.14 |
---|---|
[C언어] 프로젝트 7. 동물 뒤집기 (0) | 2020.12.29 |
[C언어] 프로젝트 5. 아빠는 대머리 게임 (0) | 2020.12.24 |
[C언어] 프로젝트 4. 비밀번호 마스터 (0) | 2020.12.24 |
[C언어] 프로젝트 3. 숫자 맞히기 (0) | 2020.12.24 |