-
C언어 공룡 점프 게임C언어 기초/C언어 연습 2021. 8. 31. 02:28
C언어 공룡 점프 게임
/* 공룡게임 * z 누르면 점프 * 공룡 발 번갈아 가면서 출력 * 장애물 생성 * 충돌 처리 */ // 헤더 #include <stdio.h> #include <Windows.h> #include <conio.h> #include <time.h> #include <stdbool.h> #define DINO_BOTTOM_Y 12 #define TREE_BOTTOM_Y 20 #define TREE_BOTTOM_X 45 // 함수 선언 void SetConsoleView(); bool isCollision(const int treeX, const int dinoY); void GotoXY(int x, int y); int GetKeyDown(); void DrawDino(int dinoY); void DrawTree(int treeX); void DrawGameOver(const int score); // main 함수 int main(void) { SetConsoleView(); while (true) { // 게임 시작시 초기화 bool isJumping = false; bool isBottom = true; const int gravity = 3; int dinoY = DINO_BOTTOM_Y; int treeX = TREE_BOTTOM_X; int score = 0; clock_t start, curr; // 점수 변수 초기화 / 시간 관련 함수 clock_t 시작, current start = clock(); // 시작시간 초기화 ( start 지점과 curr지점을 clock()로 지정하면 초 단위로 시간 계산 while (true) { // 충돌 검사. 트리의 x값과 공룡의 y값으로 판단 if (isCollision(treeX, dinoY)) break; if (GetKeyDown() == 'z' && isBottom) // z를 누르고 바닥일 때 점프 { isJumping = true; // 점프 중 isBottom = false; // 바닥이 아님 } // 점프중이면 Y감소 점프중이 아니면 Y 증가 if (isJumping) dinoY -= gravity; else dinoY += gravity; // Y가 계속 증가하는 것을 막기 위해 바닥을 지정 if (dinoY >= DINO_BOTTOM_Y) { dinoY = DINO_BOTTOM_Y; isBottom = true; } // 나무가 왼쪽으로 가도록 하고 // 나무의 위치가 왼쪽 끝으로 가면 다시 오른쪽 끝으로 소환 treeX -= 2; if (treeX <= 0) { treeX = TREE_BOTTOM_X; } // 점프의 맨 위를 찍으면 점프가 끝난 상황 if (dinoY <= 3) isJumping = false; DrawDino(dinoY); DrawTree(treeX); curr = clock(); // 현재시간 받기 if (((curr - start) / CLOCKS_PER_SEC) >= 1) // 1초 이상이면 { score++; start = clock(); // 시작 시간 초기화 } Sleep(60); system("cls"); // 점수를 계속해서 출력해있기 GotoXY(22, 0); // 콘솔창의 가장 왼쪽 = x값이 0, 가장 위쪽의 y값이 0이고 밑으로 내려갈수록 커짐 printf("Score : %d ", score); } DrawGameOver(score); } return 0; } // 콘솔 창의 크기와 제목 지정 void SetConsoleView() { system("mode con:cols=100 lines=25"); system("title Dinosaurs Jumping Game"); } // 충돌하면 true, 충돌하지 않으면 false bool isCollision(const int treeX, const int dinoY) { // 트리의 X가 공룡의 몸체쪽에 있을 때, // 공룡의 높이가 충분하지 않다면 충돌로 처리 GotoXY(0, 0); printf("treeX : %d, dinoY : %d", treeX, dinoY); if (treeX <= 8 && treeX >= 4 && dinoY > 8) { return true; } return false; } // 커서의 위치를 x, y로 이동 void GotoXY(int x, int y) { COORD Pos; // COORD: 커서의 위치를 저장하는 구조체 Pos.X = 2 * x; Pos.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos); // 커서의 위치를 이동시키는 함수((핸들값 반환), 핸들값을 Pos값으로 지정) } // 키보드의 입력을 받고, 입력된 키의 값을 반환하는 함수 int GetKeyDown() { if (_kbhit() != 0) return _getch(); return 0; } // 공룡을 그리는 함수 void DrawDino(int dinoY) { GotoXY(0, dinoY); // 몸통 static bool legFlag = true; // static: 전역변수 특징과 비슷 printf(" $$$$$$$ \n"); printf(" $$ $$$$$$\n"); printf(" $$$$$$$$$\n"); printf("$ $$$ \n"); printf("$$ $$$$$$$ \n"); printf("$$$ $$$$$ \n"); printf(" $$ $$$$$$$$$$ \n"); printf(" $$$$$$$$$$$ \n"); printf(" $$$$$$$$$$ \n"); printf(" $$$$$$$$ \n"); printf(" $$$$$$ \n"); // 다리 if (legFlag) { printf(" $ $$$ \n"); printf(" $$ "); legFlag = false; } else { printf(" $$$ $ \n"); printf(" $$ "); legFlag = true; } } // 나무를 그리는 함수 void DrawTree(int treeX) { GotoXY(treeX, TREE_BOTTOM_Y); printf("$$$$"); GotoXY(treeX, TREE_BOTTOM_Y + 1); printf(" $$ "); GotoXY(treeX, TREE_BOTTOM_Y + 2); printf(" $$ "); GotoXY(treeX, TREE_BOTTOM_Y + 3); printf(" $$ "); GotoXY(treeX, TREE_BOTTOM_Y + 4); printf(" $$ "); } // 충돌하면 게임오버 void DrawGameOver(const int score) { system("cls"); int x = 18; int y = 8; GotoXY(x, y); printf("==================================="); GotoXY(x, y + 1); printf("==========G A M E O V E R=========="); GotoXY(x, y + 2); printf("==================================="); GotoXY(x, y + 5); printf("SCORE : %d", score); printf("\n\n\n\n\n\n\n\n\n"); system("pause"); }
system 함수 사용 방법을 확실히 알게 되는 계기가 되었으며, 콘솔창에서 코드가 어떻게 출력될지를 많이 생각해 볼 수 있었습니다.
BlockDMask 님의 코드를 보고 만들었습니다.
[C언어 게임] 구글 공룡 게임 만들기 (충돌처리 추가) (tistory.com)
'C언어 기초 > C언어 연습' 카테고리의 다른 글
C언어로 만든 간단한 행맨 게임 (0) 2021.11.06 C언어로 만든 간단한 온라인 은행 프로그램 (0) 2021.08.30 C언어로 만든 간단한 프로그램 1 (0) 2021.08.26