티스토리 뷰

프로젝트

지뢰찾기 게임 개발 과정 1)

지현씨 2022. 5. 31. 20:38

개발 언어 ) C++

Github) https://github.com/Hong-Study/MineSweeper.git

 

GitHub - Hong-Study/MineSweeper

Contribute to Hong-Study/MineSweeper development by creating an account on GitHub.

github.com

 

  어언 2학년.. C++ 공부를 마치고 무얼 할까 생각을 하고 있었다. 그러다가 문득 게임을 만들어보고 싶어졌고, 한번 간단한 게임을 만들어보자는 취지에서 지뢰찾기 개발 프로젝트를 시작하였다. 

  게임을 만들기 앞서, 난 한가지 목표를 정했다. 그것은 최소한의 구글링을 통해서 게임을 직접 구현할 것. 그래야 내 실력이 어느정도 성장할 수 있을 것 같았다.

 

  첫 번째로, 게임의 기본 맵, 지뢰생성을 제작하였다. 게임의 맵 생성과 지뢰생성 자체는 간단하게 구현이 가능하였다. 맵 구현은 이중 vector로 구현되어 있고, 각 테이블마다 속성은 아래와 같이 구현되어 있다.

	struct Tile {
		int Type;
		int count;
		bool Visible;
		bool came;
	};
    
    std::vector<std::vector<Tile>> Maps;

 

  두 번째로, 타일 선택 기능을 구현하였다. 다만, 지뢰찾기 특성상, 원래는 마우스를 사용해야 하나 Cmd로는 마우스를 구현할 수 없어서, 키보드 입력으로 대신 구현하였다.

if (_kbhit()) {
    input = _getch();
    switch (input) {
    case Key::DOWN:
        board->Move_Down();
        break;
    case Key::UP:
        board->Move_Up();
        break;
    case Key::LEFT:
        board->Move_Left();
        break;
    case Key::RIGHT:
        board->Move_Right();
        break;
    case Key::SPACEBAR:
        board->Click();
        break;
    case Key::F:
        board->Flag();
    }
    system("cls");
    //std::cout << input;
    board->Show_Map();
}

 

  세 번째로, 클릭 기능을 구현하였다. 클릭기능은 살짝 어려웠던 부분이였다. 왜냐하면 타일을 클릭했을 때, 클릭 주위의 빈 부분들 또한 같이 클릭되어야 하기 때문에, 알고리즘이 들어가야 했기 때문이다. 그래서 나는 그나마 자신있는 알고리즘인 BackTracking을 사용하여 구현하였다.

void GameBoard::Click() {	// 입력
	if (Maps[y][x].Type == Map::BOMB) {
		std::cout << "GameOver! Bro" << std::endl;
		exit(0);
	}
	else if (Maps[y][x].Type == Map::NOTBOMB) {
		Check(y, x);
	}
}
void GameBoard::Check(int y, int x) {	// 입력한 부분 확인
	for (int i = y - 1; i <= y + 1; ++i) {
		for (int j = x - 1; j <= x + 1; ++j) {
			if (Maps[i][j].Type == Map::NOTBOMB) {
				Maps[i][j].Visible = true;
				if (Maps[i][j].count == 0)
					RecursiveBackTraing(i, j);
			}
		}
	}
}
void GameBoard::RecursiveBackTraing(int in_y, int in_x) {
	int r, nx, ny;
	Maps[in_y][in_x].came = true;
	for (r = 0; r < 8; r++) {
		nx = in_x + DIR[r][0];
		ny = in_y + DIR[r][1];
		if (Maps[ny][nx].Type == Map::NOTBOMB) {
			if (Maps[ny][nx].count != 0) {
				Maps[ny][nx].Visible = true;
			}
			else if (inRange(ny, nx) && !Maps[ny][nx].came && Maps[ny][nx].count == 0) {
				RecursiveBackTraing(ny, nx);	// 주위에 빈곳이 존재하면 재귀.
				Maps[ny][nx].Visible = true;
			}
		}
	}
}

 

이렇게 기본적인 지뢰찾기를 만들어 봤었는데, 살짝 아쉬운 부분들도 있었다. 선택할때 생기는 버퍼링이라던가, 자질구레한 기능들, 깃발 주위 클릭 등의 기능을 구현하지 못한게 살짝 아쉽다. 다만 버퍼링 부분은 더블버퍼링을 사용하여 해결하였기 때문에, 더블 버퍼링 관련해서는 다음, 지뢰찾기 개발 2에서 설명하겠다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함