#include <stdio.h>
#include<time.h>
//물고기 6마리
//사막인데 더워서 증발
//다 증발하기 전에 부지런히 물을 넣어줘야함.
//물고기는 시간이 지날수록 커져서 나중엔 냠냠 야미~
int level;
int arrayFish[6];
void initData();
int* cursor = arrayFish;
void printFishes();
void decreaseWater(long elapsedTime);
int checkFishAlive();
int main(void)
{
long startTime; // 게임 시작 시간
long totalElapsedTime = 0; //총 경과시간
long prevElapsedTime = 0; //직전 경과 시간 (최근에 물을 준 간격)
cursor = arrayFish; // crusor[0]... cursor[1]..
startTime = clock(); //현재 시간을 밀리섹 1000분의 1초로 반환
int num; // 몇 번 어항에 물을 줄 것인지, 사용자 입력
initData();
while (1)
{
printFishes();
printf("몇 번 어항에 물을 주시겠어요?");
scanf_s("% d", &num);
//입력값 체크
if (num < 1 || num >6)
{
printf("\n입력값이 잘못되었습니다.\n");
continue;
}
totalElapsedTime = (clock() - startTime) / CLOCKS_PER_SEC;
printf("총 경과시간 : %ld 초", totalElapsedTime);// long함수를 출력할 때는 %ld
//직전 물 준 시간 (마지막으로 물 준 시간) 이후로 흐른 시간
prevElapsedTime = totalElapsedTime - prevElapsedTime;
printf("최근 경과 시간 : %ld 초\n", prevElapsedTime);
//어항의 물을 감소(증발)
decreaseWater(prevElapsedTime);
//if 어항의 물이 이미 0이다? 이미 물고기가 따잇당해서 물을 주지않는다.
if (cursor[num - 1] <= 0)
{
printf("%d번 물고기는 이미 사망하셨습니다. 물은 필요 없습니다.\n", num);
}
//if 어항의 물 ~0, 물을 준다! but 100은 넘지않게...
else if (cursor[num - 1] + 1 <= 100)
{
//물을 준다.
printf("%d번 어항에 물을 줍니다.\n\n", num);
cursor[num - 1] += 1;
}
//레벨업을 할 것인지 확인. (레벨업은 20초마다 한 번씩 수행.)
if (totalElapsedTime / 20 > level - 1)// int형에서는 0.xxx는 0으로 인식.
{
//레벨업
level++;
printf("*** 축! 레벨업! %d레벨에서 %d레벨로 레벨업했습니다! ***\n\n", level - 1, level);
//최종레벨 5
if (level == 5)
{
printf("\n\n축하합니다!!!! 최고 레벨을 달성하셨습니다!. 게임을 종료합니다.\n\n");
exit(0); //모든 프로그램 종료.
}
}
//모든 물고기가 죽었는지 확인
if (checkFishAlive() == 0)
{
//물고기 모두 4망.
printf("모든 물고기가 운명하셨습니다.\n");
exit(0);
}
else
{
//최소 한마리는 현재 생존.
printf("물고기가 아직 살아있어요!\n");
}
prevElapsedTime = totalElapsedTime;
// 10초 -> 15초 (5초 prevElapsedTime -> 15초) 25초 (10초)
}
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(" %4d ", arrayFish[i]);
}
printf("\n\n");
}
void decreaseWater(long elapsedTime)
{
for (int i = 0; i < 6; i++)
{
arrayFish[i] -= (level * 3 * (int)elapsedTime); //3 난이도 조절을 위한 값
// "-="은 arrayFish[i] = arrayFish[i] - level~~~ 라는 뜻.
if (arrayFish[i] <= 0)
{
arrayFish[i] = 0;
}
}
}
int checkFishAlive()
{
for (int i = 0; i < 6; i++)
{
if (arrayFish[i] > 0)
{
return 1; // 1은 참 true. 계속 진행해!
}
}
return 0; //0을 반환함으로써 끝냄.
}
되게 기초적인 코드인데 비쥬얼 스튜디오에 돌리니까 일반적인 오류가 아니라 빨간색 경고표시 뜨면서 debug assertion failed라고 뜸... 예제에서는 int *cursor = arrayFish;가 int *cursor;라고만 되어있었는데 저리 하면 안될 것같아서 내가 임의로 넣은건데 저거때문에 뜨는건 아닌거같고... c언어 돌려주는 사이트가서 돌리니까 scanf_s를 scanf로 바꾸라는 말 말고는 없음... 심지어 바꾸고 돌리니까 (물론 사이트안에서. 비쥬얼 스튜디오에서는 scanf_s가 아니면 잘 안돌아가는걸로 알고있음.) 숫자를 1개만 입력했는데도 무한반복됨.... 분명히 while(1)이 되어있어서 1번 입력받고 2번째 숫자 입력받기전까지 기다려야할텐데... 진짜 어제 2시간동안 머리싸매다 안돼서 물어봄 ㅠㅠ
prevElapsedTime = totalElapsedTime - prevElapsedTime; 여기서 preElapsedTime 얘가 지금 계속 참조되는데 이거때문에 무한루프 빠지는거아님?
그러면 어캐해야되지...? 다른 시간을 재는 함수를 만들어서 써야하냐?
//직전 물 준 시간 (마지막으로 물 준 시간) 이후로 흐른 시간 long testTime = totalElapsedTime - prevElapsedTime; printf("최근 경과 시간 : %ld 초\n", testTime); //어항의 물을 감소(증발) decreaseWater(testTime);
으악 내 눈 씹발퀄코드다