[snake] 2-1. 뱀을 이동시켜보자
타이틀만들기
타이틀은 그냥 텍스트 파일을 읽어오는 방식으로 만들었다. 하드코딩으로 때려박기보다는 텍스트로 읽어오는게 나중에 수정하기 편할 것 같았다.
일단 타이틀을 다음과 같이 만들었다.
■■■■■■■■■■■■■■■■■■■■■■■■■
■ Snake Game ■
■■■■■■■■■■■■■■■■■■■■■■■■■
press any key to continue
콘솔창에 띄우면 snake game 문구가 가운데에 있는것 처럼 보인다.
graphic 클래스에 속해있는 타이틀 함수에서 이 파일을 읽어 콘솔창에 띄워준다.
graphic.cpp
void graphic::title() { ifstream TitleFile("./graphic/format.txt"); if(TitleFile.is_open()) { while(!TitleFile.eof()) { string str; getline(TitleFile,str); cout<<str<<endl; } TitleFile.close(); } }
입력받기
이제 입력을 처리해본다. 스네이크 게임은 방향키 입력으로만 진행하기 때문에 방향키값만 알아내면 된다.
비주얼 c++에서는 getch()라는, 단일 키 입력을 지원한다. 그러나 리눅스/mac 환경에서는 이 함수를 지원하지 않는다. 그래서 직접 함수를 구현해야한다.
int Maingame::getch(void)
{
int ch;
struct termios old;
struct termios newone;
tcgetattr(0, &old);
newone = old;
newone.c_lflag &= ~(ICANON | ECHO);
newone.c_cc[VMIN] = 1;
newone.c_cc[VTIME] = 0;
tcsetattr(0, TCSAFLUSH, &newone);
ch = getchar();
tcsetattr(0, TCSAFLUSH, &old);
return ch;
}
아주 다행이도 관련 코드를 인터넷에서 찾을 수 있었다. 출처 소스코드를 참고한다면 주의할 점이 몇가지 있는데, 헤더를 찾지 못한다면 terminos.h를 사용하여야 하고, c++을 사용하고 있다면 new는 동적할당 키워드이기 때문에 다른 변수이름을 사용해야 한다.
지금 생각해 보면 graphic 클래스를 출력만 담당하는 클래스가 아닌 입력도 같이 받는 클래스로 만들었어야 했던 것 같다. 나중에 수정해봐야겠다.
입력을 처리하기
입력을 성공적으로 받았으니 이를 처리해주어야 한다. 리눅스에서 방향키는 2바이트로 이루어져있기 때문에 getch()함수를 두번 실행해 방향키를 처리한다.
maingame.cpp
Mv_dir Maingame::input() { while(1) { int tmp = getch(); if(tmp == 91) { tmp = getch(); if(tmp == 68&&this->UserInfo->getdir() != Mv_dir::right) { cout<<"left"<<endl; return Mv_dir::left; } else if(tmp == 67&&this->UserInfo->getdir() != Mv_dir::left) { cout<<"right"<<endl; return Mv_dir::right; } else if(tmp == 66&&this->UserInfo->getdir() != Mv_dir::down) { cout<<"up"<<endl; return Mv_dir::up; } else if(tmp == 65&&this->UserInfo->getdir() != Mv_dir::up) { cout<<"down"<<endl; return Mv_dir::down; } } } }
방향키들은 첫번째 바이트에 91이 들어가고, 두번째 바이트에 68~65의 값을 가진다.
데이터 처리 로직과 출력은 다음 포스트에 게시하겠다
Author And Source
이 문제에 관하여([snake] 2-1. 뱀을 이동시켜보자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@head022/snake-2-1.-뱀을-이동시켜보자저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)