Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package minesweeper
- import kotlin.random.Random
- public const val pWidth = 9
- public const val pHeight = 9
- fun main() {
- print("How many mines do you want on the field? ")
- val bombs = readLine()!!.toInt()
- val game = Mines(pWidth, pHeight, bombs)
- game.printMines()
- }
- class Mines(width: Int, height: Int, mines: Int) {
- private val bombs = mines
- private val mines = randomiseMines(width, height, mines)
- private val showMinesMap = showMines()
- fun print() {
- for (row in mines) {
- for (field in row) {
- print(field)
- }
- println()
- }
- }
- fun printMines() {
- for (row in showMinesMap) {
- for (field in row) {
- print(field)
- }
- println()
- }
- }
- private fun showMines(): Array<Array<Char>> {
- if (pWidth * pHeight <= bombs) return Array(pHeight) { Array(pWidth){ 'X' } }
- val camp: Array<Array<Char>> = Array(pHeight) { Array(pWidth){ '.' } }
- for (i in 0 until pHeight) {
- loop@for (j in 0 until pWidth){
- if (mines[i][j] == 'X') {
- camp[i][j] = 'X'
- continue@loop
- } else {
- val infoBombs = calMines(i, j)
- if (infoBombs > 0) {
- val final = infoBombs.toChar()
- camp[i][j] = final
- }
- }
- }
- }
- return camp
- }
- private fun calMines(x: Int, y: Int): Int {
- var surMines = 0
- if (x - 1 in 0 until pWidth && mines[x - 1][y] == 'X') surMines++
- if (x - 1 in 0 until pWidth && y - 1 in 0 until pHeight && mines[x - 1][y - 1] == 'X') surMines++
- if (y - 1 in 0 until pHeight && mines[x][y - 1] == 'X') surMines++
- if (x + 1 in 0 until pWidth && y - 1 in 0 until pHeight && mines[x + 1][y - 1] == 'X') surMines++
- if (x + 1 in 0 until pWidth && mines[x + 1][y] == 'X') surMines++
- if (x + 1 in 0 until pWidth && y + 1 in 0 until pHeight && mines[x + 1][y + 1] == 'X') surMines++
- if (y + 1 in 0 until pHeight && mines[x][y + 1] == 'X') surMines++
- if (x - 1 in 0 until pWidth && y + 1 in 0 until pHeight && mines[x - 1][y + 1] == 'X') surMines++
- return surMines
- }
- private fun randomiseMines(width: Int, height: Int, mines: Int): Array<Array<Char>> {
- if (width * height <= mines) return Array(height) { Array(width){ 'X' } }
- val result = Array(height) { Array(width){ '.' } }
- for (i in 0 until mines) {
- var valCoord = false
- while (!valCoord) {
- val coords = randPoints(width, height)
- if (result[coords.x][coords.y] == '.') {
- result[coords.x][coords.y] = 'X'
- valCoord = true
- }
- }
- }
- return result
- }
- private fun randPoints(width: Int, height: Int): Coordinates {
- return Coordinates(Random.nextInt(width), Random.nextInt(height))
- }
- }
- class Coordinates(val x: Int, val y: Int)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement