Home > Back-end >  How to check a MutableList's element or a String input is a number?
How to check a MutableList's element or a String input is a number?

Time:11-25

I run into a problem in the code below.

fun main() {
val table = mutableListOf(
    mutableListOf(' ', ' ', ' '),
    mutableListOf(' ', ' ', ' '),
    mutableListOf(' ', ' ', ' ')
)

println("---------")
println("| "   table[0][0]   " "   table[0][1]   " "   table[0][2]   " |")
println("| "   table[1][0]   " "   table[1][1]   " "   table[1][2]   " |")
println("| "   table[2][0]   " "   table[2][1]   " "   table[2][2]   " |")
println("---------")

print("Enter the coordinates: ")
var coordinates = readLine()!!.split(" ").toMutableList()
var x = coordinates[0].toInt()
var y = coordinates[1].toInt()


while (x > 3 || x < 1 || y > 3 || y < 1) {
    println("Coordinates should be from 1 to 3!")
    print("Enter the coordinates: ")
    coordinates = readLine()!!.split(" ").toMutableList()
    x = coordinates[0].toInt()
    y = coordinates[1].toInt()
}

while (table[x-1][y-1] == 'X' || table[x-1][y-1] == 'O') {
    println("This cell is occupied! Choose another one!")
    print("Enter the coordinates: ")
    coordinates = readLine()!!.split(" ").toMutableList()
    x = coordinates[0].toInt()
    y = coordinates[1].toInt()
}

table[x-1][y-1] = 'X'

println("---------")
println("| "   table[0][0]   " "   table[0][1]   " "   table[0][2]   " |")
println("| "   table[1][0]   " "   table[1][1]   " "   table[1][2]   " |")
println("| "   table[2][0]   " "   table[2][1]   " "   table[2][2]   " |")
println("---------")


if (table[0][0] == 'X' && table[0][1] == 'X' && table[0][2] == 'X' ||
    table[1][0] == 'X' && table[1][1] == 'X' && table[1][2] == 'X' ||
    table[2][0] == 'X' && table[2][1] == 'X' && table[2][2] == 'X' ||
    table[0][0] == 'X' && table[1][0] == 'X' && table[2][0] == 'X' ||
    table[0][1] == 'X' && table[1][1] == 'X' && table[2][1] == 'X' ||
    table[0][2] == 'X' && table[1][2] == 'X' && table[2][2] == 'X' ||
    table[0][0] == 'X' && table[1][1] == 'X' && table[2][2] == 'X' ||
    table[2][0] == 'X' && table[1][1] == 'X' && table[0][2] == 'X'
) {
    println("X wins")
} else if (table[0][0] == 'O' && table[0][1] == 'O' && table[0][2] == 'O' ||
    table[1][0] == 'O' && table[1][1] == 'O' && table[1][2] == 'O' ||
    table[2][0] == 'O' && table[2][1] == 'O' && table[2][2] == 'O' ||
    table[0][0] == 'O' && table[1][0] == 'O' && table[2][0] == 'O' ||
    table[0][1] == 'O' && table[1][1] == 'O' && table[2][1] == 'O' ||
    table[0][2] == 'O' && table[1][2] == 'O' && table[2][2] == 'O' ||
    table[0][0] == 'O' && table[1][1] == 'O' && table[2][2] == 'O' ||
    table[2][0] == 'O' && table[1][1] == 'O' && table[0][2] == 'O'
) {
    println("O wins")
}

}

I can check the input is not smaller or higher then 3 (coordinates) and also able to check the field is not occupied. But how can I check the input is not a string with a while loop like checking field occupation and coordinate. Thanks in advance!

CodePudding user response:

I would suggest to do it like this

x = coordinates[0].toIntOrNull() ?: 99
y = coordinates[1].toIntOrNull() ?: 99

the difference with toInt() and toIntOrNull() is that toIntOrNull() doesn't throw an exception when it can't turn it into an Int but will return null instead. This can be redirected to a fallback number using the elvis operator ?:. Here you can put anything that is not in your required range of 1-3. I just chose 99 to demonstrate this.

CodePudding user response:

I've done it this way:

print("Enter the coordinates: ")
var coordinates = readLine()!!.split(" ").toMutableList()


while (coordinates[0].length > 1 || coordinates[1].length > 1 || coordinates[0].length > 1 && coordinates[1].length > 1 ) {
    println("You should enter numbers!")
    print("Enter the coordinates: ")
    coordinates = readLine()!!.split(" ").toMutableList()
}
  • Related