Шаг 20.
Основы Kotlin.
Условные конструкции. Операторы if/else

    На этом шаге мы приведем общие сведения об этом операторе и приведем пример его использования.

    Приступим. Откройте IntelliJ и создайте новый проект. (Если у вас IntelliJ уже открыта, создайте новый проект так: File | New | Project...) Выберите Kotlin/JVM и назовите ваш проект NyetHack.


Рис.1. Создание проекта NyetHack

    Распахните список NyetHack в инструментальном окне проекта и правой кнопкой мыши щелкните на src, чтобы создать новый Kotlin File/Class. Назовите ваш файл Game. В Game.kt дбавьте точку входа в программу, функцию main, набрав "main" и нажав клавишу Tab. Ваша функция должна выглядеть так (рисунок 2):

fun main() {

}


Рис.2. Создание функции main()

    В NyetHack состояние игрока зависит от оставшихся очков здоровья в диапазоне от 0 до 100. По ходу игры игрок может получить увечья в боях. С другой стороны, игрок может быть полностью здоров. Вы должны определить правила отображения текущего состояния здоровья игрока: если (if) здоровье игрока равно 100, он должен отображаться полностью здоровым, а иначе (else) вы должны показать, насколько он ранен. Решить эту задачу можно с помощью оператора if/else (если/иначе).

    Внутри функции main() напишите первый оператор if/else, как показано ниже. В этом коде много чего происходит, и мы разберем его после того, как он будет написан.

fun main() {
    val name = "Madrigal"
    var healthPoints = 100
    
    if (healthPoints == 100) {
        println(name + " is in excellent condition!")
    } else {
        println(name + " is in awful condition!")
    }
}


Рис.3. Вывод состояния здоровья игрока (Game.kt)

    Разберем новый код построчно. Сначала объявите значение val с именем name и присвойте ему строковое значение с именем вашего отважного игрока. Далее объявите переменную var с именем healthPoints и присвойте ей начальное значение 100, то есть идеальное состояние. Затем добавьте оператор if/else.

    В операторе if/else вы как бы задаете себе вопрос, на который можно ответить "да" или "нет" (true/false): "Есть ли у игрока 100 очков в healthPoints?". Этот вопрос можно выразить с помощью оператора сравнения ==. Он читается как "равно", то есть ваше условие будет звучать так: "Если healthPoints равно 100".

    За оператором if следуют фигурные скобки ({}). Код внутри фигурных скобок - это то, чего вы хотите от программы, если оператор if выяснит, что условие истинно. В данном случае это произойдет, если healhPoints будет иметь значение, равное 100.

    if (healthPoints == 100) {
        println(name + " is in excellent condition!")
    } 

    Инструкция в фигурных скобках - уже знакомая функция println(), которую мы использовали, чтобы вывести что-нибудь в консоль. В скобках указано, что именно нужно выводить: выражение состоит из значения name и строки " is in excellent condition!" ("в отличном состоянии"). (Обратите внимание на пробел перед строкой - без него будет выведено: "Madrigalis in excellent condition!".) Проще говоря, если оператор if/else обнаружит, что у игрока 100 очков здоровья, программа напечатает, что здоровье у нашего героя в отличном состоянии ("герой в отличном состоянии").


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

    Используя оператор сложения (+), чтобы добавить к значению переменной строку, мы выполняем операцию конкатенации строк. Это простой способ изменить то, что выводится в консоль, в зависимости от значения переменной. Далее вы увидите другой, более предпочтительный способ вставки значений в строки.

    А если healtPoints имеет значение, отличное от 100? В этом случае оператор if определит, что условие ложно, он пропустит выражение в фигурных скобках после if и перейдет к оператору else. Интерпретируйте else как "иначе": если условие if истинно, выполнится одно, иначе выполнится другое. В отличие от if, оператор else не нуждается в условии. Он просто выполнится, если if не выполнится, поэтому сразу за ключевым словом следуют фигурные скобки:

    } else {
        println(name + " is in awful condition!")
    }

    Единственная разница в вызове функции printin() - это строка после имени героя. Вместо того чтобы сообщить, что герой в "отличном состоянии!" (is in excellent condition!), мы должны сообщить, что герой в "плохом состоянии" (is in awful condition!).


До сих пор вы видели только одну функцию - функцию вывода строки в консоль. Позднее мы узнаем больше о функциях и о том, как объявлять свои функции.

    Код как бы говорит компилятору: "Если (if) у героя ровно 100 очков здоровья, выведи в консоль: "Madrigal is in excellent condition!". Если у героя не 100 очков здоровья, то выведи в консоль: "Madrigal is in awful condition!"".

    Оператор структурного равенства == - это один из нескольких операторов сравнения Kotlin. В таблице 1 перечислены операторы сравнения языка Kotlin. Сейчас вам необязательно знать все операторы, так как вы все равно познакомитесь с ними позже. Вернитесь к этой таблице, когда будете решать, каким оператором лучше выразить условие.

Таблица 1. Операторы сравнения
Оператор Описание
< Оценивает, является ли значение слева меньше значения справа
<= Оценивает, является ли значение слева меньшим или равным значению справа
> Оценивает, является ли значение слева больше значения справа
>= Оценивает, является ли значение слева большим или равным значению справа
== Оценивает, является ли значение слева равным значению справа
!= Оценивает, является ли значение слева не равным значению справа
=== Оценивает, ссылаются ли две ссылки на один объект
!== Оценивает, не ссылаются ли две ссылки на один объект

    Вернемся к делу. Запустите Game.kt, нажав Run слева от функции main. Вы увидите следующий вывод:

  Madrigal is in excellent condition!


Рис.4. Вывод результата

    Так как заданное состояние

  healthPoints == 100
истинно, выполнилась ветвь if оператора if/else.


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

    Теперь попробуйте изменить значение healtPoints на 89.

fun main() {
    val name = "Madrigal"
    var healthPoints = 89
    
    if (healthPoints == 100) {
        println(name + " is in excellent condition!")
    } else {
        println(name + " is in awful condition!")
    }
}


Рис.5. Изменение healtPoints (Game.kt)

    Запустите программу снова, и вы увидите:

  Madrigal is in awful condition!


Рис.6. Результат изменения healtPoints (Game.kt)

    Теперь заданное условие ложно, так как 89 не равно 100, и программа выполнила ветвь else.

    На следующем шаге мы рассмотрим добавление условий.




Предыдущий шаг Содержание Следующий шаг