数字华容道关键算法(有序随机数生成)

关于数字华容道的随机数据参数

玩过数字华容道的都知道,随机数是由原来的顺序排列通过随机移动块产生的,但是如果把块扣出来重新组合就会导致可能永远不会回到初始状态
例如:

1   2   3   1   2   3
4   5   6    4   5   6
7   8        8   7
正常结果只能是左边这个,而右边这个肯定是错误的,是一个永远也回不去的方法,所以避免这种情况发生,我特意写了一个类来产生满足游戏规则的随机数

package shuZiHuaRongDao;

/**
 * 
 * @author xgl
 *  用于生成n*n宫格随机数排表,末尾值为0或者为空(待定)
 */
public class ShuZhiHuaDaoShuZhi {
	private String shuju;/*随机数数据*/
	public int a;/*宫格大小,限制条件大于2*/
	private int [][] array;
	private int index = 0;
	/*构造方法*/
	/** 
	 * @param a
	 * 调用此方法生成一个a*a的二元数组
	 * 此方法中array的默认大小是3*3数组,可通关控制a的大小来改变数组大小,生成array[a][a]数组。
	 * a的范围是3-100;如果超出,则显示默认值3
	 */
	public ShuZhiHuaDaoShuZhi(int a) {
		if(a<=2||a>=100) {
			this.a=3;
			this.array = new int[this.a][this.a];//空数组,根据需要填充数字
		}else {
			this.a = a;
			this.array = new int[a][a];//空数组,根据需要填充数字
		}
	}
	/**
	 * 调用此方法需要设置参数a的值
	 */
	public ShuZhiHuaDaoShuZhi() {
		super();
	}
	/*不能创建string的构造方法,防止调用者修改string的数据*/
	
	/*setter,getter方法*/
	/**
	 * 获取生成表格的大小  a*a;
	 * @return a的值
	 */
	public int getA() {
		System.out.println(array.length);
		return a;
	}
	/**
	 * 设置表格的大小 a*a
	 * @param a
	 */
	public void setA(int a) {
		if(a<2||a>=100) {
			this.a=3;
			this.array = new int[this.a][this.a];//空数组,根据需要填充数字
		}else {
			this.a = a;
			this.array = new int[a][a];//空数组,根据需要填充数字
		}
	}
	/*不能创建string的setter方法,防止调用者修改string的数据*/
	/**
	 * 
	 * @return 一个字符串,此字符串用于宫格随机数正常排列
	 * 例如:array[3][3]的九个数产生的随机数是437561280;末尾值始终产生0;防止错误
	 * 那么 string返回的值也是437561280,然后再利用其它方式将这个字符串拆分放入到一个宫格里面
	 */
	public String getShuju() {
		Shuzhi();/*字符串随机数据*/
		return shuju;
	}
	/**
	 * 此方法用于实现随机数据的生成,本方法不给用户实现,用于当前调用
	 * @return 一个字符串
	 */
	private String Shuzhi() {
		/*遍历数组并赋值*/
		int numi=1;
		for(int j=0;j<array.length;j++){
			for(int k=0;k<array.length;k++){
				array[j][k]= numi;
				numi++;
			}
		}
		array[a-1][a-1]=0;
		
		for(int n=0;n<99999;n++) {
			/*生成1-4的随机数*/
			ShuiJiShu shuiJiShu = new ShuiJiShu(8,1);
			int resault = shuiJiShu.getResultnum();
			/*更改数组数字位置*/
			switch (resault) {
			/*空(0)数字和左边数字交换*/
			case 1:
				left();
				break;
			/*空(0)数字和右边数字交换*/
			case 2:
				right();
				break;
			/*空(0)数字和上边数字交换*/
			case 3:
				top();
				break;
			/*空(0)数字和下边数字交换*/
			case 4:
				bottom();
				break;
			/*空(0)数字和左下边数字交换*/
			case 5:
				bottom();
				left();
				break;
			/*空(0)数字和左上边数字交换*/	
			case 6:
				left();
				top();
				break;
			/*空(0)数字和右下边数字交换*/
			case 7:
				bottom();
				right();
				break;
			/*空(0)数字和右上边数字交换*/
			case 8:
				top();
				right();;
				break;
			default:
				break;
			}
			if(index>10000 &&array[a-1][a-1]==0) {
				break;
			}
		}
		shuju = "";
		for(int j=0;j<array.length;j++){
			for(int k=0;k<array.length;k++){
				System.out.println(array[j][k]);
				shuju += array[j][k];
			}
		}
		return shuju;
	}	
	 private void left() {
		 for(int i=0;i<array.length;i++){
				for(int j=0;j<array.length;j++){
					while(array[i][j]==0&&(j-1)>=0){ 					
						array[i][j]=array[i][j-1];
						array[i][j-1]=0;
						index++;
						break;
		 			}
				}
			}
	 }
	private void right() {
		for(int i=0;i<array.length;i++){
			for(int j=0;j<array.length;j++){
				while(array[i][j]==0&&(j+1)<a){ 					
					array[i][j]=array[i][j+1];
					array[i][j+1]=0;
					index++;
					break;
	 			}
			}
		}
	}
	private void top() {
		for(int i=0;i<array.length;i++){
			for(int j=0;j<array.length;j++){
				while(array[i][j]==0&&(i-1)>=0){ 					
					array[i][j]=array[i-1][j];
					array[i-1][j]=0;
					index++;
					break;
	 			}
			}
		}
	}
	private void bottom() {
		for(int i=0;i<array.length;i++){
			for(int j=0;j<array.length;j++){
				while(array[i][j]==0&&(i+1)<a){ 					
					array[i][j]=array[i+1][j];
					array[i+1][j]=0;
					index++;
					break;
	 			}
			}
		}
	}
}

调用上述方法的测试类

package shuZiHuaRongDao;


public class ShuZhiHuaRongDaoShuZhi_Test {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		ShuZhiHuaDaoShuZhi test = new ShuZhiHuaDaoShuZhi(3);
		System.out.println(test.getA());
		System.out.println(test.getShuju());
	}

}

感谢观看
我的官网

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值