0

PathGraphs のグラフとさまざまな便利な関数を実装するオブジェクトをNode作成しました。これは、単純なタワー ディフェンス ゲームの経路探索に使用する予定です。また、ダイクストラのアルゴリズムを実装するクラスも作成しました。Path各非静的ゲーム内ユニットにはPath.

私が直面している問題は、アプリケーションを実行すると、コードがコードを実行してユニットを初期化し、その際に PathGraph オブジェクトを構築する前に各クリープのパスを初期化することです (Eclipse Scala デバッガーと println ステートメントを使用して確認)。 . 残念ながら、パスを生成するコードでは、PathGraphオブジェクト、特にpath変数 (varマップが更新された場合などに新しいパスを指すことができるようにするため) を初期化する必要があります。

この問題を自分のコードでどのように修正すればよいですか? 参照用に以下に貼り付けた PathGraph コード。

object PathGraph {
  private val graph:Array[Array[Node]] = buildAndFillGraph()

  //val nodeDist:Double = MainGame.pixelsPerIteration
  val nodeDist = .5
  val numXNodes = (MainGame.gamePanelWidth.toDouble / nodeDist).toInt
  val numYNodes = (MainGame.gamePanelHeight.toDouble / nodeDist).toInt
  val defaultInfinity = 99999

  //build every Nodes adjacent nodes
  val angle = 45
  val minHeight = 0
  val minWidth = 0
  val maxHeight = MainGame.gamePanelSize.height //game panel y value starts at 0 at TOP
  val maxWidth = MainGame.gamePanelSize.width
  val numPossibleAdjacentNodes = 360 / angle //360 degrees, 45 degree angle between every potentially adjacent Node
  val hypotenuseLength = math.sqrt((nodeDist * nodeDist) + (nodeDist * nodeDist))



  def buildGraphArray(): Array[Array[Node]] = {
    println("numXNodes/nodeDist.toInt: " + (numXNodes.toDouble / nodeDist).toInt + "\n")
    //build every Node in the graph
    val lgraph = 
      (for (x <- 0 until (numXNodes / nodeDist).toInt) yield {
      (for (y <- 0 until (numYNodes / nodeDist).toInt) yield {
        new Node(x.toDouble * nodeDist, y.toDouble * nodeDist)//gives lgraph(x,y) notation
      }).toArray //convert IndexedSeqs to Arrays
    }).toArray//again

    lgraph
  }

  def buildAndFillGraph():Array[Array[Node]] = {
    val lgraph = buildGraphArray()//Ar[Ar[Node]]
    println("lgraph built")
    lgraph.map(x => x.map(y => y.setAdjacentNodes(lgraph)))
    //set the adjacent nodes for all nodes in the array
    if (lgraph.size != numXNodes*numYNodes) println("numXNodes*numYNodes: " + numXNodes*numYNodes)
    else MainGame.pathGraphBuilt = true
    lgraph

  }

  def getGraph() = graph

  def toBuffer(): mutable.Buffer[Node] = graph.flatten.toBuffer

  def toArray(): Array[Node] = graph.flatten
}
4

1 に答える 1

1

コードを改善するためにできることがいくつかあります。

  • 静的変数は使用しないでください。オブジェクトPathGraphではなく、クラスにする必要があります。MainGame. pathGraphBuiltビルダーで置き換えることができる静的変数でもあります。次のポイントを参照してください。

  • Builder パターンを使用して、ビルドするもの最終結果を区別します。PathGraph ロジックは、ほとんどビルダーに入ります。これらの行に沿ったもの:

-

case class PathGraphBuilder(nodeDist: Double, numXNodes: Double /* and so on */) {
  def apply: PathGraph = buildAndFillGraph
  def buildGraphArray = ...
  def buildAndFillGraph = ...
}

class PathGraph(underlyingGraph: Array[Array[Node]]) {
  def toBuffer(): mutable.Buffer[Node] = underlyingGraph.flatten.toBuffer

  def toArray(): Array[Node] = underlyingGraph.flatten
}
于 2013-09-26T01:11:58.613 に答える