На этом шаге мы рассмотрим назначение и правила их использования.
Перечисления, или enum, - это специальный тип класса, полезный для объявления коллекции констант, известных как перечисляемые типы.
В NyetHack вы будете использовать перечисление для представления множества из четырех доступных для движения игрока направлений, то есть четырех сторон света. Для этого добавим перечисление с именем Direction в Navigator.kt.
enum class Direction { NORTH, EAST, SOUTH, WEST }
Рис.1. Объявление перечисления (Navigator.kt)
Перечисления более описательны, чем другие типы констант, например строки. Ссылайтесь на перечисляемые типы, используя имя класса перечисления, точку и имя типа, например вот так:
Direction.EAST
Перечисления могут выражать больше, чем просто именованные константы. Чтобы использовать Direction для представления направления движения в NyetHack, определите для каждого типа в Direction соответствующее изменение Coordinate, когда игрок сделает шаг.
Движение в мире должно изменять координаты х и у игрока в соответствии с направлением движения. Например, если игрок делает шаг на восток, координата х должна увеличиться на 1, а y - на 0. Если игрок делает шаг на юг, координата х должна увеличиться на 0, а у - на 1.
Добавьте в перечисление Direction главный конструктор, объявляющий свойство coordinate. Так как вы добавили параметр в конструктор перечисления, вам придется вызвать его в объявлении каждого перечисленного типа в Direction и передать соответствующее значение Coordinate.
enum class Direction(private val coordinate: Coordinate) { NORTH(Coordinate(0, -1)), EAST(Coordinate(1, 0)), SOUTH(Coordinate(0, 1)), WEST(Coordinate(-1, 0)) }
Рис.2. Объявление конструктора enum (Navigator.kt)
Перечисления, как и другие классы, могут содержать объявления функций.
Добавьте функцию с именем updateCoordinate() в Direction, которая будет изменять положение игрока в зависимости от его направления движения (обратите внимание: вам нужно добавить точку с запятой, отделяющую объявления типов перечисления от объявления функции).
enum class Direction(private val coordinate: Coordinate) { NORTH(Coordinate(0, -1)), EAST(Coordinate(1, 0)), SOUTH(Coordinate(0, 1)), WEST(Coordinate(-1, 0)) fun updateCoordinate(playerCoordinate: Coordinate) = Coordinate(playerCoordinate.x + coordinate.x, playerCoordinate.y + coordinate.y) }
Рис.3. Объявление функции в перечислении (Navigator.kt)
Функции должны вызываться для перечисляемых типов, а не для самого класса перечисления, поэтому вызов updateCoordinate() будет выглядеть так:
Direction.EAST.updateCoordinate(Coordinate(1, 0))
На следующем шаге мы рассмотрим перегрузку операторов.