Java数字拼图二维数组实现,控制台可以对空格进行移动

2022-06-20 10:15:28

二维数组实现数字拼图

二维数组可以自己随意定义大小,通过方法判断来实现对所有的数字进行随机打乱,并可以通过移动来正确还原,并可以判断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){// TODO Auto-generated catch block
				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("挑战成功");}

判断当前坐标是否可以移动

/**
	 * 判断当前坐标是否可以移动
	 * 
	 * @param arrays
	 * @return 可以移动返回true
	 */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所在行的具体地址

// 获取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所在列的具体地址

// 获取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出现数组下标越位。

/**
	 * 根据输入的数据,对二维数组进行数据替换
	 * 
	 * @param i         高位坐标
	 * @param j         地位坐标
	 * @param direction 移动方向
	 * @param arrays    需要交换数据的数组
	 */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){// TODO Auto-generated catch block
				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("挑战成功");}//	/**//	 * 判断当前坐标是否可以移动//	 *//	 * @param arrays//	 * @return 可以移动返回true//	 *///	public static boolean isYiDong(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) {//			return true;//		}//		return false;//	}/**
	 * 
	 * @param arrays 需要验证的数据
	 * @return 成功返回true
	 */publicstaticbooleanisOk(
  • 作者:Msy丿P
  • 原文链接:https://blog.csdn.net/MsyLaoLi/article/details/107675610
    更新时间:2022-06-20 10:15:28