白狐白
접속 : 1337   Lv. 50

Category

Profile

Counter

  • 오늘 : 88 명
  • 전체 : 80571 명
  • Mypi Ver. 0.3.1 β
[잡담] 밤 새서 끝낸 오늘 내야 할 과제 (1) 2014/06/08 AM 10:32
#include
#include
#include
#include
#include
#include
#include

#define LEFT 75 // 확장키 정의
#define RIGHT 77
#define UP 72
#define DOWN 80
#define SPACE 32
#define ESC 27
#define X_MAX 37 // x, y값 한계 정의
#define Y_MAX 23

int over = 0; // 1일 때 게임오버
int speed = 1; // 자동차 이동 속도 관련 함수
int car[10][18][20] = {0}; // 자동차 배열 초기화

void moving();
void pause();

void gotoxy(int x, int y) // 커서 움직임
{
COORD Pos = {x - 1, y - 1};
SetConsoleCursorp-osition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

void removeCursor(void) // 커서 안보임
{
CONSOLE_CURSOR_INFO curInfo;
GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo);
curInfo.bVisible=0;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo);
}

void move_arrow_key(char key, int *x1, int *y1, int x_b, int y_b, int stage, int life, int clear[]) // 방향키 이동
{
switch(key)
{
case UP:
*y1 = *y1 - 1;
if (*y1 < 4)
{
*y1 = 3;
}
if (*x1%4 == 3)
{
if (*y1 < 4) *y1 = 4;
}
gotoxy(*x1, *y1);
break;
case LEFT:
*x1 = *x1 - 2;
if (*x1 < 1) *x1 = 1;
gotoxy(*x1, *y1);
break;
case RIGHT:
*x1 = *x1 + 2;
if (*x1 > x_b) *x1 = x_b;
gotoxy(*x1, *y1);
break;
case DOWN:
*y1 = *y1 + 1;
if (*y1 > y_b) *y1 = y_b;
gotoxy(*x1, *y1);
break;
case ESC: // esc 눌렀을때 일시정지
pause(stage, life, clear);
default:
break;
}
}

void Exit() // 메뉴화면 종료
{
system("cls");
gotoxy(10, 12);
printf("게임 종료");
gotoxy(10, 13);
printf("아무 키나 누르세요...");

getch();
exit(1);
}

void menu() // 메뉴화면
{
int a;
int x = 16, y = 10;
int choice = 1;
char key;
int stage = 0;
int life = 5;
int clear[10] = {0,0,0,0,0,0,0,0,0,0};
FILE *fp;

system("cls");

gotoxy(18, 10);
printf("새 게임");
gotoxy(18, 12);
printf("하던 게임");
gotoxy(18, 14);
printf("나가기 ");
gotoxy(14, 10);
printf(">>");

while (1)
{
if (kbhit())
{
do
{

key = getch();

if (key == UP)
{
y -= 2;
choice --;
if (y < 10)
{y = 10, choice = 1;}
printf("\b\b ");
gotoxy(x-2, y);
printf(">>");
}

if (key == DOWN)
{
y += 2;
choice ++;
if (y > 14)
{y = 14, choice = 3;}
printf("\b\b ");
gotoxy(x-2, y);
printf(">>");
}

if (key == SPACE)
{
switch (choice)
{
case 1 :
over = 0; moving(stage, life, clear);
case 2 :
for (a = 0; a < 10; a ++)
fp=fopen("save.txt", "r"); // 파일 입력 과정

if (fp == NULL)
break;
while (!feof(fp))
fscanf(fp, "%d %d %d %d %d %d %d %d %d %d %d %d", &stage, &life, &clear[0], &clear[1], &clear[2], &clear[3], &clear[4], &clear[5], &clear[6], &clear[7], &clear[8], &clear[9]);
fclose(fp);
moving(stage, life, clear);
break;
case 3 : Exit();
default : break;
}
}
} while(key != 27);
}
}
}

void pause(int stage, int life, int clear[]) // 일시정지 화면
{
int a;
int x = 14, y = 10;
int choice = 1;
char key;
FILE *fp;

system("cls");

for (a = 0; a < 10; a ++)
{
printf("%d ", clear[a]);
}

gotoxy(16, 10);
printf("스테이지 다시하기");
gotoxy(16, 14);
printf("저장 후 종료");
gotoxy(12, 10);
printf(">>");

while (1)
{
if (kbhit())
{
do
{
key = getch();

if (key == UP)
{
y = 10;
choice = 1;
printf("\b\b ");
gotoxy(x-2, y);
printf(">>");
}

if (key == DOWN)
{
y = 14;
choice = 2;
printf("\b\b ");
gotoxy(x-2, y);
printf(">>");
}

if (key == SPACE)
{
switch (choice)
{
case 1 : moving(stage, life, clear);
case 2 :
fp = fopen("save.txt", "w"); // 파일 출력 과정
fprintf(fp, "%d %d %d %d %d %d %d %d %d %d %d %d", stage, life, clear[0], clear[1], clear[2], clear[3], clear[4], clear[5], clear[6], clear[7], clear[8], clear[9]);
fclose(fp);
Exit();

default : break;
}
}

} while(key != 27);
}
}
}

void prame(int *life) // 화면 모습
{
int a;

gotoxy(1, 1);
printf("LIFE : ");
switch (*life)
{
case 5 : printf("♥♥♥♥♥"); break;
case 4 : printf("♥♥♥♥♡"); break;
case 3 : printf("♥♥♥♡♡"); break;
case 2 : printf("♥♥♡♡♡"); break;
case 1 : printf("♥♡♡♡♡"); break;
default : break;
}
gotoxy(1, 2);
printf("─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬");

for(a = 1; a <= 40; a ++)
{
if (a % 4 == 3)
{
gotoxy(a, 3);
printf("│");
}
}
}

void gameover(int *life) // 게임 오버 화면
{
int x1 = 19, y1 = 23;
int a;

if (*life == 0)
{
system("cls");

x1 = 19, y1 = 23;

gotoxy(12, 12);
printf("GAME OVER...");
Sleep(1000);
gotoxy(12, 13);
printf("아무 키나 누르세요.");
getch();

over = 1;
*life = 5;

system("cls");
menu();
}
}

void Clear(int *x1, int *y1, int *stage, int *life, int clear[]) // 개구리가 끝까지 갔을 경우에 관한 함수
{
int a;

for (a = 0; a < 10; a ++)
{
if (clear[a] == 1)
{
gotoxy(a*4 + 1, 3);
printf("△");
}
}

if (*y1 == 3)
{
if (clear[*x1/4] == 1) // 이미 한 번 들어간 곳으로 가면 실패
{
*life = *life - 1;
*x1 = 19, *y1 = 23;
gotoxy(*x1, *y1);
}


else
{
switch (*x1/4) // 빈 곳으로 들어갔을때 성공
{
case 0 :
*stage = *stage + 1;
*x1 = 19, *y1 = 23;
clear[0] = 1;
gotoxy(*x1, *y1);
break;
case 1 :
*stage = *stage + 1;
*x1 = 19, *y1 = 23;
clear[1] = 1;
gotoxy(*x1, *y1);
break;
case 2 :
*stage = *stage + 1;
*x1 = 19, *y1 = 23;
clear[2] = 1;
gotoxy(*x1, *y1);
break;
case 3 :
*stage = *stage + 1;
*x1 = 19, *y1 = 23;
clear[3] = 1;
gotoxy(*x1, *y1);
break;
case 4 :
*stage = *stage + 1;
*x1 = 19, *y1 = 23;
clear[4] = 1;
*x1 = 19, *y1 = 23;
break;
case 5 :
*stage = *stage + 1;
*x1 = 19, *y1 = 23;
clear[5] = 1;
gotoxy(*x1, *y1);
break;
case 6 :
*stage = *stage + 1;
*x1 = 19, *y1 = 23;
clear[6] = 1;
gotoxy(*x1, *y1);
break;
case 7 :
*stage = *stage + 1;
*x1 = 19, *y1 = 23;
clear[7] = 1;
gotoxy(*x1, *y1);
break;
case 8 :
*stage = *stage + 1;
*x1 = 19, *y1 = 23;
clear[8] = 1;
gotoxy(*x1, *y1);
break;
case 9 :
*stage = *stage + 1;
*x1 = 19, *y1 = 23;
clear[9] = 1;
gotoxy(*x1, *y1);
break;
default :
break;
}
}
}
}

void End() // 목표 달성
{
system("cls");
gotoxy(15, 12);
printf("CALER");
gotoxy(15, 13);
Sleep(1000);
printf("아무 키나 누르세요.");

getch();
menu();
}

void Car() // 자동차 배열 설정
{
int i, j, k, l;
int swit = 1;

srand(time(NULL));

for (i = 0; i < 10 ; i ++)
{
for (j = 0; j < 19; j ++)
{
for (k = 0; k < 20; k ++)
{
for (l = 0; l < rand()%3 + 1; l ++)
{
car[i][j][k] = swit;
k ++;

if (k > 20)
break;
}

switch (swit)
{
case 0 :
swit = 1;
break;
case 1 :
swit = 0;
break;
}
}
}
}
}

void moving(int stage, int life, int clear[]) // 자동차 움직임
{
int a;
int x, y;
int j, k;
int x1 = 19, y1 = 23;
char key;

system("cls");
Car();

gotoxy(x1, y1);
printf("◎");

while(1)
{
x = 1, y = 4;

prame(&life);
gameover(&life);
Clear(&x1, &y1, &stage, &life, clear);

gotoxy(30, 1);
printf("STAGE : %d", stage+1);

if (over == 1)
break;

if (y1 == 3)
{
stage ++;
x1 = 19, y1 = 23;
}

gotoxy(x, y);

if (kbhit()) // 특수키 입력
{
do
{
gotoxy(x1, y1);
printf("△");
key = getch();
printf("\b ");
move_arrow_key(key, &x1, &y1, X_MAX, Y_MAX, stage, life, clear);

gotoxy(x, y);

break;

} while(key != 27);
}

for (j = 0; j < 19; j ++) // 자동차 출력
{
for (k = 0; k < 20; k ++)
{
if (car[stage][j][k] == 0)
{
gotoxy(k*2+1, j+4);
printf("■");
}
else
{
gotoxy(k*2+1, j+4);
printf(" ");
}
}

gotoxy(x1, y1);
printf("△");

if (y1 < 23 && y1 > 5 && car[stage][y1-4][x1/2] == 0)
{
life --;
x1 = 19, y1 = 24;
gotoxy(x1, y1);
}
}

if (speed == 15-stage) // 자동차 움직임
{
for (j = 0; j < 19; j ++)
{
for (k = 0; k < 20; k ++)
{
if (car[stage][j][k] == 0)
{
gotoxy(k*2+1, j+4);
printf("■");
}
else
{
gotoxy(k*2+1, j+4);
printf(" ");
}
}

if (j % 2 == 1)
{
a = car[stage][j][19];

for (k = 19; k >= 0; k --)
{
car[stage][j][k] = car[stage][j][k-1];

if (k == 0)
car[stage][j][k] = a;
}
}

else
{
a = car[stage][j][0];

for (k = 0; k < 20; k ++)
{
car[stage][j][k] = car[stage][j][k+1];

if (k == 19)
car[stage][j][k] = a;
}
}

gotoxy(x1, y1);
printf("△");
}
speed = 0;
}

else
speed ++;

if (stage > 9) // 10스테이지까지 (stage는 0부터)
{
End();
stage = 0;
break;
}
}
}

int main()
{
system("mode con cols=40 lines=24"); // 콘솔 창 크기

removeCursor();
menu();

return 0;
}

---------------------------------------------------------------------------------

혼돈! 파괴! 망가!!

참 우여곡절이 많은 녀석이에요.

전역변수를 썼는데 일정 확률로 지 멋대로 변하지를 않나.

이제 처음으로 쓰는 양식없는, 보고서랑 발표 과제만 만들면 되네요.

:Q...

신고

 

퐄샄    친구신청

(이......이게뭐야.....)
X