Jump to content
Unity Insider Forum

Über eine List abfragen ob die Position bereits schon einmal betreten wurde


Aquana

Recommended Posts

       Hallo,

Ich möchte das eine Spielfigur sich daran erinnert ob sie bereits einmal an der gleiche Stelle stand und gegeben Falls anders agiert.

Dafür benutze ich eine Liste. Wenn die Figur an einer neuen Stelle steht soll deshalb erst einmal die gesamte Liste durchgegangen werden.

Ist die Position noch nicht im Index der Liste enthalten soll eine neue Position in der liste gespeichert werden. 

Für Tests lasse ich bereits über Print etwas ausgeben.

Wenn ich jetzt in der Liste bevor ich das Spiel starte zum Beispiel schon 9 Werte in der Liste habe klappt alles so wie es soll.

als Beispiel

 

 

 

size=9

ElElement0 =1;

Element1=2;

Element2=3;

Element3 =4;

Element4=5;

Element5=6;

Element6 =7;

Element7=8;

Element8=9;

Gebe ich vor start des Spiels bei aktuellePositionx =1 ein.

Wird angezeigt "Zahl gefunden und es stoppt". So wie es auch sein soll und auch bei den anderen Zahlen bis hin zur letzten Zahl der 9 vom Index.

Doch gebe ich jetzt eine Zahl die nicht im Index enthalten ein wird die Zahl zugefügt. So wie es erst einmal sein soll. Als Beispiel 10.

Der Index geht solange durch bis er feststellt das keine 10 in der List enthalten ist. Deshalb fügt er die Zehn hinzu.

Doch wenn ich jetzt noch einmal die boolean AnAus aktiviere und immer noch eine 10 enthalten ist geht er bis zum letzten Index zeigt die 10 an aber gibt aus das diese Zahl nicht enthalten wäre und fügt wieder eine 10 in die Liste hinzu. Das macht er immer wieder obwohl die 10 schon enthalten ist und er sie mir über print ja sogar anzeigt.

 

Deshalb habe ich jetzt die Frage ob ich etwas mit der for-schleife falsch verstehe oder gibt es etwas über List.Count das ich nicht weiß. Denn nach meinem logischen Verständnis müsste es sofort stoppen sobald es feststellt das die 10 im letzten Index enthalten ist und dürfte nix weiteres hinzufügen. Das macht es bei der bereits zuvor schon festgelegten 9 ja auch nicht.

 

Danke schon mal im vorraus wenn mir jemand helfen bzw können sollte.

 

 

das ist der Code

 

aktuellePositionX = this.transform.position.x;

for (Durchlauf = 0; Durchlauf < Position.Count && AnAus == true;  Durchlauf++)
            {
                print(Position[Durchlauf]);


                if(Durchlauf == aktuellePositionX-1 )
                {
                    print("Zahl gefunden");
                    AnAus = false;
                }


            if (Durchlauf == Position.Count - 1 && Durchlauf == aktuellePositionX - 1)
            {
                print("noch im letzten Index gefunden");
                AnAus = false;
            }
            else if (Durchlauf == Position.Count - 1 && Durchlauf != aktuellePositionX)
            {
                print("hmm auch im letzten Index nicht drin.Füge neuen hinzu");
                Position.Add(aktuellePositionX);

              //  print(Position[Durchlauf]);

                Durchlauf = 0;
                AnAus = false;
                
            }

            }

Link zu diesem Kommentar
Auf anderen Seiten teilen

So auf die schnelle, wenn ich mich nicht irre überprüfst du mit

vor 1 Stunde schrieb Aquana:

Position.Count

nur die Anzahl an Elementen, also nur wie gross deine Liste ist und nicht was für Zahlen darin sind.
Bei Listen musst du ebenfalls aufpassen dass der Liste egal ist ob es die Zahl/Variable schon gibt, er fügt es einfach als neuen Eintrag ein.

du musst eher so etwas abfragen:

Position.Contains(10);

Aber ich schau mir das gerne noch im Detail an wenn ich etwas mehr Zeit habe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay... ist für mich schwer zu entscheiden, wo ich ansetzen soll.

Einerseits kommt einige Verwirrung daher, dass deine Schleifenvariable ("Durchlauf") keine lokale Variable ist, sondern auch nach Beendigung deines Schleifencodes weiterhin bestehen bleibt und du deshalb manuell den Wert zurücksetzt.

Aber anstatt darauf einzugehen, würde ich lieber noch ein, zwei Schritte zurückgehen und darauf hinweisen, dass es mehr Datensammelstrukturen als Listen gibt. Wenn dein Ziel ist, eine Sammlung von Elementen zu haben, in der kein Element doppelt vorkommt, und du willst wissen, ob ein bestimmtes Element drin ist oder nicht, empfiehlt sich ein HashSet. Das entspricht nämlich genau dem mathematischen Konzept einer Menge und erlaubt dir superfixes Nachschauen, ob ein Element schon drin ist.

Zwar hat die Liste auch eine "Contains"-Funktion, aber es gibt gute Gründe, bei einer solchen Situation das Set zu nehmen. Performance ist nur einer davon, und nicht einmal der beste :)

Hier ein Beispiel, wie man HashSets benutzt:

var menge = new HashSet<int>();

menge.Add(5);
menge.Add(10);

Debug.Log(menge.Contains(5)); // true

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sascha

Meinst du damit das der Wert manuell zurückgesetzt wird damit das auch List.Conatains zurückgesetzt wird? So richtig blicke ich da nämlich nicht durch.

Doch dein Vorschlag scheint ja ohnehin in jeder Hinsicht der bessere zu sein. Ich habe es gerade mal ausprobiert und liebe HashSets schon jetzt! Wenn das auch noch bessere Performance gibt um so besser. Leichter zu bedienen. Einfach perfekt für mich.

 

Danke das bringt mich weiter und macht wirklich einiges einfacher. Wirklich vielen dank!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jomnitech

Ja ich überprüfe mit position.Count die Größe der List . Deshalb soll die forschleife solange durchgehen bis sie am Ende der List angelangt. Das ganze klappt auch solange ich im inspector vorgefertigte Zahlen habe und diese abfrage. Doch wenn ich neue Zahlen zufüge geraden immer wieder aufs neue die gleichen Zahlen hinein.

Doch danke Sascha habe ich jetzt eine wesentlich bessere Alternative :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

 

var menge = new HashSet<int>();

//...
  
aktuellePositionX = this.transform.position.x;
  
if (menge.Contains(aktuellePositionX))
{
  Debug.Log("Position " + aktuellePositionX + " bereits betreten.");
}
else
{
  menge.Add(aktuellePositionX);
  Debug.Log("Position " + aktuellePositionX + " das erste mal betreten und dem Index hinzugefügt.");
}

Dieser Code  erfüllt eigentlich alles was du in deinem Eingangspost umständlich erreichen wolltest. Hoffe das hilft dir falls du es mittlerweile nicht schon selbst gelöst hast.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...