@degrater
junior python developer

Как исправить ошибку? "Переменная не инициализирована?

Пишет что defaultfavourite не инициализирован
val Menu : List<String> = listOf("Пиво", "Пахлёбка " , "Супец")

fun main(args : Array<String>) {
	var hearth : Int = 5
	val nameproject: String = "Мечи Средиземья"
	var defaultSteed : String = "- Скакуна нет "
	var traktirName: String = "Рог Единорога"
	var BuyManName: String = "Эдгар"
	var MoneySumm: Int = 23
	var hasSteed : String = defaultSteed
	var heroName: String = "Дионис"
	
	println(nameproject)
	println(hasSteed)
	println("Здоровье:" + hearth)
	println("Монет:" + MoneySumm)
	println("Главный герой прибыл в трактир" + traktirName  + " \nВас приветствует  владелец трактира " + BuyManName)
	println("Выберите действие:\nОткрыть Меню - 1\nПосмотреть в зеркало - 2")
	val defaultfavourite : readLine() 
	if (defaultfavourite == 1) {
            println("Меню: " + Menu)
	}
	if (defaultfavourite == 2) {
            println("В зеркале герой увидел свое имя  "+ heroName)
	}
    
}
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
Casper-SC
@Casper-SC
Программист (.NET)
Исправил ошибку. Простым readLine здесь не обойтись. Написал функцию requestUserInputAsInt, которая перезапрашивает ввод у пользователя, если введено не число или введённое число не попадает в диапазон.

В целом я понял, что хочет реализовать автор и здесь нужно всё писать по-другому, но это придёт с опытом. Например, для характеристик героя и мира используй классы. Для совершения действий в мире можно использовать State Machine, при том лучше реализовать её так, чтобы можно было все состояния расписать в одном месте в декларативном виде (все переходы состояний, сами состояния в отдельных классах).

Первое, что нагуглил. В целом, похоже на то, что я имел ввиду:
Implement a state machine with kotlin using tinders library (ссылка)
https://github.com/Tinder/StateMachine

62ac6d647890a259916233.png
Вдруг кому-то интересно: подсветка синтаксиса называется 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
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы