Могу ли я попросить вас о критике кода?

Всем доброго времени суток! Недавно начала изучать Kotlin. Слышала много раз, что надо публиковать свой код, чтобы улучшить свои навыки, вот и решила выложить свой код.

Я написала игру "Камень, ножницы, бумага", где пользователь играет с компьютером. В начале у пользователя спрашивают, хочет ли он поиграть в игру. Если пользователь отказывается, соответственно программа завершается. Если пользователь соглашается, то появляется запись с вариантами ответа, где пользователь должен ввести цифры от 1 до 3 чтобы сделать выбор между камнем, ножницами и бумагой. Далее идет сравнение ответов пользователя и компьютера, чтобы определить кто побдил или получается ничья. После сравнения в командную строку выводится результат. После результата у пользователся снова спрашивают, хочет ли он сыграть еще раз. Таким образом все повторяется до тех пор, пока пользователь не ответит отрицательно.

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

Заранее благодарю за ваше внимание!

val options = mapOf(1 to "Rock", 2 to "Paper", 3 to "Scissors")

/*варианты ответов на вопросы о проведении игры
с ними будет происходить сравнение ответа пользователя*/

    val positiveAnswer = "y"
    val negativeAnswer = "n"

//запрос на проведение игры
    println("Hi! Here is the \"Rock.Paper.Scissors.\" game. Do you want to play? [Y] or [N]")

//ответ пользователя
    var playGameAnswer = readLine()

//зацикливаю программу до тех пор, пока пользователь не введет корректный ответ

    while ((negativeAnswer != playGameAnswer) || (positiveAnswer != playGameAnswer))
    {
        when (playGameAnswer)
        {

//если польователь отвечает положительно, то начинается игра
            positiveAnswer ->
            {
                val gameChose = getGameChose(options)
                val userChoice = getUserChose(options)
                getResult(gameChose, userChoice)
                println("Do you want to play any more?")
                playGameAnswer = readLine()
            }

//при отрицательном ответе программа завершится
            negativeAnswer ->
            {
                println("Oh..so sad. So, goodbye")
                break
            }

//в случае некорректного ввода будет задан повторный вопрос с указанием вариантов ответа
            else ->
            {
                println("Please, enter [Y] or [N]")
                playGameAnswer = readLine()
            }

        }
    }
}

/**
 * Функция сравнения и вывода результата игры
 */
fun getResult(gameChose: String, userChoice: String) {
    when
    {
        userChoice == gameChose -> println("Tie")

        (userChoice == "1" && gameChose == "3") ||
        (userChoice == "2" && gameChose == "1") ||
        (userChoice == "3" && gameChose == "2") ->
            println("You win!")

        else -> println("You lose.")
    }


/**
 * Функция для ввода варианта ответа пользователем
 */
fun getUserChose(options: Map<Int, String>): String {

//флаг с помощью которого будем делать зацикливание
    var isValidChoice = false

    var userChoice = ""

//вывод на экран вариантов ответа

    println("Chose one of this (write a number): ")
    for ((key, value) in options)
    {
        println("$key. $value")
    }

    while (!isValidChoice)
    {
        val userInput = readLine()

        //обрабатываю исключение в случае ввода букв, а не цифр
        try
        {
            if (userInput != null && options.contains(userInput.toInt()))
            {
                isValidChoice = true
                userChoice = userInput
            }

            if (userInput != null)
            {
                if (!options.contains(userInput.toInt()))
                    println("Please enter 1 or 2 or 3")
            }
        }
//в случае ввода букв, выведется сообщение 
            catch (e: Exception)
            {
                    println("Please enter 1 or 2 or 3")
            }

    }
    return userChoice
}

/**
 * Функция рандомного выбора компьютера
 */
    fun getGameChose(options: Map<Int, String>): String {
        val value = options.keys
        val random = (1 + Math.random() * value.size).toInt()
        when (random) {
            1 -> options[1]
            2 -> options[2]
            3 -> options[3]
        }
        return random.toString()
    }
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ответы на вопрос 2
@foonfyrick
Все что в if'ах у тебя, я бы вынес в отдельную функцию, разбираться что там происходит нет никакого желания.
val gameChose = getGameChose(options)
val userChoice = getUserChose(options)
getResult(gameChose, userChoice)
println("Do you want to play any more?")
playGameAnswer = readLine()

println("Oh..so sad. So, goodbye")
break

это все тоже в отдельные функции, мне удобней читать, когда функция описывает происходящее, а не самому каждый раз на этом запинаться и думать что тут происходит.

Я бы советовал не советы спрашивать, а писать код так, будто ты пишешь это для своих знакомых, которые разбираются в программировании не очень хорошо, но чтобы они поняли что здесь происходит без вникания в подробности.
Ответ написан
Комментировать
@WaterSmith
Android-разработчик. Java, Kotlin
И как, работает?
(userChoice == "1" && gameChose == "3") ||
        (userChoice == "2" && gameChose == "1") ||
        (userChoice == "3" && gameChose == "2") ->

Это не красиво! Я бы организовал выборы, как элементы закольцованного двунаправленного связанного списка, тогда достаточно было бы проверить условие: "наш выбор "слева" или "справа" от выбора игрока". При масштабировании игры это очень пригодится.
positiveAnswer ->
            {
                val gameChose = getGameChose(options)
                val userChoice = getUserChose(options)
                getResult(gameChose, userChoice)
                println("Do you want to play any more?")
                playGameAnswer = readLine()
            }

Эту часть кода я бы вынес в отдельный метод, как и запрос на проведение игры.

P.S. Если у вас возник вопрос "Какое может быть масштабирование такой простой игры?", взгляните на эту картинку:4ce06329743e68ed16ae90bfcdbfbf6a_ce_493x500x0x0.jpg
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы