2017-08-03 5 views
1

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:

enter image description here

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

Antwort

2

Sie sind im Raster für jede Zelle listedCells einmal anrufen, so dass Sie werden 25 Listen bekommen.

Sie sollten Ihre Felder value und IsInMatchPool verwenden, um Zellen zu überspringen, die kein Dreieck haben oder bereits gruppiert wurden.

So ist der Algorithmus:

for every cell: 
    if cell has a triangle and cell is not already marked: 
     create new list by flood-filling from cell (marking cells as you fill) 

Am Ende dieses Prozesses Sie eine Liste aller Gruppen verbundener Zellen haben.

Beachten Sie auch, dass Ihr listedCells Methode nicht up hinzufügt, down usw cList. Das willst du wahrscheinlich tun.

+0

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

+0

Es gibt eine kanonische Frage dazu: https://StackOverflow.com/Questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it – Blorgbeard

Verwandte Themen