Language/C, C++, C#

[C] 방향키로 printf() 커서 위치 이동 (gotoxy)

byunghyun23 2020. 6. 9. 02:43

MFC(Microsoft Foundation Class Library)를 사용하지 않는다면 C언어를 이용하여 GUI를 구성하는 것은 불가능하다.

바람의 나라 등 2D 게임을 만들 때 캐릭터가 이동하기 위해서는 좌표가 필요한데,

CLI 환경에서 2D 게임을 흉내낼 수 있는 gotoxy() 함수에 대해 알아보자. 

 

  1. 함수 정의
      • 이름은 gotoxy()가 아니더라도 상관 없음
      • SetConsoleCursorPosition() : 콘솔 커서 위치 변경
    gotoxy() 정의
  2. 사용법
    • x, y값에 이동하고자 하는 좌표를 매개변수로 전달

 

예제를 통해 확인해보자.

소스 코드는 아래와 같다.

 

#include <stdio.h>

#include <Windows.h>

#define MAX_X 60

#define MAX_Y 20



void gotoxy(int x, int y)

{

    COORD Pos;

    Pos.X = x;

    Pos.Y = y;

    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}



int main() {

    int X = (MAX_X / 2) + 2;

    int Y = (MAX_Y / 2) + 1;

    int site;



    while (1) {

        gotoxy(0, MAX_Y + 1);

        printf("X coord : %d\n", X);

        printf("Y coord : %d\n", Y);

        gotoxy(X, Y);

        printf("나");



        site = getch();



        switch (site) {

            case 224:                           // arrow keys

                site = getch();

                switch (site) {

                    case 72:                    // top

                        if (Y != 0) {

                            Y--;

                        }

                        break;

                    case 75:                    // left

                        if (X != 0) {

                            X--;

                        }

                        break;

                    case 77:                    // right

                        if (X != MAX_X) {

                            X++;

                        }

                        break;

                    case 80:                    // bottom

                        if (Y != MAX_Y) {

                            Y++;

                        }

                        break;

                    default:

                        break;

                }

            default:

                break;

        }



        system("cls");

    }

}

 

gotoxy()에서 SetConsoleCursorPosition()를 사용하기 위해서 먼저 Windows 헤더파일을 include 해야 한다.

커서 위치 디폴트 값은 x, y 모두 0으로 시작하며 최댓값을 별도로 설정한다. (x = 60, y = 20)

좌표를 중앙으로 설정 후 시작하며 방향키 입력에 따라 커서 이동과 좌표를 출력한다.

방향키는 유니코드이며 1byte씩 두 번 값을 읽어 처리한다. 첫 1byte가 십진수 224값일 경우 방향키로 예상 가능하다.

두 번째 1byte의 값이 72, 75, 77, 80일 경우 각각 top, left, right, bottom으로 판단할 수 있다. 그에 따라 x, y좌표 값을

변경해주면 된다.

 

다음과 같이 응용해 볼 수도 있다.