На этом шаге мы закончим формировать объект 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. Результат работы приложения
Вы заметили, что введенный текст тоже выводится? Отлично! Теперь игра может получать ввод пользователя.
На следующем шаге мы рассмотрим анонимные объекты.