Bubble Shooter ist ein klassisches Spiel, bei dem der Spieler farbige Blasen auf ein Feld voller anderer Blasen schießt. Das Ziel besteht darin, alle Blasen auf dem Spielfeld zu eliminieren, indem man Blasenkombinationen derselben Farbe abschießt. Zu den Grundregeln gehören:
<1> Wenn der Spieler 3 Blasen zusammenbringt, platzen die Blasen auf und werden vom Spielbrett entfernt.
<2> Wenn sich eine Blase von der Wurzel löst, wird sie „schwebend“ und vom Brett entfernt.
Beginnen wir am Scheitelpunkt unseres Diagramms:
Die Blase ist einfach eine Klasse, die alle Variablen bereithält, die wir brauchen. Zuerst setzen wir die Tiefe auf -1 und die Erkennung auf „falsch“, dann fügen wir alle angrenzenden Blasen zur Kantenliste hinzu.
public class Bubble {
public BubbleColor mBubbleColor ;
public int mDepth = - 1 ;
public boolean mDiscover = false ;
public final ArrayList < Bubble > mEdges = new ArrayList <>( 6 );
// ...
}
Um übereinstimmende Blasen zu finden, verwenden wir BFS, um unser Diagramm zu durchsuchen. Wir beginnen mit der neuen Aufnahme des Blasenspielers, die nach der Kollision mit anderen Blasen zur Grafik hinzugefügt wird. Dann überprüfen wir die Tiefe. Wenn sie größer oder gleich 2 ist (beginnend bei 0), entfernen wir einfach die Blasentiefe, die nicht -1 ist.
private void bfs ( Bubble root , BubbleColor color ) {
Queue < Bubble > queue = new LinkedList <>();
root . mDepth = 0 ;
queue . offer ( root );
while ( queue . size () > 0 ) {
Bubble currentBubble = queue . poll ();
for ( Bubble b : currentBubble . mEdges ) {
// Unvisited bubble
if ( b . mDepth == - 1 && b . mBubbleColor == color ) {
b . mDepth = currentBubble . mDepth + 1 ;
queue . offer ( b );
}
}
}
}
Um Floater zu finden, verwenden wir DFS, um unser Diagramm zu durchsuchen.
private void dfs ( Bubble bubble ) {
bubble . mDiscover = true ;
for ( Bubble b : bubble . mEdges ) {
if (! b . mDiscover && b . mBubbleColor != BubbleColor . BLANK ) {
dfs ( b );
}
}
}
Zuerst beginnen wir mit der Blase in der ersten Reihe als Wurzel.
private void popFloater () {
// We start dfs from root
for ( int i = 0 ; i < mCol ; i ++) {
Bubble bubble = mBubbleArray [ 0 ][ i ]; // Bubble at row 0
if ( bubble . mBubbleColor != BubbleColor . BLANK ) {
// Search from root bubble with dfs
dfs ( bubble );
}
}
// ...
}
Dann entfernen wir einfach alle Blasen, die nicht entdeckt werden. (Eigentlich auf BLANK setzen, nicht unbedingt aus unserem Diagramm entfernen)
Graphalgorithmus basierend auf „Introduction to Algorithms“ von Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest und Clifford Stein
Spiel-Engine basierend auf „Mastering Android Game Development“ von Raul Pautals