STUDY/C, C++

[C] _getch를 사용한 움직임 구현

sinawi95 2021. 4. 28. 08:06
728x90

 

#include<stdio.h>
#include<Windows.h>
#include<conio.h>
///////////////////////////////////////////////////////////////////////
/* 커서 설정 */
typedef enum { NOCURSOR, SOLIDCURSOR, NORMALCURSOR } CURSOR_TYPE;
void setcursortype(CURSOR_TYPE c) {
	CONSOLE_CURSOR_INFO CurInfo;
	switch (c)
	{
	case NOCURSOR:
		CurInfo.dwSize = 1;
		CurInfo.bVisible = FALSE;
		break;
	case SOLIDCURSOR:
		CurInfo.dwSize = 100;
		CurInfo.bVisible = TRUE;
		break;
	case NORMALCURSOR:
		CurInfo.dwSize = 20;
		CurInfo.bVisible = TRUE;
		break;
	default:
		break;
	}
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &CurInfo);
}
////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////
/* 커서의 움직임 구현 */
void gotoxy(int x, int y) {
	COORD CursorPosition = { x, y };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), CursorPosition);
}
/////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////
int main(void) {
	setcursortype(NOCURSOR); // cursor 안보이게 설정
	int x = 0, y = 0;
	int key;
	gotoxy(x, y);
	printf("@");
	while (1) {
		key = _getch();
		
		gotoxy(x, y);
		printf(" ");
		if (key == 224) {
			key = _getch();
		}
		switch (key) {
		case (int)'w': case 72:
			if (y > 0) y--;
			break;
		case (int)'s': case 80:
			if (y < 24) y++;
			break;
		case (int)'a': case 75:
			if (x > 0) x--;
			break;
		case (int)'d': case 77:
			if (x < 79) x++;
			break;
		}
		gotoxy(x, y);
		printf("@");
	}
	
	return 0;
}
/////////////////////////////////////////////////////////////////////////

 

주로 봐야할건 main 함수부분이다.

처음 cursor가 위치한 부분은 0, 0이고 커서를 0,0 으로 움직이고 해당 위치를 @ 로 나타낸다.

처음 시작 위치

while 문을 사용하여 루프를 계속 돌며(Polling) key의 값이 들어오는지 확인하고 해당 key에 맞게 cursor를 옮긴다.

key값을 _getch() 함수를 사용해서 받아온다. 

getch 함수는 conio.h에 있고 입력을 숫자로 반환하는 함수이다. getch()를 사용하면 에러가 뜨므로 앞에 언더바를 붙여서 사용하자.

키보드 입력을 받아서 switch를 이용해 wasd와 화살표로 상하좌우를 판단한다. 이때 화살표는 _getch를 두번 받아서 두번째 값을 사용한다. (F1 같은 펑션키도 마찬가지이다.)

반복문을 돌때마다 현재 있는 위치는 지우고 새로운 위치(입력이 없으면 현재위치)에 @를 작성한다

 

움직인 위치

 


참고한 블로그

더보기

'STUDY > C, C++' 카테고리의 다른 글

[C] scanf 개행 문자 처리  (0) 2021.06.09
[C/C++] 버블 정렬, 카운트 정렬  (0) 2021.06.03
[C/C++] 숫자퍼즐게임  (0) 2021.05.11
[C] C 프로그래밍 문법 (1)  (0) 2021.03.31
[C] 개발환경 구축  (2) 2021.03.31