무슨 일로 C 하셨습니까?

[C] 키보드 이벤트 본문

C - 이걸 굳이?/유틸리티

[C] 키보드 이벤트

OJJJ 2021. 1. 25. 16:20

scanf() 함수를 쓰게되면 콘솔에 키보드 입력을 할 수 있다.

 

그러나 이러한 방식은 입력된 내용을 엔터 쳐서 넘기는 것인데

 

이러한 입력말고 콘솔창에서 키보드 입력에 즉각적으로 반응하도록 만들고 싶다.

 

거두절미하고 일단 만들어 보자

 


#include <stdio.h>

void f() {
	int key;

	while (1) {
		key = getch();

		printf("%d\n", key);
		}
	}
}

단순하다. key라는 변수가 getch()를 통해 입력을 하나씩 받으면 된다.

 

이런식으로 하나씩 다 찍어보면 키보드의 각 키들이 어떠한 입력을 나타내는지 알 수 있다.

 

이렇게 찍어보면 알 수 있는건 각 알파벳 키들이 아스키 코드와 일치한다는 점이고 엔터가 개행문자로 입력된다는 것 또한 알 수 있다.

 

그런데 특정 키는 224로 같은 값이 찍히는 것을 알 수 있다.

(방향키와 같은 특수키의 경우 그렇다는 데 방향키 말고는 본적이 없다.)

 

이러한 방향키의 값 또한 알아내고자 한다면

#include <stdio.h>

void d() {
	int key;

	while (1) {
		key = getch();

		printf("%d", key);

		// 방향키 & 특수키
		if (key == 224)
		{
			key = getch();

			printf(" %d\n", key);
		}

		else {
			puts("");
		}
	}
}

이렇게 입력을 두번 받아서 출력해보면 되겠다.

 

이걸 활용하면

#include <stdio.h>
#include<Windows.h>
#include<io.h>

void d() {
	int key;
	int x = 0, y = 0;

	
	COORD pos = { x,y };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 3);

	system("cls");

	while (1) {
		key = getch();
		system("cls");

		// 방향키 & 특수키
		if (key == 224)
		{
			key = getch();
			switch (key) {
			case 72:        // 상
				if(y>0)
					y--;
				break;
			case 75:        // 좌
				if (x > 0)
					x--;
				break;
			case 77:        // 우
				x++;
				break;
			case 80:        // 하
				y++;
				break;
			default:
				break;
			}
			pos.X = x;
			pos.Y = y;
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
			printf("●");
		}
	}
}

방향키를 누를때마다 동그라미가 돌아다니게 만들 수 있다.

 

이걸 잘 활용해서 게임이든 뭐든 만들 수 있다. 추후에 잘 활용해 보도록 하겠다.

Comments