Исправил ошибку. Простым
readLine здесь не обойтись. Написал функцию
requestUserInputAsInt, которая перезапрашивает ввод у пользователя, если введено не число или введённое число не попадает в диапазон.
В целом я понял, что хочет реализовать автор и здесь нужно всё писать по-другому, но это придёт с опытом. Например, для характеристик героя и мира используй классы. Для совершения действий в мире можно использовать
State Machine, при том лучше реализовать её так, чтобы можно было все состояния расписать в одном месте в декларативном виде (все переходы состояний, сами состояния в отдельных классах).
Первое, что нагуглил. В целом, похоже на то, что я имел ввиду:
Implement a state machine with kotlin using tinders library (
ссылка)
https://github.com/Tinder/StateMachine
Вдруг кому-то интересно: подсветка синтаксиса называется Visual Studio 2019 Dark + я сам добавил свои модификации, чтобы было похоже на подсветку для C# из Visual Studio 2022 для тёмной темы для языка C#
val newLine: String = System.lineSeparator()
val menu: List<String> = listOf("Пиво", "Пахлёбка ", "Супец")
fun main(args: Array<String>) {
val hearth: Int = 5
val projectName: String = "Мечи Средиземья"
val defaultSteed: String = "- Скакуна нет "
val traktirName: String = "Рог Единорога"
val buyManName: String = "Эдгар"
val moneySum: Int = 23
val hasSteed: String = defaultSteed
val heroName: String = "Дионис"
println(projectName)
println(hasSteed)
println("Здоровье: $hearth")
println("Монет: $moneySum")
println("Главный герой прибыл в трактир $traktirName ${newLine}Вас приветствует владелец трактира $buyManName")
try {
val message = "Выберите действие:${newLine}Открыть Меню - 1${newLine}Посмотреть в зеркало - 2"
when (requestUserInputAsInt(message, IntRange(1, 2))) {
1 -> println("Меню: $menu")
2 -> println("В зеркале герой увидел свое имя $heroName")
}
} catch (ex: Throwable) {
ex.printStackTrace()
println(ex)
}
}
/**
* Запросить ввод пользователем целого числа. В случае неправильного ввода запрос будет осуществлён повторно.
* @param message Сообщение, которое будет выведено на консоль, при первом и повторных запросах ввода.
* @param range диапазон чисел, в которые должен попасть пользовательский ввод.
* */
fun requestUserInputAsInt(message: String? = null, range: IntRange? = null): Int {
range?.let {
if (it.first > it.last) throw IllegalArgumentException("first > last: (${it.first} > ${it.last})")
}
val result: Int
while (true) {
message?.let { println(it) }
val line = readlnOrNull()
if (!line.isNullOrBlank()) {
val resultTemp: Int? = line.toIntOrNull()
if (resultTemp != null) {
if (range != null) {
if (resultTemp >= range.first &&
resultTemp <= range.last
) {
result = resultTemp
break
}
} else {
result = resultTemp
break
}
}
}
}
return result
}