<토이프로젝트>/[C++ 게임]

[C++ 게임] 콘솔 게임 관련 기본 함수들

BlockDMask 2020. 6. 1. 22:53
반응형

안녕하세요. BlockDMask 입니다.

C++ 게임 혹은 C언어로 만드는 간단한 콘솔게임에서 자주 쓰이는 함수들을 정리해봤습니다.

제 블로그 카테고리에 있는 콘솔 게임들에서 모두 아래의 함수들을 사용하고 있어서, 이번 페이지에 한번 정리를 해보았습니다.

<목차>

1. 커서 이동을 위한 gotoxy 함수

2. 입력을 받는 _getch() 함수 사용방법

3. 위아래 이동 판단 로직

 

1. gotoxy() 함수

 

▶ C/C++ gotoxy 함수

#include<Windows.h>

우리가 만든 프로젝트를 실행하게 되면 창이 하나 나오게 되는데요, 일반적으로 윈도우 창을 따로 실행시키지 않는이상 콘솔창이 나오게 됩니다.

콘솔 창에 깜빡깜빡 하는 " _ " 이렇게 생긴것을 커서라고 하는데요, 이 커서를 우리가 창 안에서 자유자재로 위치시키기 위한 함수 입니다.

정리 : gotoxy 함수는 커서를 특정 위치로 이동시키기 위한 함수 입니다.

 

void gotoxy(int x, int y)
{
    COORD Pos;        //x, y를 가지고 있는 구조체
    Pos.X = 2 * x;
    Pos.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

gotoxy 함수를 정의 할때 매개변수 x, y를 받도록 합니다. 우리가 사용할떄는 1,1로 가고싶다 이럴때 gotoxy(1,1) 이런식으로 사용할수 있도록 말이죠.

COORD 라는 구조체는 x, y 위치를 가지고 있는 구조체 입니다. 이 구조체 변수를 만들어서 x와 y를 채워 넣어 줍니다. 

2*x를 넣어주는 이유는 커서가 1씩 이동하는것보다 2씩 이동하는게 더 자연스러워 보이기 때문에 2*x를 넣어줍니다.

SetConsoleCursorPosition 함수는 이름에서 알수 있듯이 콘솔의 커서 위치를 알려주는 함수 입니다.

첫번째 매개변수로는 화면 출력 핸들러  GetStdHandle(STD_OUTPUT_HANDLE)를 넣어주고 

두번째 매개변수로는 위치를 나타내는 COORD 타입 변수인 Pos를 넣어줍니다.

첫번째 매개변수에는 을 넣습니다. STD_OUTPUT_HANDLE은 윈도우 베이스의 기본 출력을 뜻하는 매크로 이고, 그 매크로에 해당하는 핸들러를 GetStdHandle()로 받아옵니다. 이거는 그냥 "아 출력용 핸들러를 가지고 오는거구나" 하면 될것같습니다.

이렇게 커서를 이동시키는 함수를 완성했습니다.

 

 

2. 키보드 입력을 가지고 오는 _getch() 함수

 

▶ C/C++ _getch() 함수

#include<conio.h>

_getch() 함수는 사용자가 입력한 키에 대한 값을 아스키코드로 반환해주는 함수 입니다. (int 타입으로)

우리는 이걸 이용해서 사용자가 입력한 것에대한 것을 읽고 프로그램은 그에 맞는 동작을 하도록 할 것 입니다.

 

먼저 알아두어야 할 것은 아스키 코드 표를 보면 키보드 상하좌우에 대한 값이 나와있지 않습니다. (두둥.)

그럼 _getch()에서 키보드 화살표를 인식하지 못하는 걸까요?

아니겠죠..?

 

키보드에 입력이 →←↓↑ 키들이 오면 아스키 코드표에서는 표기할 수 없기 때문에 특별히 _getch()가 두번 출력을 하는데요.

224 를 뱉고 그 다음에 해당 키에 맞는 숫자를 뱉습니다.

정리하면 이렇습니다.

↑ : 224 -> 72

← : 224 -> 75

→ : 224 -> 77

↓ : 224 -> 80

 

코드에서 쉽게 사용하기 위해서 프로젝트에서는 enum과 메크로로 선언해두었습니다.

#define MAGIC_KEY 224    //상하좌우 화살표가 들어올때 선행되어 들어오는 숫자
#define SPACE 32        //스페이스 키 값

enum KEYBOARD
{
    UP = 72,
    LEFT = 75,
    RIGHT = 77,
    DOWN = 80
};

 

3. 메뉴에서 위아래 이동 판단 로직

 

키보드 입력을 받는 _getch() 함수와 커서를 이동시키는 gotoxy 함수를 이용해서 메뉴판 위아래로 움직이는 로직을 짜보자.

MENU ReadyGame()
{
   	int y = 0;				//위아래로 움직일 좌표
    int input = 0;          //키보드 입력을 받을 변수
    while (true)            //게임 루프
    {
        input = _getch();    //키보드 입력을 받았다.
        //→←↑↓
        if (input == MAGIC_KEY)    //받았는데 224네?
        {
            switch (_getch())    //그럼 한번더 받아보자 상하좌우 일수 있으니.
            {
            case UP:            //위
                --y;
                break;
            case DOWN:            //아래
                ++y;
                break;
            }
        }
    }
}

자 함수를 살펴보면 y가 이제 커서의 위치를 나타내는 곳이고, gotoxy로 위치를 계속 받고 있습니다.

그리고 _getch()를 이용해서 y의 위치를 ++, -- 하거나 해도 됩니다.

좌우가 필요하면 LEFT, RIGHT 를 이용해서 x값을 추가해도 되겠죠?

 

어렵진 않으시죠? 충분히 분석해보신 후에도 코드가 이해가지 않는다면 댓글로 질문 남겨주세요.

반응형