반응형
<메뉴>
↑↓ 방향키로 조작
<조작키>
★ [ 술래 ] 조작키 - 방향키
P [ * ] 조작키 - a w s d
술래가 Player를 20초안에 못잡으면 패배하며
Player는 20초동안 술래로부터 도망쳐야 함.
< 사용된 함수 >
void gotoxy(int x,int y)
{
COORD Cur = {x-1,y-1};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Cur);
}
void gotoxy ( int x , int y ) |
콘솔에서 커서 위치 설정 - <windows 헤더파일 필요> |
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),num)
> 콘솔 글씨 색깔 또는 배경색깔 변경 <windows 헤더파일 필요>
색상종류 (num)
배경색깔과 글씨색깔을 혼용해서 쓰고 싶을 때 배경색[n] + 글씨색[n]을 하면된다.
예를 들어 빨간색 글씨(12)에 배경색깔은 연두색(160)으로 하고싶다면
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),160+12);
int kbhit ( void ) |
키보드를 눌렀는지 확인하는 함수 (입력이 있으면 1을 반환 , 그렇지 않으면 0을 반환) |
int getch ( void ) |
입력값을 받는 함수다. scanf랑 다른점은 입력시 화면에 출력되지 않고 입력버퍼에 들어간다는 점이다. |
< 제한시간 구현에 사용된 함수 >
DWORD GetTickCount ( void ) - typedef unsigned long DWORD; |
OS부팅할 때부터 지나간 시간을 msec 단위로 돌려주는 함수이다. |
그 외 스레드를 이용해서 구현할 수도 있다.
1. void Sleep ( DWORD msec ) 단위 m/s 2. void sleep ( DWORD second ) 단위 m/s |
1. 1000(m/s) 단위 2. 초(s) 단위 |
< 방향키 아스키코드 >
방향키 아스키코드는 입력 값 2개가 들어감.
방향키 | 입력 값 2개 |
LEFT(←) | 224 | 75 |
RIGHT(→) | 224 | 77 |
UP(↑) | 224 | 72 |
DOWN(↓) | 224 | 80 |
> 그 외 SPACE - 32 , ENTER - 13
더보기
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 #include <stdio.h>#include <stdlib.h>#include <windows.h>#include <conio.h>#define LEFT 75#define RIGHT 77#define UP 72#define DOWN 80#define ENTER 13#define X1_POS 20#define Y1_POS 13#define X2_POS 45#define Y2_POS 5#define RED SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),12)#define GREEN SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),10)#define WHITE SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15)#define B_YELLOW SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),224);void gotoxy(int x,int y){COORD Cur = {x-1,y-1};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Cur);}int select_menu(void);void map(void);void move(int *x1 , int *y1 , int *x2 , int *y2);int Count(int *Second , int *time);void init(int *x1 , int *y1 , int *x2 , int *y2,int *second , int victory);int main(){int select , victory;int x1=X1_POS,y1=Y1_POS , x2=X2_POS,y2=Y2_POS; // player 1 , 2 - 시작위치int time , second = 0; WHITE;while(select_menu() == 1){map();while(1){if (kbhit()) move(&x1 ,&y1 ,&x2 ,&y2); // 캐릭터 이동// Count && 승패여부판정if (GetTickCount()-time>=1*60*20)if ( ( victory = Count(&second,&time) ) == 0 ) break;if(x1 == x2 && y1 == y2) { victory = 1; break; }// ---------------------} init(&x1 ,&y1 ,&x2 ,&y2 ,&second,victory); // 게임 set - 초기화} WHITE;}void map(void){int i;B_YELLOW; // 블럭 color : yellowfor(i=0; i<40; i++) printf("□");for(i=0; i<20; i++) { gotoxy(1,i); printf("□"); }for(i=0; i<38; i++) printf("□");for(i=0; i<20; i++) { gotoxy(79,i); printf("□"); }WHITE;gotoxy(45,23); printf("\b( 20초 버티면 * 승 )");gotoxy(2,22); printf("술래 [★] 조작키 [ ←↑→↓]");gotoxy(2,23); printf(" P [*] 조작키 [ a w s d ]");gotoxy(X1_POS,Y1_POS); RED; printf("★");gotoxy(X2_POS,Y2_POS); GREEN; printf("*");}int select_menu(void){char cc = UP;int select = 0;printf("\n\n\t\t\t Press Enter Key\n\n\t\t\t\t시작 [ ]\n\n\n\t\t\t\t종료 [ ]");do // 메뉴선택{GREEN; // 아이콘(◀) 색깔 GREEN으로 변경if(cc == UP) { gotoxy(39,8); printf(" "); gotoxy(39,5);printf("◀\b"); gotoxy(39,5); select = 1;}else if (cc == DOWN) {gotoxy(39,5); printf(" "); gotoxy(39,8);printf("◀\b"); gotoxy(39,8); select = 0;}}while( ENTER != (cc = getch()) );system("cls");return select; // 1이면 시작 , 0이면 종료}void move(int *x1 , int *y1 , int *x2 , int *y2){switch(getch()){ // 키 입력받기// 술래 이동키 : 방향키case LEFT : if (*x1 > 3) { RED; --(*x1); gotoxy(*x1,*y1); printf("★"); } break;case RIGHT : if (*x1 < 77){ RED; ++(*x1); gotoxy(*x1,*y1); printf("★"); } break;case UP : if (*y1 > 2) { RED; gotoxy(*x1,*y1); printf(" "); --(*y1); gotoxy(*x1,*y1); printf("★"); } break;case DOWN : if (*y1 < 18 ) { RED; gotoxy(*x1,*y1); printf(" "); ++(*y1); gotoxy(*x1,*y1); printf("★"); } break;// player 이동키 : w,a,s,dcase 'a' : if (*x2 > 3) { GREEN; --(*x2); gotoxy(*x2,*y2); printf("*"); } break;case 'd' : if (*x2 < 77) { GREEN; ++(*x2); gotoxy(*x2,*y2); printf("*"); } break;case 'w' : if (*y2 > 2) { GREEN; gotoxy(*x2,*y2); printf(" "); --(*y2); gotoxy(*x2,*y2); printf("*"); } break;case 's' : if (*y2 < 18 ) { GREEN; gotoxy(*x2,*y2); printf(" "); ++(*y2); gotoxy(*x2,*y2); printf("*"); } break;} // UP DOWN 할 때 잔상이 생기므로 이전 좌표에 남아있는 잔상 제거WHITE;}int Count(int *Second , int *time){*time = GetTickCount();gotoxy(45,22); // 15초가 지나면 초(second) color RED로 변경if (*Second < 14) { WHITE; printf("%d 초가 지났습니다.",++(*Second)); }else { RED; printf("%d ",++(*Second)); WHITE; printf("초가 지났습니다."); }if( *Second > 19 ) return 0; // 제한시간 20초 경과시 술래 패배}void init(int *x1 , int *y1 , int *x2 , int *y2 , int *second , int victory){system("cls");if ( victory == 1 ) printf("\n\n\n\t\t\t\t- ▲ 술래 승 ▲ -\n");else printf("\n\n\n\t\t\t\t- ▲ Player 승 ▲ -\n");printf("\n\t\t 메뉴로 돌아가시려면 Enter를 누르세요.");while( ENTER != getch() );system("cls");*x1=X1_POS,*y1=Y1_POS , *x2=X2_POS,*y2=Y2_POS , *second=0; // 변수 초기화}cs
반응형
'프로그래밍 > 시스템' 카테고리의 다른 글
[C-알고리즘] 그레이 코드 (0) | 2017.07.21 |
---|---|
[C-알고리즘] 이분검색 (0) | 2017.07.19 |
[C] atoi - itoa (문자열을 정수로 , 정수를 문자열로 변환) (0) | 2017.07.05 |
[C-알고리즘] 석차구하기 (0) | 2017.06.27 |
[C-알고리즘] 수열 문제 (0) | 2017.06.26 |