
//**********************************//
//             盤面クラス           //
//**********************************//

public class Banmen{
	private int x[] = new int[1000];                                      //チェックする対象のマスのx座標を格納する配列
	private int y[] = new int[1000];                                      //チェックする対象のマスのy座標を格納する配列
	private int Count;                                                    //１行・１列にあるマスの数
	private int TableCount;                                               //x[],y[]の残りのマスの格納数
	private boolean gameClear;
	private boolean gameOver;
	private boolean checkmode;
	private boolean openmode;
	private MineSweeper3 m3;
	public Banmen(int Count,MineSweeper3 m3){											  //Countを設定するためのコンストラクタ
	    this.m3 = m3;
		this.Count = Count;												      //Countを設定する
		this.gameClear = false;
		this.gameOver = false;
		this.checkmode = false;
		this.checkmode = false;
		this.openmode = false;
	}																	  //
	public void Click_SyoriMethod(Masu[][] masu,int zx,int zy){			  //クリックした時のメソッド(だいたい)
		TableCount = -1;													//TableCountを何もない状態(-1)にする。
		Click_SyoriSubMethod(masu,zx,zy);									//クリックしたマスについて、処理Click_SyoriSubMethodを呼び出す
		while(TableCount != -1){											//x[],y[]に座標が１つでも格納されている間処理を続ける
			int xx = x[TableCount];											  //
			int yy = y[TableCount];											  //座標をひとつ取り出す
			TableCount--;													  //
			Click_SyoriSubMethod(masu,xx,yy);								  //その座標に対応するマスについて、処理Click_SyoriSubMethodを呼び出す
		}																	//
	}																	  //
	public void Click_SyoriSubMethod(Masu[][] masu,int zx,int zy){		  //クリックしたマスについての処理
		if(!masu[zx][zy].getOpenCheck() && !masu[zx][zy].getCheckBombCheck()){	//そのクリックしたマスが開かれていないとき
			masu[zx][zy].setOpenCheck(true);									//そのマスを開いた状態にする。
			if(!masu[zx][zy].getBombCheck()){									//そのクリックしたマスに爆弾が存在しないとき
				m3.musicPlay(0);
				if(masu[zx][zy].getAroundBombCount() == 0){							//周り８方向に爆弾が存在しないとき
					aroundKakunou(masu,zx,zy);											//周り８方向の座標を格納するaroundKakunouを呼び出す
				}																	//
			}else{
				m3.musicPlay(1);
			}																	//
		}																	//
	}														             //
	public void aroundKakunou(Masu[][] masu,int zx,int zy){				 //周り８方向の座標を格納する
		for(int dx = -1;dx < 2;dx++){										//
			for(int dy = -1;dy < 2;dy++){									//周り８方向について処理をする
																			//
				if(!outCheck(zx + dx,zy + dy)){								//対象のマスが存在するとき。
					if(!masu[zx + dx][zy + dy].getOpenCheck()){					//対象のマスがまだ開かれていないとき
						if(!alreadyKakunouCheck(zx + dx,zy + dy)){					//対象のマスがまだ格納されていないとき
							TableCount++;											  //x[],y[]の残りのマスの格納数を１増やす
							x[TableCount] = zx + dx;								  //対象のマスのx座標を格納する
							y[TableCount] = zy + dy;								  //対象のマスのy座標を格納する
						}														    //
					}															//
				}															//
			}
		}
	}																	//
	public boolean outCheck(int zx,int zy){								//対象のマスが存在するかしないかを返すメソッド(true:存在しない false:存在する)
		if(zx == -1 || zx == Count || zy == -1 || zy == Count){				//盤面の外にはみ出ているとき
			return true;														//存在しないを返す
		}
		return false;															//存在するを返す
	}																	//
	public boolean alreadyKakunouCheck(int zx,int zy){					//対象のマスがすでにx[],y[]に格納されているかチェックする(true:格納されている false:格納されていない)
		for(int i = 0;i <= TableCount;i++){									//今までに格納してある座標に対して処理を行う
			if(x[i] == zx && y[i] == zy){										//格納してある座標と対象のマスの座標が一致しているとき
				return true;														//格納されているを返す
			}
		}
		return false;																//格納されていないを返す
	}																	//
	public void bombCnt(Masu [][] masu,int zx,int zy){					//周り８方向にある爆弾の数を集計する。
		int count = 0;														//初期値は0にセットする。（集計するため）
		for(int dx = -1;dx < 2;dx++){											//
			for(int dy = -1;dy < 2;dy++){										//周り８方向について処理をする（自分は除外する）
				if(!(dx == 0 && dy == 0)){										//
					if(!outCheck(zx + dx,zy + dy)){									//対象のマスが存在するとき
						 if(masu[zx + dx][zy + dy].getBombCheck()){						//対象のマスに爆弾が存在するとき
						 	count++;														//countをカウントアップする
						 }																//
					}																//
				}																//
			}																
		}
		masu[zx][zy].setAroundBombCount(count);									//書くマスのaroundBombCountにcountをセットする
	}																	//
	public void allBombDisplay(Masu [][] masu,int count){				//Game Overの時に、すべての爆弾を表示するメソッド
		for(int i = 0;i < count;i++){										//
			for(int j = 0;j < count;j++){									//すべてのマスについて処理を行う
				if(masu[i][j].getBombCheck()){									//対象とするマスに爆弾が存在するとき
					masu[i][j].setOpenCheck(true);									//openCheckをtrueにし、表示させるようにする。
				}																//
			}																//
		}
	}
	public boolean EnterBombCheck(Masu [][] masu,int zx,int zy){
		if(!masu[zx][zy].getOpenCheck()){
			m3.musicPlay(2);
			return true;
		}
		return false;
	}
	public void EnterBomb(Masu [][] masu,int zx,int zy){
		if(!masu[zx][zy].getCheckBombCheck()){
			masu[zx][zy].setCheckBombCheck(true);
		}else{
			masu[zx][zy].setCheckBombCheck(false);
		}
	}
	public int AllBombCnt(Masu [][] masu,int count){
		int cnt = 0;
		int cnt2 = 0;
		for(int i = 0;i < count;i++){
			for(int j = 0;j < count;j++){
				if(masu[i][j].getBombCheck()){
					cnt = cnt + 1;
				}
				if(masu[i][j].getCheckBombCheck()){
					cnt2 = cnt2 + 1;
				}
			}
		}
		return cnt - cnt2;
	}
	public int aroundCheckcount(Masu [][] masu,int zx,int zy){
		int count = 0;														//初期値は0にセットする。（集計するため）
		for(int dx = -1;dx < 2;dx++){											//
			for(int dy = -1;dy < 2;dy++){										//周り８方向について処理をする（自分は除外する）
				if(!(dx == 0 && dy == 0)){										//
					if(!outCheck(zx + dx,zy + dy)){									//対象のマスが存在するとき
						 if(masu[zx + dx][zy + dy].getCheckBombCheck()){						//対象のマスに爆弾が存在するとき
						 	count++;														//countをカウントアップする
						 }																//
					}																//
				}																//
			}																
		}
		return count;
	}
	public boolean getCheckmode(){
		return checkmode;
	}
	public boolean getOpenmode(){
		return openmode;
	}
	public boolean getGameClear(){
		return gameClear;
	}
	public boolean getGameOver(){
		return gameOver;
	}
	public void setCheckmode(boolean checkmode){
		this.checkmode = checkmode;
	}
	public void setGameOver(boolean gameOver){
		this.gameOver = gameOver;
	}
	public void setGameClear(boolean gameClear){
		this.gameClear = gameClear;
	}
	public void setOpenmode(boolean openmode){
		this.openmode = openmode;
	}
	public void openMethod(Masu [][] masu,int zx,int zy){
		for(int dx = -1;dx < 2;dx++){											//
			for(int dy = -1;dy < 2;dy++){										//周り８方向について処理をする（自分は除外する）
				if(!(dx == 0 && dy == 0)){										//
					if(!outCheck(zx + dx,zy + dy)){									//対象のマスが存在するとき
						 if(!masu[zx + dx][zy + dy].getOpenCheck() && !masu[zx + dx][zy + dy].getCheckBombCheck()){						//対象のマスに爆弾が存在するとき
						 	Click_SyoriMethod(masu,zx + dx,zy + dy);														//countをカウントアップする
						 }																//
					}																//
				}																//
			}																
		}
	}
}
	
