심화반 예제 (스네이크 게임)

구글에서 "스네이크 게임"으로 검색하면 나오는 게임을 C++로 구현해 보았습니다.



게임의 규칙은 뱀을 이동시켜 랜덤하게 등장하는 먹이를 먹으면 꼬리가 한 칸 길어지는 방식입니다. 다만 뱀이 현재 진행하는 방향의 반대쪽 (오른쪽인 경우 왼쪽)으로 이동은 불가합니다.

뱀 자신의 머리가 자신의 몸통과 부딪히는 경우는 게임종료, 맵 밖으로 뱀머리가 나가도 게임 종료됩니다.




이 게임의 팁이라면 뱀의 마디가 길어질수록 맵의 바깥쪽으로 뱀을 이동시켜 안쪽으로 향하도록 하는 것이 유리합니다.

전체 설계 과정은 아래와 같습니다.

1. 배경 맵으로 표현될 2차원 배열 만든 후, 각 셀의 좌표를 모두 저장 (차후 뱀에 해당하는 사각형을 그리기 위해)

2. 뱀의 위치를 기록해둘 좌표(배경 맵 배열의 인덱스)를 연결리스트로(std::list)로 선언

3. 게임 시작시 최초 3마디의 뱀의 좌표(배경 맵 배열의 인덱스)를 생성 후 이동 시작

4.  키보드의 상,하,좌,우 키 입력에 따라 뱀의 인덱스 위치를 변경.
상(행 감소), 하(행 증가), 좌(열 감소), 우(열 증가)

5. 뱀의 머리 좌표가 뱀의 몸통좌표에 닿았거나, 배경 맵의 위치를 벗어나지 않았는지 검사.

6. 실행흐름을 생성(쓰레드)해 마지막 키보드 방향으로 뱀을 계속 이동(배열 인덱스 변경).

7. 이동 후 바뀐 뱀의 좌표를 계속 사각형으로 그리기


마지막으로, 게임 성공 판정은 코드로 구현하지 않았습니다.

주석이 잘 되어 있으므로, 직접 한번 구현해 보는 것도 나쁘지 않습니다. ^^

  • 개발환경 : Microsoft Visual Studio 2015, Windows 10 Pro 64bit
  • 개발언어 : C++, MFC
  • 핵심 적용 기술, 환경 
  1. Device Context, GDI, Double Buffering (깜빡임방지)
  2. SDI (Single Document Interface)
  3. Windows Message (Timer, Keyboard)
  4. 2차원 배열 (맵 구현)
  5. Random 함수( 뱀 먹이)
  6. STL (List 자료구조)


댓글

댓글 쓰기

이 블로그의 인기 게시물

Qt Designer 설치하기

C++ 예제 (소켓 서버, 이미지, 파일전송)