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

本文介绍了一款基于二维数组的数字拼图游戏实现方法。游戏使用3x3矩阵表示拼图,通过随机打乱和玩家操作来还原原始顺序。文章详细讲解了如何判断0(空格)的移动范围,实现数字的随机打乱和玩家输入控制,以及如何验证拼图是否完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二维数组实现数字拼图

二维数组可以自己随意定义大小,通过方法判断来实现对所有的数字进行随机打乱,并可以通过移动来正确还原,并可以判断0(表示空格)是否可以移动,是否在范围内。

public static void main(String[] args) {
		Scanner scanner = new Scanner(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;
	}

获取当前0所在行的具体地址

	// 获取0所在行的位置
	public static int returnX(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所在列的位置
	public static int returnY(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;
	}

二维数组随机打乱,需要判断左上角、右上角、左下角、右下角、中间、上中、下种、左中、右中,那些方向可以移动,生成随机数来确定移动方向

// 二维数组随机打乱
	public static void daLuanErWeiShuZu(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)) {
					case 0:
						tiHuanShuZuWeiZhi(i, j, "右", arrays);
						break;
					case 1:
						tiHuanShuZuWeiZhi(i, j, "下", arrays);
						break;
					case 2:
						tiHuanShuZuWeiZhi(i, j, "左", arrays);
						break;

					default:
						break;
					}
				}
				// 左中
				if (j == 0 && i > 0 && i < arrays.length - 1) {
					switch (oneToThree(3)) {
					case 0:
						tiHuanShuZuWeiZhi(i, j, "上", arrays);
						break;
					case 1:
						tiHuanShuZuWeiZhi(i, j, "右", arrays);
						break;
					case 2:
						tiHuanShuZuWeiZhi(i, j, "下", arrays);
						break;

					default:
						break;
					}
				}
				// 下中
				if (i == arrays.length - 1 && j > 0 && j < arrays[i].length - 1) {
					switch (oneToThree(3)) {
					case 0:
						tiHuanShuZuWeiZhi(i, j, "上", arrays);
						break;
					case 1:
						tiHuanShuZuWeiZhi(i, j, "右", arrays);
						break;
					case 2:
						tiHuanShuZuWeiZhi(i, j, "左", arrays);
						break;

					default:
						break;
					}
				}
				// 右中
				if (j == arrays[i].length - 1 && i > 0 && i < arrays[i].length - 1) {
					switch (oneToThree(3)) {
					case 0:
						tiHuanShuZuWeiZhi(i, j, "上", arrays);
						break;
					case 1:
						tiHuanShuZuWeiZhi(i, j, "左", arrays);
						break;
					case 2:
						tiHuanShuZuWeiZhi(i, j, "下", arrays);
						break;

					default:
						break;
					}
				}
				if (i > 0 && j > 0 && i < arrays.length - 2 && j < arrays[i].length - 2) {
					switch (oneToThree(4)) {
					case 0:
						tiHuanShuZuWeiZhi(i, j, "上", arrays);
						break;
					case 1:
						tiHuanShuZuWeiZhi(i, j, "右", arrays);
						break;
					case 2:
						tiHuanShuZuWeiZhi(i, j, "下", arrays);
						break;
					case 3:
						tiHuanShuZuWeiZhi(i, j, "左", arrays);
						break;

					default:
						break;
					}
				}
			}
		}
	}

该方法实现对0的位置和需要替换位置数据的替换,并对0范围进行验证,怕0出现数组下标越位。

/**
	 * 根据输入的数据,对二维数组进行数据替换
	 * 
	 * @param i         高位坐标
	 * @param j         地位坐标
	 * @param direction 移动方向
	 * @param arrays    需要交换数据的数组
	 */
	public static void tiHuanShuZuWeiZhi(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;

public class Demo {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(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
	 */
	public static boolean isOk(int[][] arrays) {
		int sum = 1;
		for (int i = 0; i < arrays.length; i++) {
			for (int j = 0; j < arrays.length; j++) {
				if (sum == 9) {
					sum = 0;
				}
				if (arrays[i][j] != sum) {
					return false;
				}
				sum++;
			}
		}
		return true;
	}

	// 获取0所在行的位置
	public static int returnX(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所在列的位置
	public static int returnY(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;
	}

	// 遍历二维数组
	public static void bianLi(int[][] arrays) {
		for (int[] is : arrays) {
			for (int is2 : is) {
				System.out.print(is2 + "\t");
			}
			System.out.println();
		}
	}

	// 二维数组随机打乱
	public static void daLuanErWeiShuZu(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)) {
					case 0:
						tiHuanShuZuWeiZhi(i, j, "右", arrays);
						break;
					case 1:
						tiHuanShuZuWeiZhi(i, j, "下", arrays);
						break;
					case 2:
						tiHuanShuZuWeiZhi(i, j, "左", arrays);
						break;

					default:
						break;
					}
				}
				// 左中
				if (j == 0 && i > 0 && i < arrays.length - 1) {
					switch (oneToThree(3)) {
					case 0:
						tiHuanShuZuWeiZhi(i, j, "上", arrays);
						break;
					case 1:
						tiHuanShuZuWeiZhi(i, j, "右", arrays);
						break;
					case 2:
						tiHuanShuZuWeiZhi(i, j, "下", arrays);
						break;

					default:
						break;
					}
				}
				// 下中
				if (i == arrays.length - 1 && j > 0 && j < arrays[i].length - 1) {
					switch (oneToThree(3)) {
					case 0:
						tiHuanShuZuWeiZhi(i, j, "上", arrays);
						break;
					case 1:
						tiHuanShuZuWeiZhi(i, j, "右", arrays);
						break;
					case 2:
						tiHuanShuZuWeiZhi(i, j, "左", arrays);
						break;

					default:
						break;
					}
				}
				// 右中
				if (j == arrays[i].length - 1 && i > 0 && i < arrays[i].length - 1) {
					switch (oneToThree(3)) {
					case 0:
						tiHuanShuZuWeiZhi(i, j, "上", arrays);
						break;
					case 1:
						tiHuanShuZuWeiZhi(i, j, "左", arrays);
						break;
					case 2:
						tiHuanShuZuWeiZhi(i, j, "下", arrays);
						break;

					default:
						break;
					}
				}
				if (i > 0 && j > 0 && i < arrays.length - 2 && j < arrays[i].length - 2) {
					switch (oneToThree(4)) {
					case 0:
						tiHuanShuZuWeiZhi(i, j, "上", arrays);
						break;
					case 1:
						tiHuanShuZuWeiZhi(i, j, "右", arrays);
						break;
					case 2:
						tiHuanShuZuWeiZhi(i, j, "下", arrays);
						break;
					case 3:
						tiHuanShuZuWeiZhi(i, j, "左", arrays);
						break;

					default:
						break;
					}
				}
			}
		}
	}

	/**
	 * 判断是否是偶数
	 * 
	 * @return 偶数返回true
	 */
	public static boolean ouShuOrJiShu() {
		return new Random().nextInt(1000) % 2 == 0 ? true : false;
	}

	/**
	 * 
	 * @param n 需要模的值
	 * @return 返回0-(n-1)的值
	 */
	public static int oneToThree(int n) {
		return new Random().nextInt(1000) % n;
	}

	/**
	 * 根据输入的数据,对二维数组进行数据替换
	 * 
	 * @param i         高位坐标
	 * @param j         地位坐标
	 * @param direction 移动方向
	 * @param arrays    需要交换数据的数组
	 */
	public static void tiHuanShuZuWeiZhi(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;
		}
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值