在多维数组java中沿方向移动数字

Posted

技术标签:

【中文标题】在多维数组java中沿方向移动数字【英文标题】:Move numbers in directions in multidimensional array java 【发布时间】:2016-09-27 19:19:09 【问题描述】:

我正在编写一个 2048 克隆(一个简单的克隆),我正在研究的方法是将多维数组中的数字尽可能沿指定方向滑动。我有这个向左滑动的代码,但我不知道如何让它向上、向下和向右滑动。

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;

有什么想法吗?非常感谢

【问题讨论】:

应该是moveUp(int[][] grid)吗?因为你没有使用matriz 并且grid 没有在任何地方声明。 是的,我正在用西班牙语写作,但忘记翻译了。已编辑。 请记住,数组是对象而不是原始值。 copy 实际上不是副本。它是指向同一个对象的另一个引用。如果要复制它,则必须使用 clone() 或在两个 for 循环中手动执行。 哦,好的,我复制了一份,以备后用,看看板子有没有变化。忽略那个。该方法可以完美地向左滑动,但我想要的是能够向其他方向滑动,我不知道如何。谢谢。 理解你的代码并不容易。这不是很直接,而且你没有 cmet 解释你在做什么。此外,该方法称为moveUp(),但您正在使用它向左移动? 【参考方案1】:

如 cmets 中所述,请考虑您将如何使用 copy 变量和 clone()

解决方案基于您的代码。我稍作改动,这样当相同的数字(2、4、8 等)彼此相邻时,您可以实现加法:

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;

如果你运行它:

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

你会得到以下结果:

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

【讨论】:

谢谢,我有一个单独的添加方法,然后我再次移动,这基本上就是你的方法所做的。我也希望能够上下左右移动。我最后做的是旋转阵列,向左移动,然后再次旋转到原始位置。 @Paw 我会保持方法不变。如果要向下移动元素,则必须将数组向右旋转。因此,如果第一列将成为第一行,例如在我发布在列 [0,2,4,4] 上方的数组 b 中,则必须成为第一行,并且对于数组的休息日期相同。之后你运行 moveLeft(b);然后将阵列旋转回其先前的状态。对于“moveRight(b)”(旋转两次,运行 moveLeft)和“moveUp(b)”(旋转 3 次,运行 moveLeft),您必须做同样的事情。

以上是关于在多维数组java中沿方向移动数字的主要内容,如果未能解决你的问题,请参考以下文章

多维数组c#数字排序[关闭]

Java多维数组使用注意事项

为啥 Java 没有真正的多维数组?

Java中如何获取多维数组的长度

创建具有未指定可变行长度的多维数组(Java)

对数字和文本的多维对象数组进行排序