기말고사도 끝났고 할일도 없어서 무엇을 할까 고민하다가 c++의 객체지향에 대해서 정확하게 알고 싶어서 c++로 스네이크 게임을 만들기로 했다.
방향키로 조작하는 간단한 게임이다. 뱀이 먹이(사진에서는 사과)를 먹으면 그 길이가 점점 커진다. 그렇게 계속 먹이를 먹다가 자신에게 부딪히면 게임이 종료된다.
zsh셸에서 동작한다. c++을 g++로 컴파일 해 만든다.
객체지향을 공부하는게 목표이기 때문에 프로젝트를 차례차례 키워나가야 한다.
1단계 - 일반적인 스네이크 게임을 만든다.
2단계 - 네트워크 통신을 통해 친구들의 순위를 알 수 있게 한다.
3단계 - 실시간으로 친구들과 경쟁할 수 있게 만든다.
파일을 다음과 같이 나누었다.
-Maingame // 게임 로직과 관련된 것이 담긴다.
-graphic // 콘솔창에 게임을 그리는데 사용한다.
-Info // 데이터들이 담긴다.
생각했던 것 만큼 파일을 많이 분할하지 않았다. 만들다보면 더 파일들이 늘어나지 않을 까 기대해본다.
Info.h
#ifndef INFO_H #define INFO_H class Info { private : const int Width = 15,Height = 15; public: int ** data; Info(); int getWidth(); int getHeight(); }; #endif
width와 height은 나중에 사용자가 바꿀 수 있게 상수로 두지 않았다. 기능 추가의 길을 언제나 열어두고 싶었다.
data는 원래 캡슐화를 해야하는데 getter로 처리해도 어짜피 주소값을 가져가서 맘대로 값을 바꿀 것이기 때문에 그냥 퍼블릭으로 빼버렸다. 저 부분을 고민해야 할 듯 하다. c++에서는 포인터때문에 캡슐화가 생각보다 어렵다는 것을 알았다.
graphic.h
#ifndef GRAPHIC_H #define GRAPHIC_H #include "../info/info.h" class graphic { private : Info * UserData; public: graphic(Info * a); void draw(); void title(); void clear(); }; #endif
UserData 는 데이터를 저장하고, draw는 콘솔 그리기, clear는 콘솔창 지우기, title은 타이틀 그리는 기능을 한다. 지금 생각해보니 graphic클래스에 왜 userdata가 있어야 하는지 모르겠다. 하지만 포인터를 통해 여기저기 옮겨다닐텐데 굳이 없애고 파라미터로 받아야하나 그런 생각도 든다. 포인터의 존재 때문에 캡슐화가 완전히 망가지는 느낌이 들었다.
maingame.h
#ifndef MAINGAME_H #define MAINGAME_H #include "../info/info.h" #include "../graphic/graphic.h" class Maingame { private: graphic * window; Info * UserInfo; public: Maingame(); void init(); void start(); }; #endif
게임 로직을 관리하는 클래스이다. 아직 많이 작성하지 않아 이 정도 까지만 😓
파일들은 깃허브에 올려두었다. master 브랜치에는 최종본, first 브랜치에 지금 소스코드를 올려둘 예정이다.