레이블이 Reference Library인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Reference Library인 게시물을 표시합니다. 모든 게시물 표시

2010년 5월 23일 일요일

setcursortype(커서on/off)

콘솔창에서는 주로 문자를 입출력하는데 다음 입출력될 위치는 커서가 가리킨다. 사용자는 주기적으로 깜박거리는 커서를 보고 자신이 입력한 문자가 이 위치에 나타난다는 것을 알 수 있으며 또한 다음 출력될 위치도 알게 된다. 통상적인 경우 커서는 꼭 필요하지만 게임같은 경우에는 커서가 오히려 게임 진행에 방해가 되므로 표시하지 않는 것이 더 좋다. 14장의 여러 게임들을 실행해 보면 커서가 보이지 않는데 커서가 있는 상태로 게임을 실행해 보면 이 함수가 왜 필요한지를 알 수 있을 것이다.

setcursortype 함수는 커서의 형태를 변경하는데 괄호안의 인수로 NOCURSOR를 전달하면 커서가 사라지고 NORMALCURSOR라고 주면 커서가 다시 나타난다. 게임을 시작하기 전에 커서를 없애 버리는 것이 좋고 게임이 끝날 때 다시 나타나도록 한다. 물론 커서는 잠시 숨겨지는 것이지 커서 자체가 없어지는 것은 아니다. 커서는 보통 문자 아래쪽의 얇은 두 줄로 표시되는데 SOLIDCURSOR로 지정하면 문자 높이만큼의 크기를 가진다.

#include <stdio.h>
#include <conio.h> //getch()
#include <windows.h> //SetConsoleCursorInfo(), GetStdHandle(), CONSOLE_CURSOR_INFO

#define TRUE 1
#define FALSE 0
typedef enum {NOCURSOR, SOLIDCURSOR, NORMALCURSOR}CURSOR_TYPE;

void setcursortype(CURSOR_TYPE);

void main()
{
 setcursortype(NORMALCURSOR);
 printf("Normal cursor type.\n");
 getch();
 setcursortype(SOLIDCURSOR);
 printf("Big cursor type\n");
 getch();
 setcursortype(NOCURSOR);
 printf("No cursor type\n");
 getch();
 setcursortype(NORMALCURSOR);
}

void setcursortype(CURSOR_TYPE c)
{
 CONSOLE_CURSOR_INFO Curinfo; // console sursor 구조체
 switch(c)
 {
 case NOCURSOR:
  Curinfo.dwSize = 1; //cursor size
  Curinfo.bVisible = FALSE; // cursor 안보임
  break;
 case SOLIDCURSOR:
  Curinfo.dwSize = 100;
  Curinfo.bVisible = TRUE;
  break;
 case NORMALCURSOR:
  Curinfo.dwSize = 20;
  Curinfo.bVisible = TRUE;
  break;
 }
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Curinfo);
}
/* GetStdHandle(STD_OUTPUT_HANDLE) : 현제 console의 handle을 구하는 함수
SetConsoleCursorInfor(consoleHandle, consoleCursorInformationStruct)
*/

kbhit()

키보드의 키가 눌러져 있는지 아닌지만을 조사한다. 눌러졌으면 참의 값을 리턴하고 그렇지 않을 경우에는 거짓의 값을 리턴한다. getch는 키가 눌러질 때까지 대기하므로 프로그램 실행을 블록시키는 특성이 있어 키 입력과 무관하게 연속적으로 실행되어야 하는 게임에서는 부적당하다. 다음이 이 함수의 가장 전형적인 사용예이다.

 

if (kbhit()) ch=getch();

 

보통 if 조건문과 함께 사용되며 키가 눌러져 있을 때만 getch 함수를 호출하여 눌러진 키를 조사한다.

gotoxy()

콘솔 화면은 일반적으로 가로로 80개의 문자를 표시할 수 있고 세로로 25줄을 출력할 수 있다. 윈도우즈의 콘솔은 설정하기에 따라 더 넓은 폭을 가질 수도 있고 스크롤도 가능하지만 여기서는 도스나 유닉스의 콘솔과 비슷하다고 생각하기로 하자. 콘솔은 80*25의 바둑판같은 좌표 공간이라고 할 수 있는데 각 위치는 x축과 y축의 좌표값을 가진다. 그림으로 그려 보면 다음과 같을 것이다.

 좌상단의 원점 좌표가

(0,0)이 되며 우하단은 (79,24)가 되고 중앙의 좌표는 (40,12) 정도가 될 것이다. 콘솔 화면으로의 모든 출력은 항상 커서가 있는 현재 위치를 참조하도록 되어 있으며 printf로 문자열을 출력하면 현재 위치에 문자열이 출력된다. 모든 출력문들은 현재 커서 위치에 문자열을 출력하며 출력한 후 커서를 다음 위치로 옮겨 주는데 커서는 왼쪽에서 오른쪽으로, 위에서 아래로 마치 타자기에 글씨를 써

 

 내려가는 것처럼 움직인다. 그래서 printf를 계속 호출하면 연속적으로 문자열이 출력된다.

 

gotoxy 함수는 커서의 위치, 그러니까 다음 문자열이 출력될 좌표값을 바꾼다. 인수로 옮기고자 하는 x, y 좌표를 지정하면 커서가 이동하며 이어지는 출력은 이 위치로 나가게 된다. 현재 위치가 아닌 특정 위치에 출력하고 싶다면 출력 명령을 사용하기 전에 gotoxy로 원하는 좌표값을 지정한다. 다음 예제는 화면을 깨끗하게 지운 후 중앙에 문자열을 출력한다.

 

#include <stdio.h>
//nclude <conio.h>
#include <windows.h>
void gotoxy(int x, int y)             /* 커서이동 함수 부분 */
{
    COORD XY = {x-1, y-1};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), XY);
}

int main(void)
{
 
 gotoxy(37,12);
 
 printf("center\n");
 
 return 0;
}
깨끗한 화면 중앙에 "center"라는 문자열이 출력될 것이다. 수평 중앙 좌표는 40이지만 center가 6자의 길이를 가지므로 t자가 40좌표에 올 수 있도록 3만큼 더 뺀 위치에 출력했다. 커서를 옮기는 것은 그 자리에 어떤 출력을 하기 위해서이므로 gotoxy 다음에는 거의 항상 printf나 puts같은 출력 명령이 뒤따른다.

clrscr()

Clear Screen의 약자이며 이름 그대로 화면을 깔끔하게 지우고 커서를 화면 좌상단으로 옮긴다. 화면에 이미 출력된 내용을 지우고 새로운 내용을 출력하고자 할 때 이 명령을 사용한다. 특별한 형식은 없고 일종의 함수이므로 뒤에 빈 괄호와 세미콜론만 붙이면 된다. 즉 언제든지 clrscr(); 만 호출하면 화면이 깨끗하게 지워진다.

#include <stdio.h>
#include <conio.h>
#include <windows.h>
void gotoxy(int x, int y)             /* 커서이동 함수 부분 */
{
    COORD XY = {x, y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), XY);
}

int main(void)
{
 
  printf("1\n");
  system("cls"); // clrscr()로 대체 conio.h 파일 포함!
  gotoxy(37,12);
 
  printf("center\n");
 
 return 0;
}

퀵소트 qsort(내, 오름차순)

@내림차순

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char compare(const void *a, const void *b)
{
 return (*(char *)b - *(char *)a) ;//*(char*)강제 캐스팅 해주어야 함
}
 
void main()
{
 char str[]={1,2,3,4,5,6,7,8,9,10};
 int i;
 qsort(str,sizeof(str),sizeof(char),compare);//시작주소, 문자열길이 , 자료형크기, 비교함수
 for(i = 0; i < sizeof(str);i++)
 printf("%d ",str[i]);
}

 

@오름차순

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char compare(const void *a, const void *b)
{
 return (*(char *)b - *(char *)a) ;//*(char*)강제 캐스팅 해주어야 함
}
 
void main()
{
 char str[]={1,2,3,4,5,6,7,8,9,10};
 int i;
 qsort(str,sizeof(str),sizeof(char),compare);//시작주소, 문자열길이 , 자료형크기, 비교함수
 for(i = 0; i < sizeof(str);i++)
 printf("%d ",str[i]);
}