2016-09-12 4 views
2

저는 스칼라를 처음 접했습니다. 게임을 만들고 있는데 캐릭터가 방문 할 수있는 위치 목록 인 Location이 있습니다. 나는 이것을 달성하기 위해 사례 클래스와 동반자 객체를 가지고있다.스칼라 전달 참조

LinkedLocations 내부 LocationLocation 유형의 배열이며 위치가 가능한 임의의 수의 위치를 ​​가질 수 있습니다. 이 경우, 방 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))