summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob L. Kreuze <jakob@memeware.net>2018-12-12 18:41:46 -0500
committerJakob L. Kreuze <jakob@memeware.net>2018-12-12 18:41:46 -0500
commita816e658f0bd09461d1516b7a05bd9fa39aed863 (patch)
tree5155db1e041bb44c95d96e3d1042eafe0c45bb86
Initial commit.
-rw-r--r--.gitignore1
-rw-r--r--minesweeper.kt91
2 files changed, 92 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..209f171
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+notes.org
diff --git a/minesweeper.kt b/minesweeper.kt
new file mode 100644
index 0000000..ee4c575
--- /dev/null
+++ b/minesweeper.kt
@@ -0,0 +1,91 @@
+data class Tile(val minesAdjacent: Int, val mine: Boolean, val masked: Boolean)
+
+data class Grid(val tiles: Array<Tile>, val width: Int, val height: Int)
+
+fun Grid.valid(x: Int, y: Int) = x >= 0 && x < width && y >= 0 && y < height
+fun Grid.index(x: Int, y: Int) = y * width + x
+fun Grid.tile(x: Int, y: Int) = tiles[index(x, y)]
+fun Grid.get(x: Int, y: Int) = Pair(tile(x, y), index(x, y))
+
+fun Grid.put(x: Int, y: Int, tile: Tile) {
+ tiles[index(x, y)] = tile
+}
+
+fun addMine(grid: Grid, x: Int, y: Int) {
+ if (!grid.valid(x, y)) {
+ throw IllegalArgumentException()
+ }
+
+ grid.put(x, y, Tile(minesAdjacent = 0, mine = true, masked = true))
+
+ for (i in -1..1) {
+ for (j in -1..1) {
+ if (!(i == 0 && j == 0) && grid.valid(x + i, y + j)) {
+ val old = grid.tile(x + i, y + j)
+ val minesAdjacent = if (old.mine) { 0 } else { old.minesAdjacent + 1 }
+ grid.put(x + i, y + j, Tile(minesAdjacent, old.mine, old.masked))
+ }
+ }
+ }
+}
+
+fun revealTile(grid: Grid, x: Int, y: Int) {
+ if (!grid.valid(x, y)) {
+ return
+ }
+
+ val tile = grid.tile(x, y)
+
+ if (!tile.masked) {
+ return
+ }
+
+ grid.put(x, y, Tile(tile.minesAdjacent, tile.mine, masked = false))
+
+ if (tile.minesAdjacent == 0) {
+ revealTile(grid, x - 1, y - 1)
+ revealTile(grid, x, y - 1)
+ revealTile(grid, x + 1, y - 1)
+ revealTile(grid, x - 1, y )
+ revealTile(grid, x + 1, y )
+ revealTile(grid, x - 1, y + 1)
+ revealTile(grid, x, y + 1)
+ revealTile(grid, x + 1, y + 1)
+ }
+}
+
+// TODO: Turn this into a toString?
+
+fun printTiles(grid: Grid) {
+ for (y in 0..grid.height-1) {
+ for (x in 0..grid.width-1) {
+ val tile = grid.tile(x, y)
+ val display = when {
+ tile.masked -> "."
+ tile.mine -> "M"
+ tile.minesAdjacent == 0 -> " "
+ else -> tile.minesAdjacent.toString()
+ }
+
+ print("${display} ")
+ }
+ println()
+ println()
+ }
+}
+
+fun main(args: Array<String>) {
+ val width = 10
+ val height = 10
+ val tiles: Array<Tile> = Array(width * height, { Tile(0, mine = false, masked = true) })
+
+ val grid = Grid(tiles, width, height)
+
+ addMine(grid, 0, 0)
+ addMine(grid, 1, 0)
+ addMine(grid, 2, 0)
+ addMine(grid, 3, 0)
+ revealTile(grid, 5, 5)
+
+ printTiles(grid)
+}