Seite 1 von 1

3 Kugeln nebeneinander zerstören

Verfasst: 31.01.2012, 11:37
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;
		}
	}
}

Re: 3 Kugeln nebeneinander zerstören

Verfasst: 31.01.2012, 11:52
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.

Re: 3 Kugeln nebeneinander zerstören

Verfasst: 31.01.2012, 12:02
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.

Re: 3 Kugeln nebeneinander zerstören

Verfasst: 31.01.2012, 13:42
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.

Re: 3 Kugeln nebeneinander zerstören

Verfasst: 31.01.2012, 15:12
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 :)

Re: 3 Kugeln nebeneinander zerstören

Verfasst: 31.01.2012, 16:46
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).