2010년 4월 17일 토요일

시간이 출력대고 박스가 움직이는 프로그램~

#include
#include
#include //_strtime()를 위해서 인클루드 함
#include // strtok(), atoi()를 위해서 인클루드 함

/*특수키 code값*/
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77

struct time{
unsigned int ti_hour;
unsigned int ti_min;
unsigned int ti_sec;
};

void gettime(struct time *); //현재시간을 구하는 구조체

void white(); //글자색을 하얗게
void red(); //글자색을 빨갛게

void gotoxy(int x, int y);
void draw(int,int,int,int);

void main(void)
{
int sx=38,ex=41,sy=9,ey=11; //중앙에 박스 그리기
char ch, ch1; //입력 문자 및 codekey 저장변수선언
int num; //특수키 code값 확인 변수 선언

unsigned int cti_sec; //이전생성된 초를 저장할 임시 저장소

struct time sttime; //시간 구조체
gettime(&sttime); // 시간을 구해옴

draw(sx,ex,sy,ey);

gotoxy(50,23);
white();
printf("현재시간 : %u 시 %u 분 %2u초\n", sttime.ti_hour, sttime.ti_min, sttime.ti_sec); //출력


cti_sec = sttime.ti_sec; //출력하고 그 시간 저장

while(1){ // esc의 아스키값 27이면 종료

gettime(&sttime); //시간을 구해옴

if(kbhit()){

ch = getch();

if(ch == 27){ gotoxy(1,25); break;} // Esc키 눌렸으면 종료

if(ch == -32 || ch == 0){ //특수키 값이면

ch1 = getch(); //특수키의 코드 값 받아서

num = ch1; //정수로 저장 해 놓고

/*각 방향키 위, 아래, 왼쪽, 오른쪽 키가 눌렸을시 행동 실행시 창으 최대 크기는 80 by 24로 본다.*/
/*각 벽에 상자가 붙을시 더옮기지 말라고 경고음을 주고 그래도 눌른다면 다시 벽에 붙은 사각형을 그려준다.*/

switch(num){ // 특수키 코드 값을 가지고 수행하러 간다.

case UP : //상자를 위로 한칸 이동
{
system("cls");
draw(sx,ex,sy-1,ey-1); //위로 박스를 올리면 시작과 끝의 y점의 수치가 감소.
Sleep(200);//박스가 그려지는 시간 지연
sy-=1; ey-=1;//그린후 좌표 기억

if(sy == 1) {
printf("\a");
system("cls");
draw(sx,ex,sy,ey);
} //경계선에 다으면 더입력하지 말라고 경고음을 낸다
else if(sy < 1) {
printf("\a");
system("cls"); //경고를 무시하고 눌를시 경계에 닿은 원을 그리고 좌표를 기억한다.
draw(sx,ex,sy+1,ey+1);
sy+=1; ey+=1;
}

gotoxy(50,23);
white();
printf("현재시간 : %u 시 %u 분 %2u초\n", sttime.ti_hour, sttime.ti_min, sttime.ti_sec); //출력
cti_sec = sttime.ti_sec; //출력하고 그 시간 저장
break;
}
case DOWN : //상자를 아래로 한칸 이동 시계라인과 겹치치 않게 경계선 22라인으로 올림
{
system("cls");
draw(sx,ex,sy+1,ey+1); //아래로 박스를 내리면 시작과 끝의 y점의 수치가 증가.
Sleep(200);//박스가 그려지는 시간 지연
sy+=1; ey+=1;

if(ey == 22) {
printf("\a");
system("cls");
draw(sx,ex,sy,ey);
} //끝라인경계선에 다으면 더입력하지 말라고 경고음을 낸다
else if(ey > 22) {
printf("\a");
system("cls"); //경고를 무시하고 눌를시 경계에 닿은 원을 그리고 좌표를 기억한다.
draw(sx,ex,sy-1,ey-1);
sy-=1; ey-=1;
}

gotoxy(50,23);
white();
printf("현재시간 : %u 시 %u 분 %2u초\n", sttime.ti_hour, sttime.ti_min, sttime.ti_sec); //출력
cti_sec = sttime.ti_sec; //출력하고 그 시간 저장
break;
}

case LEFT : //상자를 왼쪽으로 한칸 이동
{
system("cls");
draw(sx-1,ex-1,sy,ey); //왼쪽으로 박스를 옮기면 시작과 끝의 x점의 수치가 감소.
Sleep(200); //박스가 그려지는 시간 지연
sx-=1; ex-=1;

if(sx == 1) {
printf("\a");
system("cls");
draw(sx,ex,sy,ey);
} //경계선에 다으면 더입력하지 말라고 경고음을 낸다
else if(sx < 1) {
printf("\a");
system("cls"); //경고를 무시하고 눌를시 경계에 닿은 원을 그리고 좌표를 기억한다.
draw(sx+1,ex+1,sy,ey);
sx+=1; ex+=1;
}

gotoxy(50,23);
white();
printf("현재시간 : %u 시 %u 분 %2u초\n", sttime.ti_hour, sttime.ti_min, sttime.ti_sec); //출력
cti_sec = sttime.ti_sec; //출력하고 그 시간 저장
break;
}

case RIGHT : //상자를 오른쪽으로 한칸 이동
{
system("cls");
draw(sx+1,ex+1,sy,ey); //오른쪽으로 박스를 옮기면 시작과 끝의 x점의 수치가 증가.
Sleep(200); //박스가 그려지는 시간 지연
sx+=1; ex+=1;

if(ex == 80) {
printf("\a");
system("cls");
draw(sx,ex,sy,ey);
} //경계선에 다으면 더입력하지 말라고 경고음을 낸다
else if(ex > 80) {
printf("\a");
system("cls"); //경고를 무시하고 눌를시 경계에 닿은 원을 그리고 좌표를 기억한다.
draw(sx-1,ex-1,sy,ey);
sx-=1; ex-=1;
}

gotoxy(50,23);
white();
printf("현재시간 : %u 시 %u 분 %2u초\n", sttime.ti_hour, sttime.ti_min, sttime.ti_sec); //출력
cti_sec = sttime.ti_sec; //출력하고 그 시간 저장
break;
}
} //switch문 끝
} //if문 끝
}//if문 끝

else{
gotoxy(50,23);
if(cti_sec != sttime.ti_sec){ //새로 받아온 시간이 저장되어있던것과 다르면
printf("현재시간 : %u 시 %u 분 %2u초\n", sttime.ti_hour, sttime.ti_min, sttime.ti_sec); //출력
cti_sec = sttime.ti_sec; // 출력댄 시간 저장
}
}//else문 끝


} //while 블럭 끝
}


void draw(int sx,int ex,int sy,int ey)
{
int i,j,k;

gotoxy(sx, sy);
for(i=1 ; i <= ex-sx+1; i++){ //사각형 윗줄 시작부터 끝까지
white();
printf("*");
} //윗줄 출력

for(k=0 ; k <= ey-sy; k++){
gotoxy(sx,k+sy);
red();
printf("*");
gotoxy(ex,k+sy);
white();
printf("*");
} //왼쪽오른쪽 줄 출력
gotoxy(sx, ey);
for(j=1 ; j <= ex-sx+1; j++){
red();
printf("*");
} //아랫줄 출력

printf("\n");

}

void gotoxy(int x, int y)
{
COORD Pos = {x - 1, y - 1};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

void gettime(struct time *p) // 원본 데이터를 변환할수 있도록 Call by pointer 기법 사용
{

char temp[30];
char *cp;
_strtime( temp ); // temp char배열 안에 00:00:00(시:분:초)순의 문자열 상태로 저장

cp = strtok(temp, ":"); // temp배열의 첫번째 ':'까지 문자열를 끊어내어 cp에게 시에 해당하는 문자열의 시작주소를 리턴

p->ti_hour = atoi(cp); // 끊어낸 시에 해당하는 문자열을 정수형 데이터로 변환하여 p->ti_hour에 저장

cp = strtok(NULL, ":"); // temp배열의 두번째 ':'까지 문자열를 끊어내어 cp에게 분에 해당하는 문자열의 시작주소를 리턴

p->ti_min = atoi(cp); // 끊어낸 분에 해당하는 문자열을 정수형 데이터로 변환하여 p->ti_min에 저장

cp = strtok(NULL, ":"); // temp배열의 세번째 ':'까지 문자열를 끊어내려하나 ':'은 나타나지 않고 문자열이
// 끝나게 되므로 남은 문자열 전체를 리턴한다 즉, cp에게 초에 해당하는 문자열의 시작주소가 리턴한다.

p->ti_sec = atoi(cp); // 끊어낸 초에 해당하는 문자열을 정수형 데이터로 변환하여 p->ti_sec에 저장
}

void white() //글자색을 하얗게
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED| FOREGROUND_GREEN| FOREGROUND_BLUE);
}

void red() //글자색을 빨갛게
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
}

댓글 없음:

댓글 쓰기