二维数组实现数字拼图
二维数组可以自己随意定义大小,通过方法判断来实现对所有的数字进行随机打乱,并可以通过移动来正确还原,并可以判断0(表示空格)是否可以移动,是否在范围内。
publicstaticvoidmain(String[] args){
Scanner scanner=newScanner(System.in);int[][] arrays={{1,2,3},{4,5,6},{7,8,0}};int sum=1;
String direction;bianLi(arrays);daLuanErWeiShuZu(arrays);
System.out.println("========================================");while(true){bianLi(arrays);if(isOk(arrays)){break;}
sum++;try{
Thread.sleep(500);}catch(InterruptedException e){
e.printStackTrace();}
System.out.println("请输入移动方向(W 上、S 下、A 左、D 右)");
direction= scanner.next();switch(direction){case"W":case"w":tiHuanShuZuWeiZhi(returnX(arrays),returnY(arrays),"上", arrays);break;case"S":case"s":tiHuanShuZuWeiZhi(returnX(arrays),returnY(arrays),"下", arrays);break;case"A":case"a":tiHuanShuZuWeiZhi(returnX(arrays),returnY(arrays),"左", arrays);break;case"D":case"d":tiHuanShuZuWeiZhi(returnX(arrays),returnY(arrays),"右", arrays);break;default:
System.out.println("非法输入,重新输入");break;}}
System.out.println("一共走了"+ sum+"步");
System.out.println("挑战成功");}
判断当前坐标是否可以移动
publicstaticbooleanisYiDong(int[][] arrays){int returnX=returnX(arrays);int returnY=returnY(arrays);
System.out.println(returnX+":"+ returnY);if(returnX>=0&& returnX+1< arrays.length&& returnY>=0&& returnY+1< arrays.length){returntrue;}returnfalse;}
获取当前0所在行的具体地址
publicstaticintreturnX(int[][] arrays){for(int i=0; i< arrays.length; i++){for(int j=0; j< arrays[i].length; j++){if(0== arrays[i][j]){return i;}}}return-1;}
获取当前0所在列的具体地址
publicstaticintreturnY(int[][] arrays){for(int i=0; i< arrays.length; i++){for(int j=0; j< arrays[i].length; j++){if(0== arrays[i][j]){return j;}}}return-1;}
二维数组随机打乱,需要判断左上角、右上角、左下角、右下角、中间、上中、下种、左中、右中,那些方向可以移动,生成随机数来确定移动方向
publicstaticvoiddaLuanErWeiShuZu(int[][] arrays){for(int i=0; i< arrays.length; i++){for(int j=0; j< arrays[i].length; j++){if(i==0&& j==0){if(ouShuOrJiShu()){tiHuanShuZuWeiZhi(i, j,"下", arrays);}else{tiHuanShuZuWeiZhi(i, j,"右", arrays);}}if(i==0&& j== arrays[0].length-1){if(ouShuOrJiShu()){tiHuanShuZuWeiZhi(i, j,"下", arrays);}else{tiHuanShuZuWeiZhi(i, j,"左", arrays);}}if(i== arrays.length-1&& j==0){if(ouShuOrJiShu()){tiHuanShuZuWeiZhi(i, j,"上", arrays);}else{tiHuanShuZuWeiZhi(i, j,"右", arrays);}}if(i== arrays.length-1&& j== arrays[i].length-1){if(ouShuOrJiShu()){tiHuanShuZuWeiZhi(i, j,"上", arrays);}else{tiHuanShuZuWeiZhi(i, j,"左", arrays);}}if(i==0&& j>0&& j< arrays[i].length-1){switch(oneToThree(3)){case0:tiHuanShuZuWeiZhi(i, j,"右", arrays);break;case1:tiHuanShuZuWeiZhi(i, j,"下", arrays);break;case2:tiHuanShuZuWeiZhi(i, j,"左", arrays);break;default:break;}}if(j==0&& i>0&& i< arrays.length-1){switch(oneToThree(3)){case0:tiHuanShuZuWeiZhi(i, j,"上", arrays);break;case1:tiHuanShuZuWeiZhi(i, j,"右", arrays);break;case2:tiHuanShuZuWeiZhi(i, j,"下", arrays);break;default:break;}}if(i== arrays.length-1&& j>0&& j< arrays[i].length-1){switch(oneToThree(3)){case0:tiHuanShuZuWeiZhi(i, j,"上", arrays);break;case1:tiHuanShuZuWeiZhi(i, j,"右", arrays);break;case2:tiHuanShuZuWeiZhi(i, j,"左", arrays);break;default:break;}}if(j== arrays[i].length-1&& i>0&& i< arrays[i].length-1){switch(oneToThree(3)){case0:tiHuanShuZuWeiZhi(i, j,"上", arrays);break;case1:tiHuanShuZuWeiZhi(i, j,"左", arrays);break;case2:tiHuanShuZuWeiZhi(i, j,"下", arrays);break;default:break;}}if(i>0&& j>0&& i< arrays.length-2&& j< arrays[i].length-2){switch(oneToThree(4)){case0:tiHuanShuZuWeiZhi(i, j,"上", arrays);break;case1:tiHuanShuZuWeiZhi(i, j,"右", arrays);break;case2:tiHuanShuZuWeiZhi(i, j,"下", arrays);break;case3:tiHuanShuZuWeiZhi(i, j,"左", arrays);break;default:break;}}}}}
该方法实现对0的位置和需要替换位置数据的替换,并对0范围进行验证,怕0出现数组下标越位。
publicstaticvoidtiHuanShuZuWeiZhi(int i,int j, String direction,int[][] arrays){int tem=-1;switch(direction){case"上":if(i>0){
tem= arrays[i][j];
arrays[i][j]= arrays[i-1][j];
arrays[i-1][j]= tem;}break;case"下":if(i< arrays.length-1){
tem= arrays[i][j];
arrays[i][j]= arrays[i+1][j];
arrays[i+1][j]= tem;}break;case"左":if(j>0){
tem= arrays[i][j];
arrays[i][j]= arrays[i][j-1];
arrays[i][j-1]= tem;}break;case"右":if(j< arrays.length-1){
tem= arrays[i][j];
arrays[i][j]= arrays[i][j+1];
arrays[i][j+1]= tem;}break;default:break;}}
完整代码如下
import java.util.Random;import java.util.Scanner;publicclassDemo{publicstaticvoidmain(String[] args){
Scanner scanner=newScanner(System.in);int[][] arrays={{1,2,3},{4,5,6},{7,8,0}};int sum=1;
String direction;bianLi(arrays);daLuanErWeiShuZu(arrays);
System.out.println("========================================");while(true){bianLi(arrays);if(isOk(arrays)){break;}
sum++;try{
Thread.sleep(500);}catch(InterruptedException e){
e.printStackTrace();}
System.out.println("请输入移动方向(W 上、S 下、A 左、D 右)");
direction= scanner.next();switch(direction){case"W":case"w":tiHuanShuZuWeiZhi(returnX(arrays),returnY(arrays),"上", arrays);break;case"S":case"s":tiHuanShuZuWeiZhi(returnX(arrays),returnY(arrays),"下", arrays);break;case"A":case"a":tiHuanShuZuWeiZhi(returnX(arrays),returnY(arrays),"左", arrays);break;case"D":case"d":tiHuanShuZuWeiZhi(returnX(arrays),returnY(arrays),"右", arrays);break;default:
System.out.println("非法输入,重新输入");break;}}
System.out.println("一共走了"+ sum+"步");
System.out.println("挑战成功");}publicstaticbooleanisOk(