🗒 Задача¶
Усовершенствуй игру, где пользователь и компьютер по очереди бросают кости. Побеждает выбросивший наибольшее число. Теперь дай возможность пользователю играть до тех пор пока ему не надоест. В конце программа должна вывести сколько партий он выиграл.
-
после первого раунда программа задает вопрос: “Хотите бросить кости еще раз? Введите Да или Нет”;
-
программа в зависимости от ответа запускает новый раунд или заканчивает игру с выводом количества выигрышных партий человека;
-
в программе должно быть минимум 2 метода (для проведения раунда и для генерации значений брошенных кубиков);
-
основная логика программы должна находиться в main(), а 2 другие функции будут вспомогательными.
❌ Ошибки¶
-
нейминг функций не в инфинитиве
-
неправильная декомпозиция действий по функциям
-
не обрабатывают ответы в разном регистре
✏️ Комментарии¶
Отлично, предлагаю еще применить более короткую форму записи. без 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)
}