[snake] 2-1. 뱀을 이동시켜보자

11318 단어 CC

타이틀만들기

타이틀은 그냥 텍스트 파일을 읽어오는 방식으로 만들었다. 하드코딩으로 때려박기보다는 텍스트로 읽어오는게 나중에 수정하기 편할 것 같았다.

일단 타이틀을 다음과 같이 만들었다.

■■■■■■■■■■■■■■■■■■■■■■■■■
■ 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의 값을 가진다.

데이터 처리 로직과 출력은 다음 포스트에 게시하겠다

좋은 웹페이지 즐겨찾기