In der Tech-Demo, die ich erstellen möchte, werden vom Spieler Blöcke im Tetrominoe-Stil platziert. Zu diesem Zeitpunkt prüft das Spiel, ob sie ein Quad mit vorhandenen Formen auf dem Brett erstellt haben (ein 2D-Array). In diesem Fall sollte das Quad auf irgendeine Weise verarbeitet werden.
Ich habe ein 2D-Array wie folgt:
[ [0, 0, 0, 1, 1, 1],
[0, 1, 1, 1, 1, 1],
[1, 0, 0, 1, 1, 1],
[1, 0, 0, 1, 0, 1] ]
Und ich muss 'Quad'-Muster wie das in der oberen rechten Ecke identifizieren, z
[ [1, 1, 1],
[1, 1, 1],
[1, 1, 1] ]
Ich bin mir nicht sicher, wie ich das am besten machen kann. Ich habe mir einige zweidimensionale Array-Muster-Matching-Algorithmen angesehen, die alle das 2D-Array in 1D zu reduzieren scheinen, und dann einen 1D-Textsuchalgorithmus (z. B. KMP) verwendet, um Übereinstimmungen zu identifizieren. Meine Probleme mit dieser Idee sind, dass das Quad jede Größe haben kann, solange es rechteckig und größer als ein beliebiges Minimum ist (in meinem Fall 2 x 2).
Ich dachte auch darüber nach, für jede Position der neu platzierten Tetrominoe eine Variante des 4-Wege-Flutfüllungsalgorithmus oder der Kennzeichnung verbundener Komponenten zu verwenden. Aber ich bin mir nicht ganz sicher, wie ich dem Pfad am besten folgen und die Grenzen eines Quads festlegen soll (zum Beispiel, um dies zu erfassen:
[ [1, 1, 1],
[1, 1, 1],
[1, 1, 1] ]
aus dieser:
[ [1, 1, 1, 1],
[1, 1, 1, 0],
[1, 1, 1, 0] ]
Meine letzte ist jedoch vielleicht eine Überflutung, um alle miteinander verbundenen Teile zu erhalten, nachdem eine Tetrominoe gelandet ist, und dann die gezackten Kanten abzurunden, indem Sie möglicherweise die Anzahl der Nachbarn jedes Blocks überprüfen. Wenn es 1 ist, entfernen Sie sie und wiederholen Sie den Vorgang, bis alle verbleibenden übrig sind Blöcke haben 2 oder mehr Nachbarn. Aber das scheint langsam zu sein.
Hat jemand Erfahrung mit diesem Problem oder Hinweise, wie diese Aufgabe am besten gelöst werden kann? Ich bin sicher, es gibt einen gemeinsamen oder zumindest anwendbaren Algorithmus, ich weiß es einfach nicht!