Java二维数组实现数字拼图效果
作者:Msy丿P 发布时间:2021-11-21 20:39:17
标签:java,数字拼图
二维数组实现数字拼图,供大家参考,具体内容如下
二维数组可以自己随意定义大小,通过方法判断来实现对所有的数字进行随机打乱,并可以通过移动来正确还原,并可以判断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;
}
}
}
来源:https://blog.csdn.net/MsyLaoLi/article/details/107675610


猜你喜欢
- 详解Java读取Jar中资源文件及实现代码 &
- 本文实例讲述了Android使用Theme自定义Activity进入退出动画的方法。分享给大家供大家参考,具体如下:有没有觉得Activit
- 下面是自己写的三个方法,直接类名.方法即可调用,注意此处未做异常处理.1.下划线转驼峰 lowerLineToHump()2.首字母大写 c
- 这篇做了一个简单的时间轴控件。右侧的数据就是一个简单的字符串。问题还是有的,当右侧的文字长度不一样的时候就会有问题了。现在可以修改一下适配右
- 序列化和反序列化Java是面向对象的语言,与其他语言进行交互(比如与前端js进行http通信),需要把对象转化成一种通用的格式比如json(
- 1、满二叉树、完全二叉树、平衡二叉树、红黑树、二叉搜索树的区别?参考文章:树、二叉树(完全二叉树、满二叉树)概念图解① 满二叉树高度为&nb
- 本文实例为大家分享了Unity实现打砖块游戏的具体代码,供大家参考,具体内容如下效果演示1.创建墙1.1我们用预制体来统一管理墙方便以后对墙
- C#貌似没有专门用于ASCII码转字符或字符转ASCII码的系统函数,所以小编这里就借用一下强制类型转换来实现ASCII码与字符之间的互转。
- 今天本文与大家分享如何得到数组中的最大值和最小值的实例。很适合Java初学者复习数组的基本用法与流程控制语句的使用。具体如下:这个程序主要是
- 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码。反射就是把Java类中的各个成员映射成一个个的Java对象。即在运行状态中,对于
- Mybatis typeAlias标签在实际的工程之中,类的全限定名称很长,当我们需要大量使用的时候,这非常不方便的,然而mybatis提供
- 最近客户更新系统发现,以前的项目在调用相机的时候,闪退掉了,很奇怪,后来查阅后发现,Android 6.0以后需要程序授权相机权限,默认会给
- android 实现拨打电话的app,代码非常简单,功能也很实用,分享给大家。MainActivity.javapackage com.bb
- 随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题。本文着重介绍了在java并发中常见的几种锁机制。1.偏向锁偏
- 本文实例讲述了Android使用onCreateOptionsMenu()创建菜单Menu的方法。分享给大家供大家参考,具体如下:Andro
- RocketMQ发送消息我们在使用RocketMQ发送消息时,一般都会使用DefaultMQProducer,类型的代码如下:Default
- Android 添加系统设置属性的实现及步骤Android源码开发中,常常要用到一些全局标志或者说变量,这时候我们可以给android系统添
- 本文实例讲述了Java Web实现session过期后自动跳转到登陆页功能。分享给大家供大家参考,具体如下:通过过滤器的方式实现 sessi
- 本文实例为大家分享了flutter实现倒计时加载页面的具体代码,供大家参考,具体内容如下效果图实现步骤1、pubspec.yaml中添加依赖
- app_main上一篇文章:# Android 10 启动分析之servicemanager篇 (二)在init篇中有提到,init进程会在