티스토리 뷰
메이플스토리의 구애의 춤을 만들어 보았습니다.
모양에 맞는 방향키를 누르시면 됩니다.
클리어 화면입니다.
소스코드입니다.
#include<stdio.h> #include<windows.h> #include<time.h> #include<conio.h> #include<stdlib.h> #define _CRT_SECURE_NO_WARNINGS #define LEFT 75 #define RIGHT 77 #define UP 72 #define DOWN 80 // 8~11번째 줄 키보드 방향키 아스키코드값 #define DanceBoard_X 39 // Dance 가로크기 #define DanceBoard_Y 4 // Dance 세로크기 #define Void 0 // 빈 부분 #define True 1 #define False 0 #define Fail 200 // 실패 플래그 값 int DanceBlocks[4][4][4] = { //위방향 화살표 { 0,UP,0,0, UP,DOWN,UP,0, 0,1,0,0, 0,1,0,0 }, //아래방향 화살표 { 0,1,0,0, 0,1,0,0, DOWN,UP,DOWN,0, 0,DOWN,0,0 }, //왼쪽방향 화살표 { 0,LEFT,0,0, LEFT,RIGHT,1,1, 0,LEFT,0,0, 0,0,0,0 }, //오른쪽방향 화살표 { 0,0,RIGHT,0, 1,1,LEFT,RIGHT, 0,0,RIGHT,0, 0,0,0,0 } }; //리듬게임 블럭 모양 저장 int DanceBoard[DanceBoard_Y + 1][DanceBoard_X + 1] = { 0, }; // 리듬게임 보드 저장 int DanceBoardCpy[DanceBoard_Y + 1][DanceBoard_X + 1]; // 리듬게임 보드 저장 카피 int DanceSave[8] = { 0, }; // 리듬게임 블럭 저장 int DanceType; // 화살표 저장 int keyinput; // 키 입력 받기 int Dance_X, Dance_Y; // 리듬게임 위치 저장 int DanceSuccess = 0; // 리듬게임 라운드 int DanceSuccessFlag = True; // 리듬게임 성공 플래그 int DanceFail; // 리듬게임 실패 int DanceGet = 0; // 리듬게임 성고 double DanceTime = 60; // 리듬게임 시간 int ColorOption = 15; // 컬러 저장 void Consolecolor(int color); // 콘솔 색깔 변경 void removeCursor(void); // 커서 지우기 void Reset_DanceBoardCpy(void); // DanceBoardCpy 초기화 void gotoxy(int x, int y); // 좌표 설정 void DanceOutput(void); // 리듬게임 출력 int DanceTimer(void); // 리듬게임 시간 계산 void DanceMap(void); // 리듬게임 맵 생성 void DanceDrow(void); // 리듬게임 블럭 그리기 int DanceRound(void); // 리듬게임 라운드 void DanceBreak(int Keyinput, int num); // 리듬게임 블럭 파괴 void DanceKeyinput(void); // 리듬게임 키 입력 받기 void DanceEnd(void); // 리듬게임 종료 int main(void) { keyinput = 0; srand(time(NULL)); removeCursor(); system("cls"); Reset_DanceBoardCpy(); DanceMap(); while (1) { DanceTimer(); if (DanceTimer() == Fail) break; if (DanceSuccessFlag == True) { Reset_DanceBoardCpy(); DanceOutput(); } DanceKeyinput(); DanceDrow(); if (DanceSuccess == 20) break; } DanceEnd(); } // 메인 함수 void Consolecolor(int color) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color); } void removeCursor(void) { CONSOLE_CURSOR_INFO curInfo; GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo); curInfo.bVisible = 0; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo); } void gotoxy(int x, int y) { COORD pos = { 2 * x,y }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } void DanceOutput(void) { int i, j, k; Dance_X = 1; Dance_Y = 4; for (k = 0; k < DanceRound(); k++) { DanceType = rand() % 4; switch (DanceType) { case 0: DanceSave[k] = UP; break; case 1: DanceSave[k] = DOWN; break; case 2: DanceSave[k] = LEFT; break; case 3: DanceSave[k] = RIGHT; break; } for (i = 0; i <= 3; i++) { for (j = 0; j <= 3; j++) { if (DanceBlocks[DanceType][i][j] >= 1) { DanceBoard[i][j + (5 * k)] = DanceBlocks[DanceType][i][j]; } } } } DanceSuccessFlag = False; } int DanceTimer(void) { DanceTime = DanceTime - 0.01; Sleep(10); if (DanceTime > 0) { gotoxy(19, 0); printf("%.2lf초", DanceTime); } else if (DanceTime <= 0) { gotoxy(19, 0); printf("0.00초"); } if (DanceTime <= 0) return Fail; } void DanceMap(void) { gotoxy(15, 0); puts("시간 : "); gotoxy(33, 0); puts("성공횟수 :"); Consolecolor(15); gotoxy(0, 13); printf(" ■■■■■■"); gotoxy(0, 14); printf(" ■■■■■■■"); gotoxy(0, 15); printf(" ● ■■■■■■■■"); Consolecolor(4); gotoxy(0, 16); printf(" ■ ■■■■■■■"); gotoxy(0, 17); printf(" ■ ■ ■■■"); gotoxy(0, 18); printf(" ■ ■ ■■■"); gotoxy(0, 19); printf(" ■"); Consolecolor(15); gotoxy(18, 19); printf("●"); Consolecolor(4); gotoxy(33, 19); printf("■ ■■■"); gotoxy(0, 20); printf(" ■"); Consolecolor(15); gotoxy(2, 20); printf("┼──┼─┼─┼──┼──┼─┼▲─┼─┼─┼─┼──┼─┼┤"); Consolecolor(4); gotoxy(33, 20); printf("■ ■■■"); Consolecolor(10); gotoxy(0, 21); printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■"); Consolecolor(6); gotoxy(0, 22); printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■"); gotoxy(0, 23); printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■"); gotoxy(0, 24); printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■"); Consolecolor(ColorOption); } void DanceDrow(void) { int i, j; for (i = 0; i <= DanceBoard_X; i++) { for (j = 0; j <= DanceBoard_Y; j++) { if (DanceBoard[j][i] != DanceBoardCpy[j][i]) { gotoxy(Dance_X + i, Dance_Y + j); switch (DanceBoard[j][i]) { case UP: printf("▲"); break; case DOWN: printf("▼"); break; case LEFT: printf("◀"); break; case RIGHT: printf("▶"); break; case 1: printf("■"); break; case Void: printf(" "); break; } } } } gotoxy(38, 0); printf("%2d", DanceSuccess); for (i = 0; i <= DanceBoard_X; i++) { for (j = 0; j <= DanceBoard_Y; j++) { DanceBoardCpy[j][i] = DanceBoard[j][i]; } } } void Reset_DanceBoardCpy(void) { int i, j; for (i = 0; i <= DanceBoard_Y; i++) { for (j = 0; j <= DanceBoard_X; j++) { DanceBoardCpy[i][j] = 100; } } } int DanceRound(void) { if (0 <= DanceSuccess&&DanceSuccess < 5) { return 4; } else if (5 <= DanceSuccess&&DanceSuccess < 10) { return 6; } else if (10 <= DanceSuccess&&DanceSuccess < 15) { return 7; } else if (15 <= DanceSuccess&&DanceSuccess < 20) { return 8; } } void DanceBreak(int Keyinput, int num) { int i, j, k; if (Keyinput == True) { for (i = 0; i <= 3; i++) { for (j = 0; j <= 3; j++) { if (DanceBoard[i][j + (5 * num)] >= 1) DanceBoard[i][j + (5 * num)] = Void; } } DanceGet += 1; } if (Keyinput == False) { for (k = 0; k < DanceRound(); k++) { switch (DanceSave[k]) { case UP: for (i = 0; i <= 3; i++) { for (j = 0; j <= 3; j++) { DanceBoard[i][j + (5 * k)] = DanceBlocks[0][i][j]; } } for (i = 0; i <= 3; i++) { for (j = 0; j <= 3; j++) { if (DanceBlocks[0][i][j] >= 1) DanceBoard[i][j + (5 * k)] = DanceBlocks[0][i][j]; } } break; case DOWN: for (i = 0; i <= 3; i++) { for (j = 0; j <= 3; j++) { if (DanceBlocks[1][i][j] >= 1) DanceBoard[i][j + (5 * k)] = DanceBlocks[1][i][j]; } } break; case LEFT: for (i = 0; i <= 3; i++) { for (j = 0; j <= 3; j++) { if (DanceBlocks[2][i][j] >= 1) DanceBoard[i][j + (5 * k)] = DanceBlocks[2][i][j]; } } break; case RIGHT: for (i = 0; i <= 3; i++) { for (j = 0; j <= 3; j++) { if (DanceBlocks[3][i][j] >= 1) DanceBoard[i][j + (5 * k)] = DanceBlocks[3][i][j]; } } break; } } DanceGet = 0; } } void DanceKeyinput(void) { keyinput = 0; if (kbhit()) { keyinput = getch(); switch (keyinput) { case UP: if (DanceSave[DanceGet] == UP) { DanceBreak(True, DanceGet); } else if (DanceSave[DanceGet] != UP) { DanceBreak(False, DanceGet); } break; case DOWN: if (DanceSave[DanceGet] == DOWN) { DanceBreak(True, DanceGet); } else if (DanceSave[DanceGet] != DOWN) { DanceBreak(False, DanceGet); } break; case LEFT: if (DanceSave[DanceGet] == LEFT) { DanceBreak(True, DanceGet); } else if (DanceSave[DanceGet] != LEFT) { DanceBreak(False, DanceGet); } break; case RIGHT: if (DanceSave[DanceGet] == RIGHT) { DanceBreak(True, DanceGet); } else if (DanceSave[DanceGet] != RIGHT) { DanceBreak(False, DanceGet); } break; } } if (DanceGet == DanceRound()) { ++DanceSuccess; DanceGet = 0; DanceSuccessFlag = True; } } void DanceEnd(void) { if (DanceTime <= 0) { for (int a = 3; a < 10; a++) { gotoxy(0, a); puts(" "); } gotoxy(4, 3); puts("■■■■■ ■ ■■■■■ ■"); gotoxy(4, 4); puts("■ ■■ ■ ■"); gotoxy(4, 5); puts("■ ■ ■ ■ ■"); gotoxy(4, 6); puts("■■■■■ ■■■■ ■ ■"); gotoxy(4, 7); puts("■ ■ ■ ■ ■"); gotoxy(4, 8); puts("■ ■ ■ ■ ■"); gotoxy(4, 9); puts("■ ■ ■ ■■■■■ ■■■■■"); for (int b = 0; b < 3; b++) { Sleep(1000); gotoxy(28 + (2 * b), 9); printf("●"); } } if (DanceTime > 0) { for (int a = 3; a < 10; a++) { gotoxy(0, a); puts(" "); } gotoxy(4, 3); puts(" ■■■ ■ ■■■■■ ■ ■■■■ ■ ■"); gotoxy(4, 4); puts("■ ■ ■ ■ ■■ ■ ■ ■ ■"); gotoxy(4, 5); puts("■ ■ ■ ■ ■ ■ ■ ■ ■"); gotoxy(4, 6); puts("■ ■ ■■■■■ ■■■■ ■■■■ ■ ■"); gotoxy(4, 7); puts("■ ■ ■ ■ ■ ■ ■ ■ ■"); gotoxy(4, 8); puts("■ ■ ■ ■ ■ ■ ■ ■ "); gotoxy(4, 9); puts(" ■■■ ■■■■■ ■■■■■ ■ ■ ■ ■ ● ●"); } Sleep(3000); }
수정사항,오류지적 감사합니다.
'프로그래밍 > C' 카테고리의 다른 글
[C][알고리즘] 선택 정렬(Selection Sort) (0) | 2019.04.12 |
---|
댓글