프로그래밍/C
[C언어 프로젝트] 메이플스토리 구애의춤
[잉간]
2017. 11. 17. 09:55
메이플스토리의 구애의 춤을 만들어 보았습니다.
모양에 맞는 방향키를 누르시면 됩니다.
클리어 화면입니다.
소스코드입니다.
#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);
}
수정사항,오류지적 감사합니다.