2017-06-04 3 views
1

Ich versuche, eine Pfadsuche mit A * und machte eine Klasse "Node".Eine Alternative zu List.Contains für benutzerdefinierte Klassen

Der Punkt ist, dass ich eine Liste von Knoten habe und ich muss wissen, ob ein Knoten bereits in der Liste ist, aber List.Contains funktioniert nicht.

Btw, ich muss die Weltposition, die in einer Variablen innerhalb Node ist, vergleichen, und ich weiß nicht, wie die List.Contains überschrieben werden, um mit dieser Variablen zu vergleichen.

Edit: die Node-Klasse hinzugefügt versucht Equals und 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; 
} 

Antwort

0

Für die offene Menge zu implementieren, sollten Sie eine priority queue werden. Fügen Sie für die geschlossene Menge einfach eine Eigenschaft HasBeenVisited zu jedem Knoten hinzu. Sie benötigen keine List für A *.

+0

Das Problem ist, wenn ich nach den Nachbarknoten suche ich sie erstelle. Und aus diesem Grund ist die einzige Möglichkeit, keine neue zu erstellen, wenn es einen Knoten mit der gleichen Position gibt, ich weiß nicht wirklich, wie man vergleicht, wenn der Knoten, der erstellt werden soll, bereits einen Knoten an dieser Position hat. Aber über Prioritätswarteschlange habe ich nichts gesehen, also werde ich es überprüfen – Luxgile

+0

In diesem Fall wollen Sie wahrscheinlich ein 'HashSet'. Sie werden das gleiche Problem mit äquivalenten Knoten haben, die nicht als gleich angesehen werden, also schauen Sie nach, wie man 'Equals' und 'IEquatable '' –

+0

korrekt implementiert. Das ist, was ich getan habe. Aber ich kann nirgendwo eine anständige Erklärung finden, wie man Equals und HashSet überschreibt. Ich habe es bereits versucht und funktioniert nicht, aber ich weiß nicht, ob ich etwas schlechtes mache, also bearbeite ich die Frage und addiere den Knotenklassencode. – Luxgile

Verwandte Themen