본문 바로가기

Programming

[C++] Matrix(1)

#include <iostream>

#include <cstdlib>

#include <ctime>

#include <conio.h>

#include <windows.h>


using namespace std;

//처음엔 출력을 cout으로 하려 했으나 객체를 출력으로 쓰는것과 함수를 출력으로 쓰는게 얼마나 속도차이가 큰지 크게 느꼈음... 결국 전부 printf()로 바꿈


#define random(num) (rand()%(num))

#define MAX 1024

#define LEFT 75

#define RIGHT 77

#define UP 72

#define DOWN 80

#define ESC 27


struct Signal

{

BOOL exist;                // 신호의 존재 여부

char ch;                 // 출력할 문자

int x,y;                   // 현재 좌표

int distance;           // 이동할 거리

int nFrame;                 // 속도

int nStay;               // 속도에 대한 카운트

};

Signal S[MAX];


//c언어에서 gotoxy함수가 없길래 다른곳에서 구함.

void gotoxy(int x, int y)

{

COORD pos = {x, y};

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

}


//글자를 매트릭스영화처럼 녹색으로 해보고싶어서 구현. setcolor(10,0)하면 녹색인데...밑에 글자도 녹색이되서 ㅠ

void setcolor(int color, int bgcolor) 

{

color &= 0xf;

bgcolor &= 0xf;

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), (bgcolor << 4) | color);

}



void main()

{

int i;

int ch;

int freq=15;

int frame=200;


srand(time(0));


system("cls");

gotoxy(0,23);

cout<<"매트릭스 흉내내기. 상하:속도 증감, 좌우:빈도 증감, ESC:종료";


for (;;) 

{

gotoxy(60,23);

printf("속도:%d, 빈도:%d ",frame,freq);

//kbhit()함수는 키보드가 눌려져있는지 안눌려져있는지 bool형 함수인데, conio.h에 들어있다. conio.h를 안쓰고 직접 구현해서 써보고 싶으나 어떻게 구성되어있는지 전혀 알수가 없음.

if (kbhit()) 

{

ch=getch();

if (ch == 0xE0)

{

ch=getch();

switch (ch)

{

case UP:

frame=min(frame+10,1000);

break;

case DOWN:

frame=max(frame-10,10);

break;

case RIGHT:

freq=max(freq-1,1);

break;

case LEFT:

freq=min(freq+1,30);

break;

}

}

else 

{

if (ch == ESC)

{

return;

}

}

}


// 새로운 신호 생성

if (random(freq) == 0) 

{

for (i=0;i<MAX;i++)

{

if (S[i].exist == FALSE)

{

S[i].exist=TRUE;

S[i].ch=random('Z'-'A'+1)+'A';

S[i].x=random(80);

S[i].y=0;

S[i].distance=random(14)+9;

S[i].nFrame=S[i].nStay=random(15)+5;

break;

}

}

}


// 주기가 다 된 신호 이동 및 제거 처리

for (i=0;i<MAX;i++)

{

if (S[i].exist == FALSE)

continue;

if (--S[i].nStay == 0) 

{

S[i].nStay=S[i].nFrame;

gotoxy(S[i].x,S[i].y);

putch(' ');

if (++S[i].y < S[i].distance) 

{

gotoxy(S[i].x,S[i].y);

putch(S[i].ch);

}

else 

{

S[i].exist=FALSE;

}

}

}

}

}





'Programming' 카테고리의 다른 글

[perl] webhacking 4번 http get request  (3) 2012.12.10
[C++] 스택사이즈 변경(stack size)  (0) 2012.11.06
[C++] Shooting Game  (0) 2012.06.01
[C++] 리눅스 gotoxy();  (0) 2012.05.29
[C++] 리눅스 gotoxy, move  (0) 2012.05.29