F.R.I.D.A.Y.

지뢰찾기 - 맵 데이터 본문

DEV/Direct2D

지뢰찾기 - 맵 데이터

F.R.I.D.A.Y. 2021. 7. 3. 12:30
반응형

 지뢰찾기의 각종 정보를 저장하고 관리하는 맵데이터


맵 데이터

 지뢰찾기를 구성하려면 블럭이 열린 상태인지, 선택된 상태인지, 열리지 않은 상태인지를 저장하는 공간과 함께 해당 요소가 지뢰로 동작하도록 처리가 되었는지 저장하는 상태 정보 저장용 블럭이 필요하다.

 

Block

 지뢰 찾기를 구성할 때 각 셀의 정보를 저장하기 위해 구현한 클래스이다.

Easy 모드(좌)와 Hard 모드(우). 갈색의 각 사각형이 Block 클래스로 관리되는 데이터를 처리한다.

 

 Block 클래스에서 관리해야할 항목은 총 세가지이다.

  • 블럭의 지뢰 활성화 여부
  • 블럭의 공개 상태
  • 블럭 주변의 지뢰 수

 마지막 항목인 주변 지뢰 수의 경우에는 굳이 관리를 하지 않아도 상관은 없지만, 일단 한번에 처리를 해야 나중에 연산을 줄일 수 있기 때문에 처리를 했다.

 

포함 멤버

 위에서 설명한 데이터를 관리하기 위해 총 세 개의 멤버로 구성되어 있다.

  • BLOCK_STATE state
  • bool _isBomb
  • size_t aroundBomb

 이중 BLOCK_STATE는 <Block>클래스의 inner enum class로 구성되어있다. 총 세 개의 항목으로 구성되어 있으며, CLOSED, PICKED, OPENED로 관리된다. 

 

포함 메서드

총 여섯 개의 메서드가 존재한다.

IncAroundBomb()

 주변부의 지뢰 활성화시 aroundBomb 멤버의 값을 1 증가시킨다.

 

GetAroundBomb()

 해당 블럭 주변의 지뢰 수를 반환환다.

 

isBomb()

 해당 블럭이 지뢰로 활성화되었는지를 반환한다.

 

SetBomb(bool)

 해당 블럭을 인자값에 맞추어 지뢰 활성화 여부를 설정한다.

 

SetState(BLOCK_STATE)

 해당 블럭의 블럭 공개 상태를 설정한다.

 

GetState()

 해당 블럭의 블럭 공개 상태를 저장한다.

 

 

IMap

 <Block>데이터를 관리하기 위한 구조이다. 기본적으로 Block 데이터를 이차원 배열 형태로 저장하며, 초기 맵 구성 및 삭제를 모두 IMap에서 관리한다.

 

생성자

 IMap의 생성자는 총 세 개의 인자를 받는다.

IMap(D2D1_SIZE_U size, size_t bombCount, D2D1_SIZE_F blockSize);

 첫 번째 인자는 맵의 width와 height를 담당하며, 이 값으로 블럭의 수가 결정된다. 두 번째 인자 bombCount는 전체 블럭에서 몇개의 블럭이나 지뢰로 활성화할것인지를 설정한다. 마지막으로 블럭을 그릴 때 각 블럭의 width값과 height값을 받는다. 사실 이건 블럭의 크기를 일정하게 관리하기 위해 만든 것이라서 추후에 블럭의 크기 조정을 할 것이 아니라면 굳이 만들지 않아도 되는 인자였다.

 

메서드

 여기에서는 주요 메서드만 설명한다.

 

isClear()

 해당 맵 데이터에서 지뢰를 모두 찾은 경우(모든 지뢰 공개 상태가 PICKED가 되어있으면서 다른 Block 데이터는 더이상 OPENED로 설정할 수 없을 때 true를 반환한다. 즉, 게임이 끝났는지를 이 메서드가 관리한다.

 

 

파생 클래스

 IMap은 그 자체로 객체를 생성할 수 있지만, 난이도를 좀 더 명시적으로 하기 위해 네 개의 난이도 구분이 되어있는 클래스를 추가로 구현했다.

  • MapEasy
  • MapNormal
  • MapHard
  • MapHell

 


소스코드

map.zip
0.00MB

 

# index

728x90
반응형

'DEV > Direct2D' 카테고리의 다른 글

지뢰찾기 - 윈도우 구성  (0) 2021.07.07
지뢰찾기 - 그리기 툴  (0) 2021.07.03
지뢰찾기  (0) 2021.06.28
물리엔진 - 벽 충돌 part2. 좌우 벽 구현  (0) 2021.05.14
물리엔진 - 좌우 이동  (0) 2021.05.14
Comments