
//***************************************************//
//*                                                 *//
//*迷路作成アルゴリズム DEVELOPMENT DATE: 2005/ 3/30*//
//*                                                 *//
//***************************************************//

public class MeiroMake{
	int tn = 16;															//縦の領域（初期値=16)
	int yn = 16;															//横の領域（初期値=16)
	int h[][] = {															//方向テーブルの作成
	            {-1,1,0,0},													  //h[0][0] = -1,h[0][1] = 1,h[0][2] = 0,h[0][3] = 0
				{0,0,-1,1},													  //h[1][0] = 0,h[1][1] = 0,h[1][2] = -1,h[1][3] = 1
				};															//
	public MeiroMake(int tate,int yoko){									//コンストラクタ（インスタンスが生成された時に先立って行われる処理）
		tn = tate;																//縦の長さの設定
		yn = yoko;																//横の長さの設定
	}																		//
	//****************************************//
	//*               迷路の作成             *//
	//****************************************//
	public int [][] MeiroMake_method(int [][] meiro){                       //迷路を作成し、その状態を2次元配列として返すメソッド						
		for(int i = 0;i < tn;i++){											  //縦のマスの数だけくりかえす。
			for(int j = 0;j < yn;j++){											//横のマスの数だけくりかえす。
				meiro[i][j] = MeiroInit_method(i,j);
			}																	//
		}																	  //
		for(int i = 2;i < (tn - 2);i = i + 2){								  //(偶数,偶数)（端のマスを除く)のマスを繰り返す
			for(int j = 2;j < (yn - 2);j = j + 2){							    //
				int z = MeiroNobasi_method(i,j,meiro);
				meiro[i + h[0][z]][j + h[1][z]] = 1;
			}																	//
		}                                                                     //
		return meiro;                                                         //meiroの値（迷路データ)を返す。
	}
	//****************************************//
	//*             迷路の初期設定           *//
	//****************************************//
	public int MeiroInit_method(int i,int j){
		int x = 0;												  			//迷路データを全て0(道)の状態にする。
		if(i == 0 || i == (tn - 1) || j == 0 || j == (yn - 1)){             //今対象としているマスが端のマスであるとき。
			x = 1;															  //1(壁)にする。
		}else{															    // 
			if(i % 2 == 0 && j % 2 == 0){									  //今対象としているマスが(偶数,偶数)であるとき。
				x = 1;										                    //1(壁)にする。
			}															   	  //
		}																    //
		return x;															//xを返す
	}
	//****************************************//
	//*              迷路の壁作成            *//
	//****************************************//
	public int MeiroNobasi_method(int i,int j,int[][] meiro){
		int a = (int)(Math.random() * 4);							      //ランダムに方向を定める(0:上,1:下,2:左,3:右)
		if(meiro[i + h[0][a]][j + h[1][a]] == 1){						  //対象としているマスの先ほど定めた方向のマスが壁である時
			a = (int)(Math.random() * 2) * 2 + 1;						    //ランダムに方向を定める(1:下,3:右)
			return a;								  						  //対象としているマスの先ほど定めた方向のマスを1(壁)とする。
		}else{															    //
			return a;														  //対象としているマスの先ほど定めた方向のマスを1(壁)とする。
		}																    //
	}
}
		
					