Перейти к содержанию

🗒 Задача

Усовершенствуй игру, где пользователь и компьютер по очереди бросают кости. Побеждает выбросивший наибольшее число. Теперь дай возможность пользователю играть до тех пор пока ему не надоест. В конце программа должна вывести сколько партий он выиграл.

  • после первого раунда программа задает вопрос: “Хотите бросить кости еще раз? Введите Да или Нет”;

  • программа в зависимости от ответа запускает новый раунд или заканчивает игру с выводом количества выигрышных партий человека;

  • в программе должно быть минимум 2 метода (для проведения раунда и для генерации значений брошенных кубиков);

  • основная логика программы должна находиться в main(), а 2 другие функции будут вспомогательными.

❌ Ошибки

  • нейминг функций не в инфинитиве

  • неправильная декомпозиция действий по функциям

  • не обрабатывают ответы в разном регистре

✏️ Комментарии

Отлично, предлагаю еще применить более короткую форму записи. без return и дополнительной переменной. чтобы сразу возвращался результат)
Под двумя методами (из условия) имеется в виду, что это должны быть вспомогательные функции, в которые вынесены определенные узконаправленные действия. А основная логика должна сохраняться в главном методе.
Давай класс переместим в самое начало документа, а потом уже пойдут функции. Более корректно было бы ставить классы на видное место.
Не правильно логика реализована. Нужно после каждого раунда говорить кто выиграл. А если пользователь решил не продолжать игру - всегда писать сколько раз победил человек. У тебя программа пишет только если в последнем раунде победил человек
Раунд можно декомпозировать на более узкие функции. Например, вынести сравнение результатов.
Параметр также должен иметь релевантное и понятное название
Использование именованных параметров функций – хороший способ найти несоответствия в передаваемых значениях. Тем более в случаях когда типы данных совпадают
Предлагаю сделать короткую форму, сразу возвращая результат без ключевого слова return
Привет, ну удобней всего было залить пулл реквест чтобы там смотреть код)

Что касается твоего вопроса - почему выводится тип Unit – тут все очень просто.

Вот у тебя есть функция generateDice(), которая возвращает некое целое число Int. То есть, если написать println(generateDice()) – распечатается сгенерированное число, которое функция возвращает.

Функция startRound() не возвращает ничего, однако, ты все равно пытаешься распечатать результат ее выполнения. И в Котлин есть специальный тип Unit – он ничего по сути в себе не хранит, но оповещает компилятор о том, что метод вызвался.

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

🧾 Решение

fun main() {
    var wonGame = 0

    do {
        println("Ход игрока. Бросайте кости")

        val gamer = throwDice()
        println("Ваше число: $gamer")
        println()
        println("Ход компьютера.")

        val computer = throwDice()
        println("Число компьютера: $computer")
        println()

        when {
            gamer > computer -> {
                println("Победило человечество")
                wonGame++
            }
            gamer < computer -> println("Победила машина")
            else -> println("Победила дружба")
        }

    } while (continueGame())
    println("Количество выигранных партий: $wonGame")

}

fun throwDice(): Int = (1..6).random()

fun continueGame(): Boolean {
    println("Хотите поиграть еще?")
    val answer = readln()
    return answer.equals("Да", ignoreCase = true)

}
fun main() {
    var gameCounter = 0
    var humanWins = 0
    var botWins = 0

    while (true) {
        gameCounter++
        val player = throwTheDice()
        println("Игрок выбросил $player очков!")
        val computer = throwTheDice()
        println("Компьютер выбросил $computer очков!")

        val (updatedHumanScore, updatedBotScore) = getResults(player, computer, humanWins, botWins)
        humanWins = updatedHumanScore
        botWins = updatedBotScore

        if (gameCounter >= 1) {
            print("Хотите бросить кости еще раз? Введите Да или Нет: ")
            val userChoice = readln()

            if (userChoice.equals("да", ignoreCase = true)) {
                continue
            } else {
                println("Результаты: человек - $humanWins очков, машина - $botWins очков.")
                break
            }
        }

    }
}

fun throwTheDice() : Int {
    val yourScore = (1..6).random()
    return yourScore
}

fun getResults(human: Int, bot: Int, humanScore: Int, botScore: Int): Pair<Int, Int> {

    var updatedHumanScore = humanScore
    var updatedBotScore = botScore

    when {
        human > bot -> {
            println("Победило человечество!")
            updatedHumanScore++
        }

        human == bot -> println("Хрупкое перемирие")
        else -> {
            println("Победила машина 🙁")
            updatedBotScore++
        }
    }

    return Pair(updatedHumanScore, updatedBotScore)
}