3 Kugeln nebeneinander zerstören

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Raidenkk
Beiträge: 64
Registriert: 27.11.2011, 02:32
Echter Name: Kevin
Wohnort: Bergkamen
Kontaktdaten:

3 Kugeln nebeneinander zerstören

Beitrag von Raidenkk »

Hey ich versuche mich derzeit daran meine Kugeln erst dann zerstören zu lassen wenn wirklich 3 Kugeln nebeneinander sind. Leider fällt mir keine Lösung ein und hoffe auf Hilfe.

Info:
Derzeit wird immer nur 1 Kugel zerstört :/

Code: Alles auswählen

void CBloopIt::Destroy ()
{
	for (std::vector<CBall>::iterator i=m_vBalls.begin(); i!=m_vBalls.end(); i++)
	{
		for (std::vector<CBall>::iterator k=m_vBalls.begin(); k!=m_vBalls.end(); k++)
		{
			if (i!=k)
			{
				if (i->GetX()+1 == k->GetX() && i->GetY() == k->GetY() && i->GetFall() == false && k->GetFall() == false)
				{
					i->SetDestroy (true);
				}

				if (i->GetX()-1 == k->GetX() && i->GetY () == k->GetY() && i->GetFall() == false && k->GetFall() == false)
				{
					k->SetDestroy (true);
				}
			}
		}

		if (i->GetDestroy() == true)
		{
			m_vBalls.erase (i);
			m_Punkte += 10;
			break;
		}
	}
}
Benutzeravatar
dowhilefor
Moderator
Beiträge: 173
Registriert: 27.02.2009, 15:44
Alter Benutzername: 6SidedDice
Echter Name: Nico Probst
Wohnort: Bochum
Kontaktdaten:

Re: 3 Kugeln nebeneinander zerstören

Beitrag von dowhilefor »

So auf den ersten Blick würde ich sagen: Du testest ob eine Kugel zwischen zwei anderen liegt(was also immer nur die mittlere sein kann) und schmeißt sie direkt in der inneren schleife weg. Sollten nun die beiden äuseren Kugeln getestet werden, haben diese ja keinen rechten/linken nachbarn mehr.
Markier also lieber erst die Kugeln, damit sie für die nachfolgenden Kugeln auch noch selber gegengetestet werden. Erst wenn du alle durch bist, kannst du alle markierten Kugeln wirklich wegschmeißen.
Mein Gehirn besteht nur noch aus einem hash-index, ich weiss was ich kenn aber kenn nicht was ich weiss
Benutzeravatar
Raidenkk
Beiträge: 64
Registriert: 27.11.2011, 02:32
Echter Name: Kevin
Wohnort: Bergkamen
Kontaktdaten:

Re: 3 Kugeln nebeneinander zerstören

Beitrag von Raidenkk »

Mit i->SetDestroy (true); makiere ich sie ja aber ich weis leider nicht wie ich anstellen soll, dass geprüft wird ob 3 nebeneinander sind und die auch zerstört werden.
waigie
Beiträge: 82
Registriert: 20.05.2009, 19:37

Re: 3 Kugeln nebeneinander zerstören

Beitrag von waigie »

Naja wenn du die mittlere Kugel findest. Also eine Kugel hast bei der sowohl ein Linker als auch ein Rechter Nachbar existiert, dann setz doch nicht nur bei der mitleren Kugel das Destroy Flag, sondern bei allen 3.
Aber wie ich das sehe vergleichst du eh immer nur ob 2 Kugeln nebeneinander liegen und nicht 3. Für den Test wäre eine weitere Datenstruktur denke ich sinnvoller. Ein 2. Dim Grid in dem du einfach für Position x/y eine Referenz der Kugel speicherst die dort liegt. So kannst du einfach durch das Grid laufen und schauen was sich Links und Rechts deiner Position befindet. Sind beide Referenzen != null markierst du alle 3 Kugeln als zu Löschen.

Des weiteren löscht du Kugeln, während du über den Vector iterierst. Das solltest du nicht tun, da wird der Iterator ungültig. Also erstmal in den verschachtelten Schleifen alle Kugeln die als Zerstört markieren und dann ohne Iterator durch den Vektor gehen und die Kugeln wirklich löschen. Bei Verwendung eines Iterators darf eine Datenstruktur nicht verändert werden.
Benutzeravatar
dowhilefor
Moderator
Beiträge: 173
Registriert: 27.02.2009, 15:44
Alter Benutzername: 6SidedDice
Echter Name: Nico Probst
Wohnort: Bochum
Kontaktdaten:

Re: 3 Kugeln nebeneinander zerstören

Beitrag von dowhilefor »

Bei Verwendung eines Iterators darf eine Datenstruktur nicht verändert werden.
AFAIK stimmt das nicht ganz, erase sollte einen neuen iterator zurückgeben, der absofort gültig ist. Meine c++ Zeit ist aber auch schon etwas länger her :)
Mein Gehirn besteht nur noch aus einem hash-index, ich weiss was ich kenn aber kenn nicht was ich weiss
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: 3 Kugeln nebeneinander zerstören

Beitrag von Aramis »

Die Regeln inwieweit Iteratoren beim erase (oder auch bei anderen Operationen) zerstoert werden, haengen vom Containertyp ab. Bei einem vector wird alles ab und inklusive dem Loeschpunkt invalidiert, bei einer list nur der Loeschpunkt.

Ggf. waere eine Liste also als Container besser geeignet - oder das Zerstoeren vom Sammeln der zu zerstoerenden Kugeln trennen. Das haette ich gemacht. Du versuchst es ja anscheinend auch, nur setzt du es nicht richtig um (habe den Quellcode aber nur kurz ueberflogen).
Antworten