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
}
}
}