2016-09-12 6 views
2

私はScalaを初めて使いました。私はゲームを作っていて、キャラクターが訪問できる場所のリストを持っています。タイプはLocationです。私はこれを達成するためのケースクラスとコンパニオンオブジェクトを持っています。スカラ前方参照

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)) 
関連する問題