잡학다식을꿈꾼다 2022. 7. 11. 23:24
반응형

Snake Game을 만들고 나서 느낀 점은 확실히 테트리스가 난이도는 더 높았다는 것이다.

 

사실 블록의 충돌처리나 여러 블록들의 운동을 한 번에 처리하는 것은 전의 프로젝트에서 한 번 다루어 본 것이어서 크게 어려웠던 것은 없었던 것 같다.

 

그나마 잠깐 해매었던 부분을 꼽자면 플레이어(뱀)의 성장과 움직임을 구현하는 것에 있어서 예상했던 것과 다른 양상을 보여주어서 재설계가 필요했던 것 정도?

 

아무튼 이번에 프로젝트를 진행하면서 주안점을 둔 것은 보다 객체지향 기법을 이용하여 짜임새 있는 프로그램을 짜는 것이었다. 개인적으로는 main() 함수에서는 클래스 생성자 하나만 있기를 바랬다. (그리고 이 부분은 달성했다!!) 다만 클래스 자체의 짜임새도 전보다는 나름 깔끔해진 것 같다. 특히 렌더링(?)을 하는 과정을 스택을 이용하여 나름 깔끔하게 했다는 점에서 괜찮아 진 것 같다.

 

코드 자체적인 부분에 대해서는 그러면 안되는 데, 게임이 동작하더라도, 리팩터링 과정은 한 번 거쳐야 하는 데 그게  귀찮아져서 건너 뛰어버렸다. 메서드는 최대한 짧게(1 줄에서 2 줄 내로..) 짤려고 했는 데, 주요 메소드( 충돌처리나 렌더링 등)는 어쩔 수 없이 길어지는 것 같다. 반복문과 가정문이 필요한 상황에서는 어쩔수 없는 것 같다.

 

프로그래밍을 짜면서 특히 상속에 대한 내용(부모 클래스의 사용자 정의 생성자와 자식 클래스 생성자의 관계,  private, public, protected 등 접근 제한자의 쓰임새 등)을 많이 접했었다. 

 

저번처럼 구구절절 설명하고 싶지는 않다. 앞에서도 언급하였던 것처럼 사실상 테트리스에서 사용했던 기법들의 반복인 부분이 많아서 반복하는 느낌이 든다. 다만 플레이어의 충돌 처리와 렌더링 과정은 가볍게 언급하겠다. 

 

플레이어의 충돌은 사실 Snake의 머리가 중요하다. 머리가 가는 방향에 아이템이나 자신의 몸체가 있으면 충돌이 발생한다. 이 부분은 테트리스와는 확실히 다르다. 테트리스의 충돌처리는 쌓인 블록의 바운더리를 저장한 자료구조를 받아서 일일이 주변에 그 블록이 있는 지 조사하였다면 이번 충돌처리는 머리의 현재 위치에서 현재 머리의 벡터를 더하여 예상 충돌 지점을 찾아내고, 이 지점에 아이템 블록이나 Snake의 몸체가 있는 지 판단하였다. 

 

렌더링에 있어서는 두 스택(지울 것과 그릴 것)을 계속적으로 업데이트하고 이를 다시 팝하면서 지우고 그려내는 방식을 이용하였다. 

 

코드를 읽어볼 사람은 참고하기를 바란다. 그 이외에는 읽어보면 어렵지 않게 이해할 수 있을 것이다. 깃 레포지터리는 다음과 같이 링크를 남긴다. (가장 기본적인 기능만 구현해 놓았고, 레벨링이나 스코어를 내는 것은 구현해 놓지는 않았다. 한 번 구현해보는 것도 좋을 지도?) PS . 참고로 벽은 그냥 포탈 벽입니다.(원래 충돌하면 오버되는 거 아는 데, 내가 그냥 그렇게 짬)

 

<Snake Game>

https://github.com/youngSeok0413/C-Console-Snake-Game.git

  

 

 

 

반응형