코딩/C++

[C++] 키 인식

Hun die 2022. 4. 13. 17:17

 

_getch();

_getch 는 표준 입력과는 달리 값을 저장하지 않고 즉시 반환한다.

즉 엔터를 누르지 않아도 키를 누르면 바로 다음으로 넘어가게 된다.

 

#include <conio.h>​​

_getch() 를 사용하기 위해선 #include <conio.h>​ 헤더파일이 필요하다.

그리고 입력한 값의 데이터 타입에 따라 표시가 달라진다.

    int key1 = _getch(); //int로 받기
    cout << key1 << endl;
    
    char key2 = _getch();//char로 받기
    cout << key2 << endl;

 

결과

a를 두번 누른 결과

여기서  char형은 제대로 a로 표시 되었지만, int타입 a는 왜 97로 표시가 될까?

 

답은 아스키코드를 확인하면 알 수 있다.

a 십진법으로 바꾸면 97이기 때문이다.

이외에 여러 특수문자나 영어를 10진법이나 16진법으로 바꿔서 사용할 수 있다.

 

 

연습 1

A ~ Z 키 중에 하나를 정답으로 설정한다.
하나의 키를 입력해서 설정된 값을 맞춘다.
입력한 키와 설정된 값이 맞으면 승리를 출력하고 프로그램 종료하고
틀리면 남은 기회를 보여주고, 5번 틀리면 정답을 알려주고 게임오버를 출력한다.
+ 추가로 틀릴 때마다 정답 알파뱃이 입력된 알파뱃 앞에있는지 뒤에있는지 힌트를 준다.
+ 추가로 입력된 값이 대소문자 구분없이 처리될 수 있도록 수정 해보자.
    int answer;
    int key2;
    int chance = 5;

    srand(time(NULL));
    answer = rand()% 26 + 65;

    do
    {
        cout << "A ~ Z중 하나를 입력";
        int key = _getch();
        key2 = key;

        if (key2 > 96)
        {
            key2 -= 32;
        }
        cout << endl;
        if (key2 != answer)
        {
            key2 > answer?
            cout << "정답은 " << (char)key2 << "보다 낮습니다.\n" 
           :cout << "정답은 " << (char)key2 << "보다 높습니다.\n";
            cout << chance - 1 << "번의 기회가 남았습니다.\n" << endl;
        }
        chance--;
        if (chance==0)
        {
            break;
        }
    } while (key2 != answer);
    
    if (key2 != answer)
    {
        cout << "정답은 " << (char)answer << endl;
        cout << "GAME OVER" << endl;
    }
    else
    {
        cout << "정답" << endl;
    }

결과

 

연습 2

콘솔용 탈출게임 10 * 10 크기의 맵을 구성한다.
(2차원 배열) 플레이어가 존재한다.(0, 0)
탈출구가 존재한다.(0, 0)을 제외한 랜덤 설정
WASD 키입력을 통해 플레이어를 이동시킨다.
플레이어가 탈출구에 도달하면 "탈출 성공" 출력 후 종료
SYSTEM("cls"); 를 이용해 콘솔 초기화를 사용한다.
string map[10][10];
    int x, y;
    int px, py;
    int key2;
    px = 0; py = 0;

    srand(time(NULL));
    
    for (int i = 0; i < 10; i++)// 지형 배치
    {
        for (int j = 0; j < 10; j++)
        {
            map[i][j] = "#";
        }
    }

    do// 플레이어, 출구 배치
    {
        x = rand() % 10;
        y = rand() % 10;
    } while (x == 0 && y == 0);
    
    map[x][y] = "E";
    
    while (true)
    {
        map[px][py] = "O";

        system("cls");
        for (int i = 0; i < 10; i++)// 맵 깔기
        {
            for (int j = 0; j < 10; j++)
            {
                cout << map[i][j];
            }
            cout << endl;
        }
        if (px == x && py == y)
        {
            cout << "탈출 성공!";
            break;
        }
        int key = _getch();

        map[px][py] = "#";

        if (key < 96)
        {
            key += 32;
        }
        switch (key)
        {
        case 97: //a
            if (py != 0)
            {
                py -= 1;
            }
            break;
        case 115: //s
            if (px != 9)
            {
                px += 1;
            }
            break;
        case 100: //d
            if (py != 9)
            {
                py += 1;
            }
            break;
        case 119: //w
            if (px != 0)
            {
                px -= 1;
            }
            break;
        default:
            break;
        }
    }

결과

시작화면

 

ASDW로 이동한 화면
탈출에 성공한 화면

 

'코딩 > C++' 카테고리의 다른 글

[C++] 동적 배열 만들기  (0) 2022.06.15
[C++] 구조체  (0) 2022.04.18
[C++] 배열  (0) 2022.04.13
[C++] 제어문  (0) 2022.04.12
[C++] 난수 생성  (0) 2022.04.11