본문 바로가기
프로그래머의 길/C & C++

콘솔상에서 상자를 그려 위치 이동시키는 프로그램

by 제이콥케이 2007. 3. 23.
반응형

#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>

#define ESC  27
#define UP  72
#define DOWN 80
#define LEFT 75
#define RIGHT 77

void textcolor(int i);
void gotoxy(int x, int y);
void box(int start_x, int start_y, int end_x, int end_y);

void textcolor(int i)
{
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), i);
}

void gotoxy(int x, int y)
{
 COORD Pos = {x, y};
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

void box(int start_x, int start_y, int end_x, int end_y)
{
 int i, color=10;
 //color = rand() % 100;
 textcolor(color);
 
 for(i=start_y+1; i<end_y; i++)
 {
  gotoxy(start_x, i);
  printf("x");
  gotoxy(end_x, i);
  printf("x");
 }

 for(i=start_x; i<=end_x; i++)
 {
  gotoxy(i, start_y);
  printf("x");
  gotoxy(i, end_y);
  printf("x");
 }
 printf("\n");  
}

int main()
{
 int start_x, start_y, end_x, end_y;
 int ch;

/*
 //방향키 아스키 코드 알아보기
 while(1)
 {
  ch = getch();
  printf("%d\n", ch);
 }
*/

 srand(time(NULL));

 start_x = rand() % 10;
 start_y = rand() % 10;
 
 end_x = 10 + rand() % 65;
 end_y = 10 + rand() % 13;

 box(start_x, start_y, end_x, end_y);

 while(1)
 {
  ch = getch();
  system("cls");
 
  if(ch == 224)  // 특수키는 리턴값이 2개다 ㅡㅡ;
   ch = getch();
  else if(ch == ESC)
  {
   box(start_x, start_y, end_x, end_y);
   exit(1);
  }
  else
  {
   box(start_x, start_y, end_x, end_y);
   continue;
  }

  /*
  if(ch == 224)  // 특수키는 리턴값이 2개다 ㅡㅡ;
  {
   ch = getch();
   ch<<=8;  // 8bit를 비트이동 시켜서 고유 값은 만든다.
  }
  이 값을 헤더 파일로 만들어(key.h) 사용하기도 한다.

  #define ESC  27
  #define UP  0x4800
  #define DOWN 0x5000
  #define LEFT 0x4b00
  #define RIGHT 0x4d00
  */

  switch(ch)
  {
  case UP:  // 위
   start_y--;
   end_y--;
   box(start_x, start_y, end_x, end_y);
   break;

  case LEFT:  // 왼쪽
   start_x--;
   end_x--;
   box(start_x, start_y, end_x, end_y);
   break;  

  case RIGHT:  // 오른쪽
   start_x++;
   end_x++;
   box(start_x, start_y, end_x, end_y);
   break;  

  case DOWN:  // 아래
   start_y++;
   end_y++;
   box(start_x, start_y, end_x, end_y);
   break;  
  }   
 }
 return 0;
}

반응형