-
Notifications
You must be signed in to change notification settings - Fork 199
Expand file tree
/
Copy pathMineSweeper.kt
More file actions
57 lines (46 loc) · 1.54 KB
/
Copy pathMineSweeper.kt
File metadata and controls
57 lines (46 loc) · 1.54 KB
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package minesweeper
class MineSweeper(
val mineMap: MineMap,
clickedSet: Set<Point> = setOf(),
) {
var clickedSet: Set<Point> = clickedSet
private set
val isDone get() = clickedSet.size == mineMap.totalSize - mineMap.mapInfo.mineNumber
fun click(point: Point): ClickResult {
if (clickedSet.contains(point)) return ClickResult.ALREADY_CLICKED
return when (val clickedTile = mineMap.mineMap[point]) {
is MapTile.Mine -> ClickResult.GAME_OVER
is MapTile.Blank -> {
setBlankTile(point, clickedTile)
ClickResult.CONTINUE
}
else -> ClickResult.ERROR
}
}
private fun setBlankTile(point: Point, clickedTile: MapTile.Blank) {
setClickedPoint(point)
if (clickedTile.isNoMineNear) {
setAdjacentTilesClicked(point)
}
}
private fun setAdjacentTilesClicked(point: Point) {
val adjacent = point.getAdjacentPoints(mineMap.mapInfo.mapSize)
for (adj in adjacent) {
if (clickedSet.contains(adj)) continue
adjacentTileDfs(adj)
}
}
private fun adjacentTileDfs(adj: Point) {
val info = mineMap.mineMap[adj]
if (info is MapTile.Blank) {
setClickedPoint(adj)
if (info.isNoMineNear) setAdjacentTilesClicked(adj)
}
}
private fun setClickedPoint(point: Point) {
clickedSet = clickedSet.plus(point)
}
enum class ClickResult {
GAME_OVER, ALREADY_CLICKED, CONTINUE, ERROR
}
}