拼图游戏
我的想法:
1.我想用一维数组打乱
在3*3二维数组(拼图)中的拿空格上下左右移动就是在一维数组中用该位置与+1,-1,+3,-3;
1,2,3,4,5,6,7,8
1,2,3
4,5,6
7,8
2.打乱后我用asdw控制空格的走位
3.转成二维数组显示
4.移动后的一位数组,我和刚开始记录的数组比较,一致完成拼图
思路:
1.产生拼图数组(1.定义创建拼图数组的方法2.在RunGame里面创建数组并初始数组记录)
2.按步打乱数组(1.自定义Util类中shuffle方法打乱2.RunGame类中调用shuffle方法打乱3.转为二维数组遍历打印,显示打乱的结果)
3.按a,s,d,w移动空格(因为打乱也是拿空格打乱的,可以用全局变量记录空格位置)
4.完成拼图(移动后的一位数组,我和刚开始记录的数组比较,一致完成拼图)
一 产生拼图数组
package pingtu;
public class LevelArrays {
public static String [] buildArrays(int level) {//创建,level表示难度等级
String []arrays = new String [(level+2)*(level+2)];
for(int i = 0; i<arrays.length-1;i++) {//遍历赋值
arrays[i] = i+1+"";
}
arrays[arrays.length-1] = " ";//最后一个为空格字符串
return arrays;//返回创建好的拼图数组
}
}
二 拼图主运行主程序
package pingtu;
import java.util.Arrays;
import java.util.Scanner;
public class GameRun {
public static Scanner s = new Scanner(System.in);
public static void main(String[] args) {
while (true) {
System.out.println("欢迎进入拼图世界:按y键开始游戏");
String str = s.next();
if (str.equalsIgnoreCase("Y")) {
break;
} //按y键开始游戏
}
System.out.println("请输入游戏的难度:");
int level = s.nextInt();
String levelArray[] = LevelArrays.buildArrays(level);//产生创建的难度拼图数组
String initLevelArray[] = new String[levelArray.length];
initLevelArray = Arrays.copyOf(levelArray, levelArray.length);//记录初始数组(若直接赋值是引用)
levelArray = Util.shuffle(levelArray);//打乱
String dis[][] = Util.convertor(levelArray);//转化为二维数组显示
Util.printdisArray(dis);//遍历打印显示二维数组
while (true) {
levelArray = Util.asdwMove(levelArray);
dis = Util.convertor(levelArray);
Util.printdisArray(dis);
if (Arrays.toString(initLevelArray).equals(Arrays.toString(levelArray))) {//将起初记录的数组和按键移动后的数组转成字符串后进行比较
break;
}
}
System.out.println("拼图成功!总共用了"+Util.moveTimes+"步");
}
}
三 自定义工具类
package pingtu;
import java.util.Random;
import java.util.Scanner;
public class Util {
private static Random r = new Random();
private static Scanner s = new Scanner(System.in);
private static int spaceIndex;// 用来记录打乱后的空格
static int moveTimes;
public static String[][] convertor(String arrays[]) {//一维数组转二维数组
int row = (int) Math.sqrt(arrays.length);// 得到行
int column = row;
String[][] dis = new String[row][column];
for (int i = 0; i < arrays.length; i++) {
row = i / (int) (Math.sqrt(arrays.length));
column = i % (int) (Math.sqrt(arrays.length));
dis[row][column] = arrays[i];
}
return dis;
}
public static void printdisArray(String[][] dis) {//打印数组
int num = 0;
for (String[] a : dis)
for (String element : a) {
System.out.print(element + "\t");
num++;
if (num % (a.length) == 0) {
System.out.println();
}
}
}
public static String[] shuffle(String arrays[]) {
int t1 = -(int) Math.sqrt(arrays.length);
int t2 = (int) Math.sqrt(arrays.length);// 记录长度开方后的数,后面用
int[] move1 = { 1, t1, t2 };// 第一种打乱方式
int[] move2 = { -1, t2, t1 };// 第二种打乱方式
int[] move3 = { -1, 1, t1, t2 };// 第三种打乱方式
spaceIndex = arrays.length - 1;
for (int i = 0; i < 50 * arrays.length; i++) {
if (spaceIndex / t2 > 0 && spaceIndex / t2 < t2 - 1 && spaceIndex % t2 == 0) {// 交换一:空格在第一列第二行起
int moveIndex;
if (spaceIndex / t2 == t2 - 1) {// 空格在最后一行
moveIndex = move1[r.nextInt(2)];
} else {
moveIndex = move1[r.nextInt(3)];// 空格在第一行不是第一行和最后一行
}
int moveLocation = spaceIndex + moveIndex;
swop(arrays, spaceIndex, moveLocation);
spaceIndex = moveLocation;
} else if (spaceIndex / t2 >= 0 && spaceIndex / t2 < t2 - 1 && spaceIndex % t2 == t2 - 1) {// 交换二:空格在最后一列不在最后一行
int moveIndex;
if (spaceIndex / t2 == 0) { // 空格在第一行第一列
moveIndex = move2[r.nextInt(2)];
} else { // 空格在最后一列不是第一行和最后一行
moveIndex = move2[r.nextInt(3)];
}
int moveLocation = spaceIndex + moveIndex;
swop(arrays, spaceIndex, moveLocation);
spaceIndex = moveLocation;
} else {
int moveIndex = move3[r.nextInt(4)]; // 交换三, 空格在可用边界判断的区域
int moveLocation = spaceIndex + moveIndex;
if (moveLocation >= 0 && moveLocation <= arrays.length - 1) {// 在边界里面进行交换否则继续随机
swop(arrays, spaceIndex, moveLocation);
spaceIndex = moveLocation;
}
}
}
return arrays;
}
public static String[] asdwMove(String arrays[]) {
int row = (int) Math.sqrt(arrays.length);
System.out.println("请输入:a向上移动空格,s向下移动空格,d向右移动空格,w向上移动空格");
String inputKey = s.next();
switch (inputKey) {
case "a":
if (spaceIndex % row == 0) {// 第一列不能向左移动
System.out.println("不能向左移动");
} else {
swop(arrays, spaceIndex, spaceIndex - 1);
spaceIndex = spaceIndex - 1;
moveTimes++;
}
break;
case "d":
if (spaceIndex % row == row - 1) {// 最后一列不能向右移动
System.out.println("不能向右移动");
} else {
swop(arrays, spaceIndex, spaceIndex + 1);
spaceIndex = spaceIndex + 1;
moveTimes++;
}
break;
case "s":
if (spaceIndex / row == row - 1) {// 最后一行不能向下移动
System.out.println("不能向下移动");
} else {
swop(arrays, spaceIndex, spaceIndex + row);
spaceIndex = spaceIndex + row;
moveTimes++;
}
break;
case "w":
if (spaceIndex / row == 0) {// 第一行不能向上移动
System.out.println("不能向上移动");
} else {
swop(arrays, spaceIndex, spaceIndex - row);
spaceIndex = spaceIndex - row;
moveTimes++;
}
break;
}
return arrays;
}
public static void swop(String arrays[], int spaceIndex, int moveLocation) {//交换两个数
String t = arrays[moveLocation];
arrays[moveLocation] = arrays[spaceIndex];
arrays[spaceIndex] = t;
}
}
显示效果:
欢迎进入拼图世界:按y键开始游戏
y
请输入游戏的难度:
1
6 1 4
3 7 2
5 8
。。。
请输入:a向上移动空格,s向下移动空格,d向右移动空格,w向上移动空格
s
1 2 3
4 5 6
7 8
请输入:a向上移动空格,s向下移动空格,d向右移动空格,w向上移动空格
d
1 2 3
4 5 6
7 8
拼图成功!总共用了43步
增加了回放功能!!!!!
链接:https://pan.baidu.com/s/1rEYULQtNlPndt1o4bJeF8Q
提取码:fkj2