2048更改检查方法java
Posted
技术标签:
【中文标题】2048更改检查方法java【英文标题】:2048 change check method java 【发布时间】:2019-07-19 05:16:07 【问题描述】:我正在尝试用 java 编写一个 2048 游戏。我正在尝试使它检查板是否已更改,如果已更改,它将添加到移动计数器并在板上添加一个数字。否则它不应该做任何事情。我遇到了一个错误,检查它是否已更改的方法每次都返回 true,我似乎无法弄清楚原因。
这是我的 isChecked 方法,如果电路板已更改,则返回 true,否则返回 false。
public boolean isChanged(int [][]copy,int [][]orig)
if(copy.length!=orig.length)
System.out.print("INVALID MOVE");
return false;
for(int i=0;i<copy.length;i++)
for(int j=0;j<copy[i].length;j++)
if(copy[i][j]!=orig[i][j])
System.out.print("INVLAID MOVE");
return false;
System.out.println("VALID MOVE");
moves++;
return true;
以下是处理左移,组合等的方法,上下左右基本相同,只是稍微改变了方向,所以我决定不将它们包含在这篇文章中,因为我没有感觉他们是必要的
public void shiftLeft()
for (int x = 0; x < board.length; x++)
for (int y = board[x].length-1; y>0; y--)
if (board[x][y -1] == 0 && board[x][y] != 0)
board[x][y - 1] = board[x][y];
board[x][y] = 0;
if(y!=board[x].length-1)
y+=1;
public void combineLeft()
for (int x = 0; x < board.length; x++)
for (int y =board[x].length-2; y >=0; y--)
if(board[x][y]==board[x][y+1])
board[x][y]*=2;
board[x][y+1]=0;
public void left()
int [][] copy=board.clone();
shiftLeft();
shiftLeft();
combineLeft();
shiftLeft();
if(isChanged(copy,board)==true)
addNum();
addNum() 只是一个将数字添加到棋盘上随机空位置的函数。 board 是类变量(它们都在同一个类中),它是一个代表游戏板的 2d int 数组。
【问题讨论】:
【参考方案1】:检查 ischanged 函数。如果相应的值不相等,则返回 false。实际上,这意味着如果板没有更改,您将返回 false。
或者只是这样做: if(copy[i][j]==orij[i][j]) //这里我只是把“!=”换成了“==” 返回错误;
也像@Talik 说的使用深拷贝
【讨论】:
【参考方案2】:尝试使用:
Arrays.copyOf(..)
我认为克隆只是将板上数组上的引用复制到一个新数组中。所以每次换板,就换克隆
其他选项如下所示: How to clone a multidimensional array in java?
深拷贝方法
public static int[][] deepCopyIntMatrix(int[][] input)
if (input == null)
return null;
int[][] result = new int[input.length][];
for (int r = 0; r < input.length; r++)
result[r] = input[r].clone();
return result;
并手动克隆数组中的每一行
【讨论】:
是的,但是他有一个数组数组,里面的数组不会是克隆的,而是字面上相同的数组 看这里:imgur.com/a/bsNmkGO每个子数组的地址都是一样的以上是关于2048更改检查方法java的主要内容,如果未能解决你的问题,请参考以下文章
如何更改Java Set的retainall方法以使用equals方法而不是==运算符?