Closed powerslam closed 1 year ago
처음 뱀의 크기가 머리 포함 길이 3이어야 하니까 Linked List를 사용하여 Snake의 머리(1)와 몸통(2)을 표현하면 될거 같습니다. 화살표 입력 처리의 경우 int key = getch();을 사용하여 화살표 키에 대한 처리를 하면 될거 같네요. tick의 경우 속도가 느리면 난이도가 쉬워지고, 속도가 빠를수록 snake가 빨리 움직여 게임의 난이도가 올라갑니다. 타 게임을 참고해본 결과 난이도가 쉬우면 0.5 ~ 1초, 좀 어려우려면 0.5초 이하로 설명하면 될것 같습니다.
뱀의 위치 정보를 배열에 저장하고 이동할 때마다 뱀의 위치 정보 배열을 순회하며 정보를 업데이트할 수 있습니다. 하지만, 다음과 그림과 같이 생각해보면
뱀이 앞(왼쪽 방향)으로 이동할 때, 꼬리는 삭제되고 머리가 새로 앞에 삽입되는 형태로 이동하는 것을 알 수 있습니다.
따라서, 앞, 뒤 부분에서 삽입/삭제가 빈번하게 일어날 때 사용하면 좋은 deque 자료구조를 사용하는 것이 좋을 것 같습니다.
뱀의 이동방향을 결정 짓는 것은 게임에서 흔히 사용되는 WASD 키나 방향키를 사용하면 될 것 같습니다.
timeout 함수를 쓰면 편하지만, 입력이 들어올 때마다 뱀이 움직일 수 있다. 그래서 C++ 라이브러리인 chrono를 사용해서 시간이 300ms 마다 뱀의 위치를 업데이트 하는 것으로 한다. 이러면 문제가 getchar 가 사용자의 입력을 무한 대기한다는 점인데, ncurses 라이브러리의 nodelay 함수를 사용하면 getchar 의 입력여부에 상관없이 프로그램이 작동하게 된다.
"=="는 위에서 나온 아이디어와 같아서 비워뒀습니다.
게임이 시작할 때 SNAKE의 몸통의 길이 2를 포함한 전체 길이가 3이므로 SnakeGame()에서 for문을 for(int i = 1; i < 3; i++)으로 수정하면 2단계 구현은 문제 없는 것 같습니다.
지금 코드는 SnakeGame안에 모든 로직이 포함되어 있는데, SnakeGame 안에는 최대한 게임의 진행에 관한 코드만 작성하여 기능의 구분을 명확하게 하는 것이 좋아보임. 그래서 이번에 추가한 Snake 코드를 Snake class로 분리하는 수정을 거치는 게 좋을 것 같음
맵 위에 Snake를 표시하고, 화살표를 입력받아 Snake가 움직이게 하기