Jawbreaker

azami1986

Mitglied
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:

Java:
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
Java:
WHITE
sind Bälle gemeint, die Bereits gelöscht worden sind.

Ich hoffe, ich könnt mir Helfen.

Mit freundlichen Grüßen
Azami
 
Zuletzt bearbeitet:

Landei

Top Contributor
Ü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

Mitglied
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

Top Contributor
Hmmm, geht das? (ungetestet)
Java:
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

Mitglied
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:
java.util.Arrays.fill(new int[nHeight], WHITE);

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

Viele Grüße
Azami
 
Zuletzt bearbeitet:

Illuvatar

Top Contributor
Java:
this.spielfeld[x] = new int[nHeight];
java.util.Arrays.fill(this.spielfeld[x], WHITE);

sollte tun ;)
 

azami1986

Mitglied
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
 

Neue Themen


Oben