На этом шаге мы продолжим формирование объекта Game.
Посмотрите на игровую логику main() и подумайте, где она должна располагаться в Game. Например, нет смысла создавать новый экземпляр Player или новую комнату currentRoom в начале каждого раунда, поэтому эти части игровой логики должны находиться в Game, а не в play(). Объявите player и currentRoom как private-свойства Game.
Далее, переместите вызов castFireball() в блок инициализации Game, чтобы сделать начало каждой партии в NyetHack веселее. Также перенесите объявление printPlayerStatus в Game. Добавьте модификатор private в объявление printPlayerStatus, а также player и currentRoom, чтобы инкапсулировать их внутри Game.
package com.bignerdranch.nyethack import Player import Room import TownSquare fun main() { println(currentRoom.description()) println(currentRoom.load()) // Состояние игрока printPlayerStatus(player) Game.play() } object Game { private val player = Player("Madrigal") private var currentRoom: Room = TownSquare() init { println("Welcome, adventurer.") } fun play() { while (true) { // Игровой процесс NyetHack } } fun printPlayerStatus(player: Player) { println("(Aura: ${player.auraColor()}) " + "(Blessed: ${if (player.isBlessed) "YES" else "NO"})") println("${player.name} ${player.healthStatus()}") }
Рис.1. Инкапсуляция свойств и функций внутри объявления объекта (Game.kt)
Переместив код из функции main() в функцию play(), вы сохраните все необходимое для настройки игрового цикла в Game.
На следующем шаге мы закончим изучение этого вопроса.