So habe ich diese Flut Fill-Methode:Wie mache ich den Flood-Fill-Algorithmus anders? Listen der einzelnen Gruppen im Grid?
public int groupedCells(int y, int x, int value)
{
//base state
if (!gSetup.isValidLocation(y, x) ||
gSetup.getCell(y, x).value != value ||
gSetup.getCell(y, x).cMAtch.isInMatchPool)
{
return 0;
}
// keep track of matched cells
gSetup.getCell(y, x).cMAtch.isInMatchPool = true;
// collect
int up = groupedCells(y + 1, x, value); // up
int left = groupedCells(y, x - 1, value); // left
int right = groupedCells(y, x + 1, value); // right
int down = groupedCells(y - 1, x, value); // down
// sum
int total = up + left + right + down + 1;
return total;
}
im Grunde habe ich dieses Raster:
und zur Zeit, wenn ich auf einem gelbes Dreieck klicken, wird die oben beschriebene Methode wird mir sagen, wie viele von ihnen sind nebeneinander.
Was ich will, ist eine Lösung, die alle über das Netz laufen, und überprüfen, ob eine Gruppe hat:
weniger als 3-Dreiecke tut dann (A)
wenn es hat 3-Dreiecke dann tun (B)
wenn es 4-Dreiecke hat dann tun (C)
etc ...
Bin mir nicht sicher, aber ich dachte, der beste Weg ist, eine Liste für jede Gruppe zu haben, und dann diese Bedingungen über die Listen zu überprüfen.
versuchte ich es hier aber die Liste immer wieder neu zu initialisieren selbst, so dass es immer entweder 0-Zellen oder 1:
public List<CellSetup> listedCells(int y, int x, int value)
{
List<CellSetup> cList = new List<CellSetup>();
//base state
if (!gSetup.isValidLocation(y, x) ||
gSetup.getCell(y, x).value != value ||
gSetup.getCell(y, x).cMAtch.isInMatchPool)
{
return cList;
}
// keep track of matched cells
gSetup.getCell(y, x).cMAtch.isInMatchPool = true;
cList.Add(gSetup.getCell(y, x));
// collect
List<CellSetup> up = listedCells(y + 1, x, value); // up
List<CellSetup> left = listedCells(y, x - 1, value); // left
List<CellSetup> right = listedCells(y, x + 1, value); // right
List<CellSetup> down = listedCells(y - 1, x, value); // down
return cList;
}
Das Ergebnis dieser Methode, wenn sein hier genannt:
for (int y = 0; y < gSetup.cell2DArray.GetLength(0); y++)
{
for (int x = 0; x < gSetup.cell2DArray.GetLength(1); x++)
{
print(listedCells(y, x, 1).Count);
}
}
druckt "1" dreimal und "0" 22 mal.
HINWEIS: Dies ist für ein Spiel, in Einheit gemacht.
Danke
also die Zeile, wo ich eine neue Liste erstellen sollte nach dem "Basiszustand" sein (der erste, wenn alles überprüft), wenn ja, dann habe ich das, und jetzt bekomme ich eine "NullReferenceException" – alaslipknot
Es gibt eine kanonische Frage dazu: https://StackOverflow.com/Questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it – Blorgbeard