본문 바로가기

프로그래밍/시스템

[C] 술래잡기 게임

반응형

 

 

술래잡기.exe
다운로드

 

 

<메뉴> 

↑↓ 방향키로 조작

 

 

 

                                  <조작키>

[ 술래 ] 조작키 -  방향키

    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

 

 

 

 

 

 

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#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) ) ==  ) break;
    if(x1 == x2 && y1 == y2)  { victory = 1break; }
    // ---------------------
    
           } init(&x1 ,&y1 ,&x2 ,&y2 ,&second,victory); // 게임 set - 초기화  
           
    }  WHITE;
    
    
}
void map(void)
{
    int i;
    B_YELLOW; // 블럭 color : yellow 
    for(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,d 
        case '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 == 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

 

반응형