2016-09-12 5 views
2

Я новичок в Scala. Я делаю игру, и у меня есть список мест, которые может посетить персонаж, типа Location. Для этого я имею класс case и объект-компаньон.Scala прямой ссылки

LinkedLocations внутри Location представляет собой массив типа Location и может иметь любое количество мест, к которым может привести местоположение. В этом случае комната 1 ведет в комнату 2 и наоборот.

case class Location(name: String, desc: String, linkedLocations: Array[Location]){} 

object Location { 

    val none: Location = Location("none","none",Array(none)) 
    val room1: Location = Location("room 1","you are in room 1",Array(room2)) 
    val room2: Location = Location("room 2","you are in room 2",Array(room1)) 

    room1.linkedLocations.foreach(location=>println(location.name)) 
} 

Я попытался сделать их ленивыми, но в итоге переполнения стека. Как устранить проблемы с перенаправлением, подобные этому? Будет ли лучший способ разработать это?

ответ

6

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

case class Location(name: String, desc: String) 

object Location { 

    val none: Location = Location("none","none") 
    val room1: Location = Location("room 1","you are in room 1") 
    val room2: Location = Location("room 2","you are in room 2") 

    val neighborMap: Map[Location, Array[Location]] = Map(
    room1 -> Array(room2), 
    room2 -> Array(room1) 
) 
} 

И тогда вы можете сделать:

neighborMap(room1).foreach(location => println(location.name))