티스토리 뷰

완성 :  https://puyo.cspc.me

NCURSES


터미널상에 뿌요뿌요 테트리스 같은 그래픽을 구현하기 위해선 printf 같은 함수로는 한계가 있다. 따라서 ncurses 라이브러리를 이용하여 화면을 띄울 스크린을 생성하고 원하는 좌표에만 게임을 출력한다.

 

 

NCURSES을 사용하여 구현할 목록

 

  1. 그래픽 구현
  2. 색깔 출력

 

 

1. 그래픽 구현

 

ncurses 사용 방법

#include <ncurses.h>

int main(){
    initscr();
	
    move(0,0);
    printw("hello");
    move(1,0);
    printw("Hi");
    move(2,0);
    printw("bye");
    refresh();
    getch();
    endwin();
    return 0;
}

 

  • WINDOW initscr(void);

화면을 띄울 스크린을 초기화 한다. 

 

  • int move(int y, int x);

해당 좌표에 커서를 넘겨준다. 첫 번째 인자에는 y좌표, 두 번째 인자에는 x좌표를 파라미터로 가진다.

 

  • int printw(const char *fmt, ...);

현재 커서의 위치에 문자열을 출력한다. 사용방법은 printf 함수와 동일하게 사용하면 된다.

 

  • refresh();

실제로 printw 함수를 실행한다고 바로 화면에 문자열이 출력되는 것이 아니라 refresh 함수를 호출하여야 화면상에 출력이 된다.

 

  • endwin()

프로그램을 종료하기전 원래의 터미널로 돌아가기 위해서 반드시 호출해야 하는 함수이다.

 

출력을 확인해볼 시간도 없이 종료되는 것을 방지하고자 getchar 함수로 입력받을 때까지 대기한다.

 

 

 

<위의 코드 실행>

 

 

 

 

2.  터미널에 색깔 출력하기

#include <ncurses.h>

int main(){
	initscr();
	start_color();
	init_pair(1,COLOR_RED,COLOR_YELLOW);
	init_pair(2,COLOR_BLUE,COLOR_BLACK);
	init_pair(3,COLOR_GREEN,COLOR_BLACK);
	init_pair(4,COLOR_YELLOW,COLOR_BLACK);
	init_pair(5,COLOR_WHITE,COLOR_BLACK);
    
	for(int i= 0 ; i < 5 ; i++){
		move(i,0);
		attron(COLOR_PAIR(i+1));
		printw("pair : %d color",i+1);
	}
	refresh();
	getch();
	endwin();
	return 0;
}

 

출력

  • int start_color(void)

색깔을 출력을 하기 위해서 이 함수를 호출해야 한다.

 

  • int init_pair(short pair, short f, short b);

색깔 페어를 초기화 하는 함수이다. 첫 번째 인자에는 pair의 번호를, 두 번째 인자에는 글자의 색깔, 세 번째 인자에는 배경색을 지정한다.

 

  • int attron(int attrs); 
  • int attroff(int attrs);

printw 함수 출력전 속성을 키고 끄는 함수이다. 인자로 COLOR_PAIR을 넣어주면 앞에 초기화 해주었던 pair의 속성이 활성화 된다.

 

 

 

 

 

 

구현


 

void DrawField(char f[HEIGHT][WIDTH]){
	int i,j;
	for(j=0;j<HEIGHT;j++){
		move(j+1,1);
		for(i=0;i<WIDTH;i++){
			if(field[j][i]){
				if(field[j][i] == XBLOCK){
					attron(A_REVERSE);
					printw("X");
					attroff(A_REVERSE);
				}
				else{
					attron(COLOR_PAIR(f[j][i]));
					attron(A_REVERSE);
					printw(" ");
					attroff(A_REVERSE);
					attron(COLOR_PAIR(5));
				}
			}
			else printw(" ");
		}
	}
}

필드의 정보를 실시간으로 출력하는 함수

 

 

void DrawOutline(){	
	int i,j;
	/* 블럭이 떨어지는 공간의 태두리를 그린다.*/
	DrawBox(0,0,HEIGHT,WIDTH);

	/* next block을 보여주는 공간의 태두리를 그린다.*/
	move(2,WIDTH+10);
	printw("NEXT BLOCK");
	DrawBox(3,WIDTH+10,4,8);

	/* score를 보여주는 공간의 태두리를 그린다.*/
	move(9,WIDTH+10);
	printw("SCORE");
	DrawBox(10,WIDTH+10,1,8);
}

테두리를 그리기 위한 함수

 

 

 

void DrawBox(int y,int x, int height, int width){
	int i,j;
	move(y,x);
	addch(ACS_ULCORNER);
	for(i=0;i<width;i++)
		addch(ACS_HLINE);
	addch(ACS_URCORNER);
	for(j=0;j<height;j++){
		move(y+j+1,x);
		addch(ACS_VLINE);
		move(y+j+1,x+width+1);
		addch(ACS_VLINE);
	}
	move(y+j+1,x);
	addch(ACS_LLCORNER);
	for(i=0;i<width;i++)
		addch(ACS_HLINE);
	addch(ACS_LRCORNER);
}

원하는 좌표에 박스를 그리는 함수

 

 

 

void DrawField(char f[HEIGHT][WIDTH]){
	int i,j;
	for(j=0;j<HEIGHT;j++){
		move(j+1,1);
		for(i=0;i<WIDTH;i++){
			if(field[j][i]){
				attron(COLOR_PAIR(f[j][i]));
				attron(A_REVERSE);
				printw(" ");
				attroff(A_REVERSE);
				attron(COLOR_PAIR(5));
			}
			else printw(" ");
		}
	}
}

현재 내려가고 있는 블럭을 출력하는 함수

 

 

 

구현

 

 

 

코드 :  https://github.com/ljy2855/puyo_tetris

 

ljy2855/puyo_tetris

Contribute to ljy2855/puyo_tetris development by creating an account on GitHub.

github.com

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함