eclipse 控制台 一维数组挑战拼图

拼图游戏

我的想法:

1.我想用一维数组打乱

3*3二维数组(拼图)中的拿空格上下左右移动就是在一维数组中用该位置与+1-1+3-3

12345678

                                                       123

                                                       456

                                                       78

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值