kotlin recursion

Есть функция для учебного приложения tic-tac-toe. Ее цель проверить входящую строку, получить ход и проанализировать его. Функция рекурсивно вызывает себя в случае некорректного ввода. После нескольких некорректных а затем корректных вводов функция продолжает жить своей жизнью. Было подозрение на when -заменено на if. Также замечено в дебаггере что при последнем проходе функция возвращается на последний оператор curcle(charArray) в теле else-if самопроизвольно.

    val pole = arrayOf(
            "1 1", "1 2", "1 3",
            "2 1", "2 2", "2 3",
            "3 1", "3 2", "3 3")
    print("Enter the coordinates: ")
    val cell: String = readLine()!!.toString()
    try {
        val regex = "...".toRegex()
        for (a in 0..pole.size - 1) {
            if (!cell.get(0).isDigit() || !cell.get(2).isDigit() || cell.get(1) != ' ' && !cell.contains(regex)) {
                println("You should enter numbers!")
                curcle(charArray)
            } else {
                val x1 = if (cell[0].toString().toInt() in 1..3) true else false
                val x2 = if (cell[2].toString().toInt() in 1..3) true else false
                if (cell == pole[a] && charArray[a] == '_') {
                    charArray[a] = 'X'
                    setka(charArray)
                    break
                } else if (cell == pole[a] && charArray[a] != '_') {
                    println("This cell is occupied! Choose another one!")
                    curcle(charArray)
                } else if (!x1 || !x2) {
                    println("Coordinates should be from 1 to 3!")
                    curcle(charArray)
                }
            }
        }
    } catch (e: StringIndexOutOfBoundsException) {
        println("You should enter numbers!")
        curcle(charArray)
    }
}```

Ответы (1 шт):

Автор решения: Maxim Gemb

Я новичок в Kotlin. Видимо мной был использован неправильный подход в программировании. Я разбил код на отдельные функции. И он стал работать. Это корректно работающий вариант.

fun getValue(charArray: CharArray): String {
    print("Enter the coordinates: ")
    val cell: String = readLine()!!.toString()
    try {
        val regex = "...".toRegex()
        if (cell.get(0).isDigit() && cell.get(2).isDigit() && cell.get(1) == ' ' && cell.contains(regex)) {
            have1to3(charArray, cell)
            havePole(charArray, cell)
        } else throw StringIndexOutOfBoundsException()
    } catch (e: StringIndexOutOfBoundsException) {
        println("You should enter numbers!")
        getValue(charArray)
    }
    return cell
}

fun have1to3(charArray: CharArray, cell: String) {
    val x1 = if (cell[0].toString().toInt() in 1..3) true else false
    val x2 = if (cell[2].toString().toInt() in 1..3) true else false
    if (!x1 || !x2) {
        println("Coordinates should be from 1 to 3!")
        getValue(charArray)
    }
}

fun havePole(charArray: CharArray, cell: String) {
    val pole = arrayOf(
            "1 1", "1 2", "1 3",
            "2 1", "2 2", "2 3",
            "3 1", "3 2", "3 3")
    for (a in 0..pole.size - 1) {
        if (cell == pole[a] && charArray[a] != '_') {
            println("This cell is occupied! Choose another one!")
            getValue(charArray)
        } else if (cell == pole[a] && charArray[a] == '_') {
            charArray[a] = 'X'
            setka(charArray)
            break
        }
    }
}
→ Ссылка