티스토리 뷰
완성 : https://puyo.cspc.me
NCURSES
터미널상에 뿌요뿌요 테트리스 같은 그래픽을 구현하기 위해선 printf 같은 함수로는 한계가 있다. 따라서 ncurses 라이브러리를 이용하여 화면을 띄울 스크린을 생성하고 원하는 좌표에만 게임을 출력한다.
NCURSES을 사용하여 구현할 목록
- 그래픽 구현
- 색깔 출력
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
'프로젝트 > 뿌요뿌요 테트리스' 카테고리의 다른 글
[Puyo tetris] #3 멀티를 위한 서버 구현 (socket) (0) | 2023.07.20 |
---|---|
[Puyo tetris] #2 뿌요뿌요 게임 로직을 코드로 구현하기 (signal) (2) | 2021.11.22 |
[Puyo tetris] #0 터미널 상에서 뿌요뿌요를 구현해보자 (게임 설명, 구현 목록) (0) | 2020.12.26 |
- Total
- Today
- Yesterday
- pintos
- 싸지방
- codeanywhere
- Web
- 웹IDE
- FastAPI
- letsencrypt
- 구름ide
- 프로젝트
- 백준
- 코딩
- 정보보호병
- 서버 관리
- 앱
- 사이버정보지식방
- System call
- Django
- react
- 토이프로젝트
- 리눅스
- 시간 초과
- 런타임 에러
- 분할 정복
- 뿌요뿌요
- Python
- C
- pvm
- 뿌요뿌요 테트리스
- ttyd
- 해커톤
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |