c언어 -테트리스 만들기2 위치 지정하기, 키보드로 움직이기

2022. 1. 28. 18:53C언어

728x90

_kbhit( ): 입력했는 지 여부 확인

int kbhit(void)의 형태이다. 

반환값은 입력 하였을 경우 : 1, 입력하지 않았을 경우 :0 

(# include <conio.h>를 통해 헤더파일 선언)

 

_getch( ): 입력을 받는 함수

scanf_s( )와 다른 점은 입력한 키보드의 내용이 화면에 출력되지 않는 다는 점과, Enter키를 통해 입력을 확인하지 않고 키를 누른 순간 입력 버퍼에 값이 들어가는 것이다.

 

int main(void)
{
    printMapBoundary();
    int key;
    int currentPosX=10;
    int currentPosY=1;
    gotoxy(10,1);
    printf("■");
    while (1)
    {
        if (_kbhit())
        {
            key = _getch();
            switch (key)
            {
            case 72:
                // 위로 이동
                gotoxy(currentPosX, currentPosY);
                printf("  ");
                currentPosY -= 1;
                gotoxy(currentPosX, currentPosY);
                printf("■");
                break;

            case 80:
                // 아래로 이동
                gotoxy(currentPosX, currentPosY);
                printf("  ");
                currentPosY += 1;
                gotoxy(currentPosX, currentPosY);
                printf("■");
                break;

            case 75:
                // 왼쪽으로 이동
                gotoxy(currentPosX, currentPosY);
                printf("  ");
                currentPosX -= 1;
                gotoxy(currentPosX, currentPosY);
                printf("■");
                break;

            case 77:
                // 오른쪽으로 이동
                gotoxy(currentPosX, currentPosY);
                printf("  ");
                currentPosX += 1;
                gotoxy(currentPosX, currentPosY);
                printf("■");
                break;

            default:
                break;

            }

            


        }
    }
    

    return 0;
}

테트리스 1 에서 만든 테두리는 printMapBoundary함수로 만들었다.

gotoxy함수로 시작지점을 지정해주었다.

_getch( )함수를 이용하여 방향키를 입력받았다.

방향키 같은 경우 아스키코드에  "up : 224, 72 / down : 224, 80 / left : 224, 75 // right : 224, 77"라고 정의되어있다.

처음에 key에 입력되는 224는 default로 처리되고 그 다음에 오는 값들이 방향키로 받아들여진다.

 

자취가 사라지게 현재위치에 공백을 출력해준다.

 

실행하면...

테두리에 벗어날 수 있게 움직일 수 있다는 문제가 있다.

그렇다면 , 테두리에 벗어나는 영역에서 움직이지 못하게 해야한다.

void gotoxy_(int x, int y)
{
    COORD Pos;
    Pos.X = x;
    Pos.Y = y;
    if (Pos.X < 1 || Pos.X>19) return;
    if (Pos.Y < 1 || Pos.Y>19) return;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

gotoxy함수에서 제한을 주려고 하였지만, gotoxy함수는 테두리를 만들 때도 써서 건드리면 안된다.

 

따라서, 이동하는 목적으로 사용할 함수를 따로 만들어야한다.

실패했다..ㅋㅋ

return되면 다음 줄이 실행되기 때문에 안된다. 아예 return될 시에 switch문을 벗어나야된다.

 

int main(void)
{
    printMapBoundary();
    int key;
    int currentPosX=10;
    int currentPosY=1;
    gotoxy(10,1);
    printf("■");
    while (1)
    {
        if (_kbhit())
        {
            key = _getch();
            switch (key)
            {
            case 72:
                // 위로 이동
                if (currentPosY == 1) break;
                gotoxy_(currentPosX, currentPosY);
                printf("  ");
                currentPosY -= 1;
                gotoxy_(currentPosX, currentPosY);
                printf("■");
                break;

            case 80:
                // 아래로 이동
                if (currentPosY == 19) break;
                gotoxy_(currentPosX, currentPosY);
                printf("  ");
                currentPosY += 1;
                gotoxy_(currentPosX, currentPosY);
                printf("■");
                break;

            case 75:
                // 왼쪽으로 이동
                if (currentPosX == 2) break;
                gotoxy_(currentPosX, currentPosY);
                printf("  ");
                currentPosX -= 1;
                gotoxy_(currentPosX, currentPosY);
                printf("■");
                break;

            case 77:
                // 오른쪽으로 이동
                if (currentPosX == 18) break;
                gotoxy_(currentPosX, currentPosY);
                printf("  ");
                currentPosX += 1;
                gotoxy_(currentPosX, currentPosY);
                printf("■");
                break;

            default:
                break;

            }

            


        }
    }
    

    return 0;
}

각 방향키를 누를 때마다 맨위 아래 양 옆에서는 해당 방향키를 못 누르게 설정했다.

 

이상입니다.

728x90