2017-06-04 11 views
1

私はA *で経路探索を行い、クラス "ノード"を作っています。カスタムクラスのList.Containsの代わり

ポイントは、私はノードのリストを持っており、ノードがすでにリストに入っているが、List.Containsが機能していないかどうかを知る必要があるということです。

Btw、私はノード内の変数にある世界の位置を比較する必要があり、私はその変数と比較するList.Containsをオーバーライドする方法がわかりません。

編集:オープンセットでは等しく、HashSetの

using System.Collections; 
using UnityEngine; 
using System.Collections.Generic; 

public class Node { 

public Node parentNode; 

public int nodeX; 
public int nodeY; 
public Vector2 nodePosition; 

public bool state; 

public int gCost; 
public int hCost; 
public int fCost; 

public Node(int x, int y){ 
    nodeX = Mathf.RoundToInt(x); 
    nodeY = Mathf.RoundToInt(y); 
    nodePosition = new Vector2(nodeX, nodeY); 
} 

public void SetCost(Node end){ 
    if(parentNode != null){ 
     gCost =(int) parentNode.gCost + 10; 
    } 
    else{ 
     gCost = 10; 
    } 

    hCost =(int) (Mathf.Abs(nodeX - end.nodeX) + Mathf.Abs(nodeY-end.nodeY)); 
    fCost =(int) gCost + hCost; 
} 

public bool Equals (Node other){ 
    if(other == null){return false;} 
    if(this.nodePosition == other.nodePosition){return true;} 
    else{return false;} 

} 

public override bool Equals(Object other){ 
    if(other == null){return false;} 
    if(other is Node){ 
     return this.Equals(other); 
    } 
    else{ 
     return false; 
    } 
} 

public override int GetHashCode(){ 
    return nodeX^nodeY; 
} 

答えて

0

を実装しようとNodeクラスを追加しました、あなたはpriority queueを使用する必要があります。閉じた集合の場合は、すべてのノードにプロパティHasBeenVisitedを追加するだけです。 A *にはListは必要ありません。

+0

問題は、私がそれらを作成する隣接ノードを探しているときです。そのため、同じ位置のノードがある場合に新しいノードを作成しない唯一の方法は、作成しようとしているノードに既にその位置のノードがあるかどうかを比較する方法を実際には分かりません。 しかし、プライオリティキューについては何も見なかったので、私はそれを確認します – Luxgile

+0

その場合、おそらく 'HashSet'が必要です。等価と見なされない同等のノードで同じ問題が発生するので、 'Equals'と' IEquatable ' –

+0

を正しく実装する方法を調べてください。しかし、私はどこでもEqualsとHashSetをオーバーライドする方法のまともな説明を参照することはできません。私はすでにそれを試して動作しませんが、私は何か悪いことをしているかどうかわからないので、質問を編集し、Nodeクラスコードを追加します。 – Luxgile