2016-05-30 11 views
0

私は2048クローン(単純なもの)をプログラミングしています。私が取り組んでいる方法は、多次元配列の数字を指定された方向に見やすくスライドさせています。私は左にスライドするためのこのコードを持っていますが、それを上下左右にスライドさせる方法を理解することはできません。多次元配列の方向に数値を移動します。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; 
} 

感謝のコメントで述べたように

+0

'moveUp(int [] [] grid)'と言われますか?あなたは 'matriz'を使用していないので、' grid'はどこにも宣言されていません。 – Gendarme

+0

はい、私はスペイン語で書いています。私はそれを忘れてしまいました。編集されました。 – Paw

+1

配列はオブジェクトであり、プリミティブな値ではありません。 'copy'は実際にはコピーではありません。同じオブジェクトを指す別のリファレンスです。コピーしたい場合は、 'clone()'を使うか、2つのfor-loopで手動で行う必要があります。 – Gendarme

答えて

0

は、溶液があなたのコードに基づいていますがcopy変数を使用しようとしている方法を検討し、clone()

たくさん。

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

あなたが取得する:あなたがそれを実行した場合

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; 
} 

:あなたは同じ番号(2,4,8など)が隣接しているほかを達成することができますので、私はそれを少し変更しました次のようにします:

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

ありがとう、私は追加のための別の方法がありますし、私は基本的にあなたのメソッドが何であるか、再び移動します。私は右にも上へも下にも移動できるようにしたかったのです。私が最後にしたことは、配列を回転させ、左に移動し、元の位置に再び回転させることでした。 – Paw

+0

@Paw私はその方法をそのまま保つでしょう。要素を下に移動する場合は、配列を右に回転する必要があります。したがって、最初の列が最初の行になる場合、たとえば配列bの場合、[0、2、4、4]列の上にポストされ、最初の行になり、配列の残りの日付になります。その後、moveLeft(b)を実行します。アレイを元の状態に戻すことができます。 "moveRight(b)"(2回回転、moveLeftを実行)、 "moveUp(b)"(3回回転、moveLeftを実行)の場合と同じことです。 – jsurf