2048 更改检查方法 java
2048 change check method java
我正在尝试在 java 中编写一个 2048 游戏。我正在努力做到这一点,因此它会检查棋盘是否已更改,如果已更改,它将添加到移动计数器并向棋盘添加一个数字。否则它不应该做任何事情。我 运行 遇到了一个错误,其中检查它是否被更改的方法每次都 return 是真的,我似乎无法弄清楚为什么。
这是我的 isChecked 方法,如果电路板已更改,它应该 return 为真,否则为假。
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;
}
下面是处理左移动、组合等的方法,上下和右基本相同,只是稍微改变了方向,所以我决定不把它们包括在内post 因为我觉得没有必要
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 是 class 变量(它们都在同一个 class 中),它是一个代表游戏板的 2d int 数组。
尝试使用:
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;
}
并手动克隆数组中的每一行
检查ischanged函数。如果相应的值不相等,则您 returning 为 false。实际上这意味着如果板子没有改变,你就是 returning false。
或者只是这样做:
if(copy[i][j]==orij[i][j]) //这里我只是用“==”替换了“!=”
return 错误;
也像@Talik说的使用深拷贝
我正在尝试在 java 中编写一个 2048 游戏。我正在努力做到这一点,因此它会检查棋盘是否已更改,如果已更改,它将添加到移动计数器并向棋盘添加一个数字。否则它不应该做任何事情。我 运行 遇到了一个错误,其中检查它是否被更改的方法每次都 return 是真的,我似乎无法弄清楚为什么。
这是我的 isChecked 方法,如果电路板已更改,它应该 return 为真,否则为假。
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;
}
下面是处理左移动、组合等的方法,上下和右基本相同,只是稍微改变了方向,所以我决定不把它们包括在内post 因为我觉得没有必要
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 是 class 变量(它们都在同一个 class 中),它是一个代表游戏板的 2d int 数组。
尝试使用:
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;
}
并手动克隆数组中的每一行
检查ischanged函数。如果相应的值不相等,则您 returning 为 false。实际上这意味着如果板子没有改变,你就是 returning false。
或者只是这样做: if(copy[i][j]==orij[i][j]) //这里我只是用“==”替换了“!=” return 错误;
也像@Talik说的使用深拷贝