# Jawbreaker



## azami1986 (25. Feb 2010)

Hallo Zusammen!

ich hab da ein kleines Problem mit Jawbreaker. Ich denke, dass Spiel müssten die meisten kennen. Wenn nicht, so gibt es unter folgendem Link ein Beispiel:

Jawbreaker

Ich habe die Applikation fast fertig. Nun fehlt mir lediglich das Schieben der Bälle nach Rechts. D.h. sobald eine Lücke besteht, sollen alle Bälle nach rechts verschoben werden.

Ich hätte da eine Lösung. Jedoch finde ich sie ziemlich uneffizient. Kennt jemand da eine bessere Lösung als diese:


```
public void moveRight() {
		for (int x = 0; x < nWidth; x++) {
			for (int x2 = nWidth - 1; x2 > x; x2--) {
				if (this.spielfeld[x2 - 1][nHeight - 1] != WHITE
						&& this.spielfeld[x2][nHeight - 1] == WHITE) {
					for (int y = 0; y < nHeight; y++) {
						int tmp = this.spielfeld[x2][y];
						this.spielfeld[x2][y] = this.spielfeld[x2 - 1][y];
						this.spielfeld[x2 - 1][y] = tmp;
					}
				}
			}
		}
	}
```

Mit 
	
	
	
	





```
WHITE
```
 sind Bälle gemeint, die Bereits gelöscht worden sind.

Ich hoffe, ich könnt mir Helfen.

Mit freundlichen Grüßen
Azami


----------



## Landei (25. Feb 2010)

Übersichtlicher könnte man es sicher bekommen, aber schneller wohl kaum, solange du ein 2D-Array benutzt. Man könnte mit Listen hantieren, die das Löschen wesentlich vereinfachen würden, aber das würde im Gegenzug das Finden zusammenhängender Flächen schwieriger machen.


----------



## azami1986 (25. Feb 2010)

Danke für die Antwort. Hast du eine Idee, wie man es eventuell übersichtlicher machen könnte? Oder dies mit einem Code Beispiel veranschaulichen?

MfG
Azami


----------



## Landei (25. Feb 2010)

Hmmm, geht das? (ungetestet)

```
public void moveRight() {
   java.util.List<int[]> columns = new java.util.ArrayList<int[]>();
   //alle nichtleeren Spalten aufsammeln
   for(int x = 0; x < nWidth; x++) {
      if(this.spielfeld[x][nHeight - 1] != WHITE) {
         columns.add(this.spielfeld[x])
      }
   }
   //links solange wie nötig leere Spalten einfügen, dann die gesammelten Spalten
   for(int x = 0; x < nWidth; x++) {
      if(x + columns.size() < nWidth) {
          this.spielfeld[x] = java.util.Arrays.fill(new int[nHeight], WHITE);
      } else {
          this.spielfeld[x] = columns.remove(0);
      }
   }
}
```


----------



## azami1986 (25. Feb 2010)

Vielen Danke für den Code. Testen konnte ich es noch leider nicht, der folgende Zeile einen 
void zurück gibt und keinen int[]


```
java.util.Arrays.fill(new int[nHeight], WHITE);
```

Weiß Du, wie man das hier am besten lösen könnte?

Viele Grüße
Azami


----------



## Illuvatar (25. Feb 2010)

```
this.spielfeld[x] = new int[nHeight];
java.util.Arrays.fill(this.spielfeld[x], WHITE);
```

sollte tun


----------



## azami1986 (25. Feb 2010)

Funktioniert . Vielen Dank an alle.

Wenn jemand interesse an dem Spiel haben sollte, so kann ich den gesamten Code auch gerne hochladen.

Viele Grüße
Azami


----------



## Landei (25. Feb 2010)

Die Arrays-API ist echt bescheuert, jedesmal falle ich drauf rein :-/


----------

