'방향키'에 해당되는 글 1건

  1. 2006.05.04 C언어 콘솔프로그램에서 방향키 제어 2



키보드에는 방향키가 있습니다.(→←↑↓) 이것을 코드값을 이용해서 입력 받는 방법을 알아보겠습니다.

방향키의 코드값이 아스키코드에 있다면 getch()함수를 이용해서 쉽게 해결할 수 있겠지만, 아스키값에는 방향키가 없습니다. 그래서 다른 것을을 이용해서 방향키의 코드값을 입력 받아야합니다.

http://www.lookuptables.com/ ->"Scan Codes & EBCDIC" -> "IBM Scan Codes"를 이용합니다...

그곳에서 보면 10진수 값만을 따졌을 경우에 아래와 같이 각각의 코드값이 나옵니다.

UP = (00, 72), LEFT = (00, 75), RIGHT = (00, 77), DOWN = (00, 80)

즉, 방향키는 2개의 값을 가지고 있습니다. 예를 들어 다시 설명하면 "UP" 방향키를 눌렀을때 발생하는 코드값은 처음에 00을 리턴하고 그 다음에는 72를 리턴합니다.

리턴값이 2개이니까 간단히 설명하면 두번 입력을 받아주면 됩니다.

하나의 예를 들어보자면 char형으로 ch라는 변수를 선언한 후에 "ch=getch();"라는 명령어가 있다면 커서가 깜박일때 "A"를 눌렀다면 엔터를 칠 필요도 없이 "A"의 값이 ch변수에 들어갑니다.

그럼 원래의 목적인 방향키로 가봅니다. 위에서 말씀드렸듯이 방향키는 값을 2개 리턴하므로 getch()함수를 두번 쓰면 됩니다.

int형으로 cursor이라는 변수를 선언했다고 가정후에 아래와 같이 사용하면 cursor의 최종값은 방향키의 2번째 리턴값이 들어갑니다. 예를 들어 "UP" 방향키를 눌렀다면 cursor의 최종값은 72가 되겠죠...

int cursor=getch();
if (cursor==0 || cursor==0x00)
    cursor=getch();

프로그램이 실행되다가 소스의 첫번째 줄을 만나면 사용자에게 뭔가를 입력하라고 커서가 깜박이겠죠...

이때 방향키가 아닌 그냥 알파벳이나 숫자를 넣으면 해당되는 아스키값이 들어가겠죠...

그러나 방향키를 입력하면 리턴값이 2개니까 첫번째 줄을 실행하면서 첫번째 리턴값인 "00"을 cursor 변수에 넣습니다. 그리고 if문을 실행하면서 cursor값이 0인지를 검사합니다.

"00==0" 즉, 조건이 참이되므로 세번째 줄에 있는 getch()함수를 실행하겠죠...

세번째 줄에 있는 getch()문은 따로 입력 받는 것이 아니고 첫번째 줄에서 입력했던 방향키 값중에 두번째 리턴값을 자동으로 넘겨받게됩니다...

그래서 최종값이 "UP"키를 눌렀다는 가정하에 72가 되는것입니다....

이렇게 입력을 받았다면 이후에는 각각의 경우에 할일을 만들어 주면 되겠죠...

그리고 조건문중에 0x00부분도 있는데 이것은 0의 16진수입니다...저런식으로 같이 써주면 좋겠죠...

또한 저는 vc++7.0이라서 그냥 저렇게 했을때 작동을 했는데...어떤 사람은 vc++에서 "00"이 리턴이 안되고 "?"가 리턴이 된다는 사람도 있더군요....이 경우에는 조건문에 ?를 추가로 입력하면 됩니다.

첨부 파일은 위의 내용을 적용한 예제 프로그램입니다.

프로그램을 실행후에 방향키를 움직이면 방향키를 누른데로 *표가 움직입니다.

P.S *표의 위치를 표시하기 위해 터보C에서 쓰이는 gotoxy() 함수사용...vc++등의 개발툴에는 없는 함수이므로 www.winapi.co.kr에서 헤더파일 구해서 사용함...

Posted by Gungume
,