diff options
Diffstat (limited to 'app/src/main/java')
| -rw-r--r-- | app/src/main/java/space/jakob/mines/GameActivity.kt | 7 | ||||
| -rw-r--r-- | app/src/main/java/space/jakob/mines/GameView.kt | 18 | ||||
| -rw-r--r-- | app/src/main/java/space/jakob/mines/Grid.kt | 24 |
3 files changed, 47 insertions, 2 deletions
diff --git a/app/src/main/java/space/jakob/mines/GameActivity.kt b/app/src/main/java/space/jakob/mines/GameActivity.kt index b6135b3..5a44720 100644 --- a/app/src/main/java/space/jakob/mines/GameActivity.kt +++ b/app/src/main/java/space/jakob/mines/GameActivity.kt @@ -42,6 +42,13 @@ class GameActivity : AppCompatActivity() { } return false } + + override fun onLongPress(e: MotionEvent) { + with (gameView) { + flagAt(e.x.toInt(), e.y.toInt()) + invalidate() + } + } } // Implements the callbacks for scaleGestureDetector. diff --git a/app/src/main/java/space/jakob/mines/GameView.kt b/app/src/main/java/space/jakob/mines/GameView.kt index 118cb45..d0a7ae0 100644 --- a/app/src/main/java/space/jakob/mines/GameView.kt +++ b/app/src/main/java/space/jakob/mines/GameView.kt @@ -97,6 +97,19 @@ class GameView(context: Context, attrs: AttributeSet) : View(context, attrs) { } } + /** + * Flag and @return the tile at (@param x, @param y). + */ + fun flagAt(x: Int, y: Int): Tile? = grid?.let { + val (x, y) = toGridCoordinates(x.toInt(), y.toInt()) + if (it.valid(x, y)) { + it.flag(x, y) + return it[x, y] + } else { + return null + } + } + private fun atlasRect(entry: AtlasEntry): Rect { val atlasWidth = 3 @@ -111,7 +124,6 @@ class GameView(context: Context, attrs: AttributeSet) : View(context, attrs) { val xSpacing = (scaledTileWidth * tileSpacing).toInt() val ySpacing = (scaledTileWidth * tileSpacing).toInt() - // TODO: Opportunity for more ASCII art explanations :) val dst = Rect( x + xSpacing, y + ySpacing, @@ -121,6 +133,10 @@ class GameView(context: Context, attrs: AttributeSet) : View(context, attrs) { if (tile.masked) { canvas.drawBitmap(atlas, atlasRect(AtlasEntry.MASKED), dst, null) + + if (tile.flagged) { + canvas.drawBitmap(atlas, atlasRect(AtlasEntry.FLAG), dst, null) + } } else { canvas.drawBitmap(atlas, atlasRect(AtlasEntry.UNMASKED), dst, null) diff --git a/app/src/main/java/space/jakob/mines/Grid.kt b/app/src/main/java/space/jakob/mines/Grid.kt index 2eec411..963f8cb 100644 --- a/app/src/main/java/space/jakob/mines/Grid.kt +++ b/app/src/main/java/space/jakob/mines/Grid.kt @@ -14,7 +14,12 @@ package space.jakob.mines import java.util.Random -data class Tile(val adjacentMines: Int = 0, val mine: Boolean = false, val masked: Boolean = true) +data class Tile( + val adjacentMines: Int = 0, + val mine: Boolean = false, + val masked: Boolean = true, + val flagged: Boolean = false +) /** * The Minesweeper "grid", containing instances of [Tile]. @@ -118,6 +123,23 @@ class Grid(val width: Int, val height: Int, val tiles: Array<Tile>) { } } + /** + * Mark the tile at the given coordinates as flagged. + * + * @throws IllegalArgumentException if the X coordinate is outside + * the range of [0, width), or if the Y coordinate is outside the + * range of [0, height). + */ + fun flag(x: Int, y: Int) { + if (!valid(x, y) || !this[x, y].masked) { + return; + } + + with (this[x, y]) { + place(x, y, copy(flagged = true)) + } + } + override fun toString(): String = buildString { for (y in 0 until height) { for (x in 0 until width) { |