C++
C++ 지뢰찾기 게임 만들기
개발자 포비
2022. 11. 6. 18:28
오늘은 C++를 이용하여 간단하게(?) 만든 지뢰찾기를 리뷰해보는 시간을 가지겠습니다. 연습 용도로 만든 프로그램이니 감안해서 봐주시면 감사하겠습니다.
우선, 지뢰찾기를 만들기 위해서 Game이라는 클래스를 만들고, Game의 화면을 담당할 Screen이라는 클래스를 만들었습니다. 마지막으로 입력값을 받기 위해서 Input이라는 클래스르 만들었습니다. 제가 만든 프로그램에서는 해당 세가지 클래스를 가지고 게임을 제작하였습니다.
#pragma once
#pragma warning(disable : 4996)
#include <vector>
using std::vector;
#include "input.h"
class Screen;
#define COLS 10
#define ROWS 10
#define MINE 'X'
#define MAP 'Q'
#define MINENUM 15
enum class GAME_STATE
{
TITLE = 0,
PLAY,
GAME_OVER,
GAME_CLEAR
};
class Game
{
private:
Screen* m_screen; //
Input m_input;
// Screen Scale
int m_nCols;
int m_nRows;
// Map
char* m_mineMap;
char* m_windowMap;
// etc
int m_mineNum;
char* m_randMineIndex;
int m_keyInputX = -1;
int m_keyInputY = -1;
bool m_isGameOver;
int m_score; // 게임 스코어 : 지뢰를 밟지 않고 넓힌 땅의 크기
private:
vector<int> dirDefault = { (-m_nCols - 1) , (-m_nCols), (1 - m_nCols), -1, 1, (m_nCols - 1),m_nCols, (m_nCols + 1) };
vector<int> dirRight = { (-m_nCols - 1) , (-m_nCols), -1, (m_nCols - 1), m_nCols };
vector<int> dirLeft = { (-m_nCols), (1 - m_nCols), 1, m_nCols, (m_nCols + 1) };
public:
private:
void init();
void render(GAME_STATE state);
void update();
void input();
private:
void setMine();
void initMap();
int countMine(int selectIndex);
void markingMine(int x, int y);
void search(int x, int y);
void searchMine(int x, int y, int vec);
bool isSearchAllMine();
GAME_STATE checkGameState();
private:
void gameOver();
public:
void play();
Game();
virtual ~Game();
};
지뢰찾기는 타일 맵이기 때문에 1차원 배열을 이용하여 2차원을 나타냈습니다. 배열은 화면에 보여지는 맵 1개, 지뢰를 숨겨놓을 맵 1개를 두어 총 2개의 맵을 관리하게끔 만들었습니다. 마우스 혹은 키보드를 이용하여 입력값을 받게 되면 search함수를 이용하여 해당 좌표값을 탐색하게 됩니다. 1차원 배열로 만들었기 때문에 값의 위치에 따라서 재귀적으로 검색될 방향을 vector를 통해 만들어 두고, 각각 다르게 탐색되게끔 만들었습니다.
탐색한 좌표가 지뢰가 없다면 인접한 방향의 좌표들을 검색하고, 지뢰라면 그 즉시 gameOver가 되게끔 만들었습니다.
#pragma once
#include "Game.h"
class Screen
{
private:
// Screen Scale
int m_nCols;
int m_nRows;
char* m_map;
GAME_STATE m_state;
public:
void render(const char* map);
void setState(GAME_STATE state);
private:
public:
Screen(int Rows, int Cols);
~Screen();
};
탐색을 통해서 갱신된 화면을 Screen 클래스로 넘겨서 화면에 띄웁니다.
위의 사진은 제가 만든 게임의 실행 화면입니다.
입력 값을 넣으면 위의 화면과 같이 탐색을 시작합니다.