본문으로 바로가기

종종 지뢰찾기를 한다
하다보니 만들 수 있겠다 싶었고 만들었다

지뢰찾기의 중요로직만 구현하였으며 난이도, 타이머등 부가적인 요소는 구현하지 않았다

 

게임 스크린샷

맵 상태

맵의 상태이다

  1. mine - 지뢰가 있는 맵
  2. empty - 비어있는 맵
  3. nearMine(count: Int) - 근처에 지뢰가 있는 맵 연관값으로 근처에 있는 지뢰의 개수를 가지고 있다
  4. flag - 깃발이 꽃혀있는 맵
  5. nonOpen - 아직 터치를 안해서 무엇이 있지 모르는 맵

계산프로퍼티로 해당 맵의 근처지뢰계수, 이미지, 이미지 컬러를 받아올 수 있다

지뢰생성

랜덤한 위치에 지뢰를 생성한다
게임을 시작하고 첫 터치를 했을때 호출되며 게임의 편의를 위해 첫 터치한 지점포함 주위 9개의 맵에는 지뢰가 생성될수 없게 해줬다
중복값을 없애기 위해 Set을 사용했다

맵에 생성된 지뢰의 위치를 적용해준다
그와 동시에 nearMineMap을 계산해서 적용해준다

navitateAroundMap(location:_:) 함수이다
location의 상하좌우 및 대각선을 탐색하는 함수이다
탐색한 맵이 전체 맵의 범위를 넘어서지 않는다면 action 클로저를 실행한다

빈맵 탐색

지뢰찾기 맵에서 어떠한 지점을 터치했을때 해당 지점만 열리는게 아니고 연쇄적으로 비어있는 맵이 열리게 된다

전형적인 dfs이다
nearMineMap이 나올때까지 상하좌우, 대각선 방향으로 재귀호출을 하며 nearMineMap이 나오면 해당 맵까지 오픈하고 return한다
한번 탐색한곳은 다시 탐색하지 못하도록 visitedMap을 만들어줬다

flag

어떠한 지점에 지뢰가 있다고 생각하면 flag를 세울 수 있다
nearMineMap의 count와 근처 flag의 개수가 일치할때 해당 nearMineMap을 터치시 일부 맵을 오픈한다

isValidNearMineCount(location:) 함수는 nearMineMap의 count와 근처 flag의 개수를 비교하는 함수이다
findEmptyMapAndValidNearMineMap(location:) 함수에서 isValidNearMineCount(location:)가 실행되고 true가 리턴되면 맵을 오픈하는 작업을 한다
터치 지점의 근처 맵이 전부 nearMineMap이라면 그 맵들만 오픈하고 만약 emptyMap이 나오게 된다면 findEmptyMap(location:) 함수가 호출되어 연쇄적으로 비어있는 맵을 전부 오픈하게 된다

그러나 만약 flag가 실제 지뢰가 있는 위치가 아니라면 맵 오픈과정에서 지뢰가 터지게 되고 게임이 오바가 된다

game clear

만약 아직 오픈이 안된 맵이 모두 지뢰일경우 및 모든 flag가 올바른 지뢰일경우 혹은 둘 다일경우에는 게임 성공이다

전체코드

https://github.com/jmindeveloper/Minesweeper

 

GitHub - jmindeveloper/Minesweeper

Contribute to jmindeveloper/Minesweeper development by creating an account on GitHub.

github.com