Шаг 178.
Основы Kotlin.
Объекты. Объявления объектов (окончание)

    На этом шаге мы закончим формировать объект Game.

    Что осталось в main()? Вывод описания текущей комнаты, приветствия при входе в комнату и состояния игрока. Все это должно выводиться в начале каждого раунда игрового процесса, поэтому переместите эти инструкции в цикл игры. Оставьте в main() вызов Game.play().

package com.bignerdranch.nyethack
import Player
import Room
import TownSquare

fun main() {
    Game.play()
}

object Game {
    private val player = Player("Madrigal")
    private var currentRoom: Room = TownSquare()
    init {
        println("Welcome, adventurer.")
    }
    fun play() {
        while (true) {
            println(currentRoom.description())
            println(currentRoom.load())
            // Состояние игрока
            printPlayerStatus(player)
        }
    }
    fun printPlayerStatus(player: Player) {
        println("(Aura: ${player.auraColor()}) " +
                "(Blessed:  ${if (player.isBlessed) "YES" else "NO"})")
        println("${player.name} ${player.healthStatus()}")
}


Рис.1. Вывод состояния в цикле игры (Game.kt)

    Если запустить Game.kt прямо сейчас, она будет повторяться бесконечно, потому что цикл ничем не прерывается. Последний шаг, по крайней мере сейчас, - это прием пользовательского ввода из консоли с использованием функции readLine(). Возможно, вы помните эту функцию: она останавливала выполнение и ждала пользовательского ввода. Она продолжит выполнение, как только получит символ возврата каретки.

    Добавьте вызов readLine() в цикл игры, чтобы принять пользовательский ввод.

package com.bignerdranch.nyethack
import Player
import Room
import TownSquare

fun main() {
    Game.play()
}

object Game {
    private val player = Player("Madrigal")
    private var currentRoom: Room = TownSquare()
    init {
        println("Welcome, adventurer.")
    }
    fun play() {
        while (true) {
            println(currentRoom.description())
            println(currentRoom.load())
            // Состояние игрока
            printPlayerStatus(player)

            print("> Enter your command: ")
            println("Last command: ${readLine()}")
        }
    }
    fun printPlayerStatus(player: Player) {
        println("(Aura: ${player.auraColor()}) " +
                "(Blessed:  ${if (player.isBlessed) "YES" else "NO"})")
        println("${player.name} ${player.healthStatus()}")
}
Файл с проектом можно взять здесь.


Рис.2. Прием пользовательского ввода (Game.kt)

    Попробуйте запустить Game.kt и ввести следующую команду:

Welcome, adventurer.
Room: Town Square
Danger level: 2
The villagers rally and cheer as you enter!
The bell tower announces your arrival. GWONG
(Aura: GREEN) (Blessed: YES)
Madrigal of Trell is in excellent condition!
> Enter your command: fight
Last command: fight
Room: Town Square
Danger level: 2
The villagers rally and cheer as you enter!
The bell tower announces your arrival. GWONG
(Aura: GREEN) (Blessed: YES)
Madrigal of Trell is in excellent condition!
> Enter your command:


Рис.3. Результат работы приложения

    Вы заметили, что введенный текст тоже выводится? Отлично! Теперь игра может получать ввод пользователя.

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




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