2016-05-30 5 views
0

Ich programmiere einen 2048-Klon (einen einfachen) und die Methode, an der ich arbeite, verschiebt die Zahlen im multidimensionalen Array so weit wie möglich in die angegebene Richtung. Ich habe diesen Code für das Verschieben nach links, aber ich kann nicht herausfinden, wie man es nach oben, unten und rechts schieben kann.Verschieben Sie Zahlen in Richtungen im mehrdimensionalen Array. Java

public void moveLeft(int[][] grid) 
{ 
    int [][] copy = grid; 
    for(int x = 0; x < copy.length; x++){ 
     int[] row = new int[4]; 
     for(int y = 0; y < copy[x].length; y++){ 

      if (copy[x][y] != 0) 
      { 
       int temp = 0; 
       while(row[temp] != 0) { 
        temp++; 
       } 
       row[temp] = copy[x][y]; 
      } 

     } 
     copy[x] = row; 
    } 
    grid = copy; 
} 

Irgendwelche Ideen? Vielen Dank

+0

Soll es sagen 'moveUp (int [] [] Grid)'? Weil du nicht 'matriz' verwendest und' grid' nirgendwo deklariert ist. – Gendarme

+0

Ja, ich schreibe Spanisch und ich habe vergessen, das zu übersetzen. Bearbeitet. – Paw

+1

Beachten Sie, dass Arrays Objekte und keine primitiven Werte sind. 'copy' ist keine Kopie. Es ist eine andere Referenz, die auf das gleiche Objekt zeigt. Wenn Sie es kopieren möchten, müssten Sie 'clone()' verwenden oder manuell in zwei for-Schleifen tun. – Gendarme

Antwort

0

Wie in den Kommentaren erwähnt überlegen, wie Sie die copy Variable und verwenden werden clone()

Die Lösung auf dem Code basiert. Habe ich es ein wenig, so dass Sie die Zugabe erreichen können, wenn gleiche Anzahl (2,4,8 usw.) nebeneinander sind:

public void moveLeft(int[][] grid){ 
    int [][] copy = grid.clone(); 
    for(int x = 0; x < copy.length; x++){ 
     int[] row = new int[4]; 
     for(int y = 0; y < copy[x].length; y++){ 
      if (copy[x][y] != 0){ 
       int temp = 0; 
       while(row[temp] != 0) { 
        temp++; 
       } 
       row[temp] = copy[x][y]; 
      } 
     } 
     for(int k=0; k<row.length-1; k++){ 
      if(row[k] == row[k+1]){ 
       row[k] = row[k]+row[k+1]; 
       row[k+1] = 0; 
      } 
     } 
     copy[x] = row; 
    } 
    for(int x = 0; x < copy.length; x++){ 
     int[] row = new int[4]; 
     for(int y = 0; y < copy[x].length; y++){ 
      if (copy[x][y] != 0){ 
       int temp = 0; 
       while(row[temp] != 0) { 
        temp++; 
       } 
       row[temp] = copy[x][y]; 
      } 
     } 
     copy[x] = row; 
    } 
    grid = copy; 
} 

Wenn Sie es ausführen:

int[][] b = {{0, 2, 0, 2},{2, 2, 0, 8},{4, 4, 4, 2},{4, 2, 4, 2}}; 
moveLeft(b); 

Sie das bekommen folgende:

4 0 0 0 
4 8 0 0 
8 4 2 0 
4 2 4 2 
+0

Danke, ich habe eine separate Methode zum Hinzufügen und dann bewege ich mich wieder, was im Grunde Ihre Methode ist. Ich wollte in der Lage sein, mich auch nach rechts und links zu bewegen. Was ich am Ende getan habe, war das Array rotieren, die Bewegung nach links und dann wieder in die ursprüngliche Position drehen. – Paw

+0

@Paw Ich würde die Methode beibehalten wie sie ist. Für den Fall, dass Sie Elemente nach unten verschieben möchten, müssen Sie das Array nach rechts drehen. Wenn also die erste Spalte zur ersten Zeile wird, zum Beispiel in dem Array b, das oben angegeben wurde, muss die Spalte [0, 2, 4, 4] zur ersten Zeile werden und das gleiche zum Restdatum des Arrays. Danach machst du moveLeft (b); und dann das Array in den vorherigen Zustand zurückdrehen. Das gleiche gilt für "moveRight (b)" (zweimal rotieren, moveLeft ausführen) und für "moveUp (b)" (dreimal drehen, moveLeft ausführen). – jsurf

Verwandte Themen