思路:
1,生成一个拼图棋盘
2,准备一个正确的数组格式,一个给用户拼的数组
3,每次移动要看用户是否拼完
/**
* FileName: Puzzle
* Author: 86186
* Date: 2022/3/22 12:23
* Description: Puzzle
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
package project;
import java.util.Random;
import java.util.Scanner;
/**
* 〈一句话功能简述〉<br>
* 〈Puzzle〉
*
* @author Hacker
* @create 2022/3/22
* @since 1.0.0
*/
public class Puzzle {
public static int level;//数组长度
public static int[][] resultArr;
public static Scanner input = new Scanner(System.in);
public static int x;//0的横坐标
public static int y;//0的纵坐标
public static int step;//记录用户移动的步数
public static boolean signs = true;//判断是否可以移动
public static void main(String[] args) {
System.out.println("==拼图游戏==");
System.out.println("请输入难度: 1 简单 2 普通 3 困难");
level = input.nextInt();
level += 2;
System.out.println("开始游戏");
int[][] pazzle = buildPuzzle();//给用户拼的数组
Random r = new Random();
char[] sign = {'w','s','a','d'};
//任意打乱
char[] fings = new char[20];
findZeor(pazzle);
for(int i = 0;i < 20;i ++){
int temp = r.nextInt(4);
char t = sign[temp];
// System.out.println(t);
switch (t){
case 'w':
signs = moverUp(pazzle);
break;
case 's':
signs = moverDown(pazzle);
break;
case 'a':
signs = shiftLeft(pazzle);
break;
case 'd':
signs = shiftRight(pazzle);
break;
}
if(signs){
if(t == 'a'){
fings[i] = 'd';
}else if(t == 'd'){
fings[i] = 'a';
}else if(t == 'w'){
fings[i] = 's';
}else{
fings[i] = 'w';
}
}
}
show(resultArr);
System.out.println("======================");
show(pazzle);
while(true){
System.out.println("请选择: w 上移:s 下移:a 左移:d 右移");
String chocie = input.next();
switch (chocie){
case "w":
signs = moverUp(pazzle);
break;
case "s":
signs = moverDown(pazzle);
break;
case "a":
signs = shiftLeft(pazzle);
break;
case "d":
signs = shiftRight(pazzle);
break;
//以下俩个方式,用户是不知道的!!!!嘿嘿
case "chenqian"://一键完成
pazzle = resultArr;
break;
case "fings"://得到正确结果的步骤
for(int i = fings.length - 1;i >= 0;i --){
System.out.print(fings[i] + " ");
}
System.out.println();
break;
}
if(!signs){
System.out.println("不能移动!!!!!");
}
step ++;
show(pazzle);
if(success(pazzle)){
System.out.println("恭喜你拼图完成!!!,你一共走了" + step + "步");
break;
}
}
}
//比较是否完成
public static boolean success(int[][] array){
for(int i = 0;i < array.length;i ++){
for(int j = 0;j < array[i].length;j ++){
if(resultArr[i][j] != array[i][j]){
return false;
}
}
}
return true;
}
//右移
public static boolean shiftRight(int[][] array){
if(y == 0){
return false;
}
int temp = array[x][y];
array[x][y] = array[x][y - 1];
array[x][y - 1] = temp;
y --;
return true;
}
//左移
public static boolean shiftLeft(int[][] array){
if(y == level - 1){
// System.out.println("不能移动");
return false;
}
int temp = array[x][y];
array[x][y] = array[x][y + 1];
array[x][y + 1] = temp;
y ++;
return true;
}
//下移
public static boolean moverDown(int[][] array){
if(x == 0){
// System.out.println("不能移动!!!");
return false;
}
int temp = array[x][y];
array[x][y] = array[x - 1][y];
array[x - 1][y] = temp;
x --;
return true;
}
//上移
public static boolean moverUp(int[][] array){
if(x == level - 1){
return false;
}
int temp = array[x][y];
array[x][y] = array[x + 1][y];
array[x + 1][y] = temp;
x ++;
return true;
}
//找零
public static void findZeor(int[][] pazzle){
for(int i = 0;i < pazzle.length;i ++){
for(int j = 0;j < pazzle[i].length;j ++){
if(pazzle[i][j] == 0){
x = i;
y = j;
return;
}
}
}
}
//创建拼图
public static int[][] buildPuzzle(){
resultArr = oneToTwo(buildArr());
int[] t = buildArr();
//upSet(t);
int[][] pazzle = oneToTwo(t);
return pazzle;
}
//显示数组
public static void show(int[][] array){
for(int[] t : array){
for(int i : t){
System.out.print(i + "\t");
}
System.out.println();
}
}
//数组的打乱
public static void upSet(int[] array){
Random r = new Random();
for(int i = 0;i < array.length - 2;i ++){
int index1 = r.nextInt(array.length - i - 1);
int index2 = array.length - i - 1;
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
}
//一维数组转为二维数组
public static int[][] oneToTwo(int[] array){
int[][] buildArr = new int[level][level];
for(int i = 0;i < array.length;i ++){
buildArr[i / level][i % level] = array[i];
}
return buildArr;
}
//创建一个一维数组
public static int[] buildArr(){
int[] newArr = new int[level * level];
for(int i = 0;i < newArr.length - 1;i ++){
newArr[i] = i + 1;
}
newArr[newArr.length - 1] = 0;
return newArr;
}
}