package sprite;

import java.util.Random;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;


public class BlockGroup {
	/*
	 * 20)	新建一个在app.sprite包下的类BlockGroup；
	21)	声明一个随机数类的引用（Random r;）；
	22)	声明切片图类对象数组gameImg来绘制格子组（ImageRect gameImg[];）；
	23)	声明一个Block类对象的二维数组myBlock（Block myBlock[][];）来代表格子组中的所有格子；
	24)	声明难度int类型变量myLevel来对应难度（int myLevel, myLevel2;），3×3、4×4、5×5对应的level值分别是3、4、5，myLevel2代表难度的平方；
	25)	声明一个整形成员变量whiteB来记录空白格子的id（int whiteB;）；
	26)	public BlockGroup(Bitmap image,int level)重写构造方法，level是指对应难度，
	3×3、4×4、5×5对应的level值分别是3、4、5，而image是当前关卡的图片；
	27)	在构造方法中通过level给myLevel, myLevel2,whiteB赋值；
	28)	根据myLevel, myLevel2创建对应数组长度的myBlock和gameImg并赋初始值；
	29)	在BlockGroup类里实现绘制的方法public void paint(Canvas cc,int x,int y,Paint p)，遍历myBlock中的每一个对象，
	使用画笔p在cc画布的x、y位置绘制gameImg数组中Block类对象id值对应下标的图片；
	30)	在BlockGroup类中新建点击方法public boolean onClick(float x,float y)，遍历myBlock中的每一个对象，
	其中x，y为调用该方法时需要传入的点击位置，将该位置传给myBlock中对象的onClick方法；
	31)	在GameView类中声明拼图用图片bigImg，并声明缩放比例浮点型bigScale；
	32)	在GameView类中声明BlockGroup类对象bg，并在其构造方法中通过屏幕宽度减去边框宽度与原图currentImg的宽度相比，获得缩放比例bigScale的值，
	再通过这个缩放值对currentImg进行等比例缩放获得bigImg，将SelectGame类中选定的难度值levelIndex和bigImg传给BlockGroup的构造方法给bg赋值；
	33)	将GameView类中的状态gemeState赋值为GAMESTATE_READY，并在之前定义的renderREADY方法中调用bg.paint的方法，
	验证格子组是否能正常绘制（与单独绘制原图相比，有很明显的黑线）
*/
	Random r;
	ImageRect[] gameimg;
	Block[][] mybBlocks;
	int myLevel,myLevel2;
	int whiteB;
	public int[][]steps;
	
	public BlockGroup(Bitmap image,int level){
		r=new Random();
		myLevel=level;
		myLevel2=level*level;
		whiteB=myLevel2-1;
		gameimg=new ImageRect[myLevel2];
		for (int i = 0; i < myLevel2; i++) {
			gameimg[i]=new ImageRect(image, level, i);
			
		}
		
		mybBlocks=new Block[myLevel][myLevel];
		for (int i = 0; i < myLevel2; i++) {
			mybBlocks[i/myLevel][i%myLevel]=new Block(level, i);
			mybBlocks[i/myLevel][i%myLevel].init();
		}
	}
	
	public void paint(Canvas cc,int x,int y,Paint p){
		for (int i = 0; i < myLevel2; i++) {
			
			Block  blocks= mybBlocks[i/myLevel][i%myLevel];
			
			gameimg[blocks.id].paint(cc, x+blocks.x, y+blocks.y, p);
		}
	}
	//控制打乱次数
	public void flushBlocks(int num){
		for(int i=0;i<num;i++){
			autoChange();
			}
	}
//空着每次打乱的位置
	private void autoChange() {
		// TODO Auto-generated method stub
		for(int i=0;i<myLevel2;i++){
			Block temp=mybBlocks[i/myLevel][i%myLevel];
			if (temp.id==whiteB) {
				while (true) {
					int index=r.nextInt(4);
					switch (index) {
					case 0:
						//将tempB的id与其左面格的id互换
						if (temp.xLine>0) {
							int tempNum=temp.id;
							temp.id=mybBlocks[temp.yLine][temp.xLine-1].id;
							mybBlocks[temp.yLine][temp.xLine-1].id=tempNum;
							return;
						}
						break;

					case 1:
						if (temp.xLine<(myLevel-1)) {
							int tempNum=temp.id;
							temp.id=mybBlocks[temp.yLine][temp.xLine+1].id;
							mybBlocks[temp.yLine][temp.xLine+1].id=tempNum;
							return;
						}
						break;
					case 2:
						if (temp.yLine>0) {
							int tempNum=temp.id;
							temp.id=mybBlocks[temp.yLine-1][temp.xLine].id;
							mybBlocks[temp.yLine-1][temp.xLine].id=tempNum;
							return;
						}
						break;
					case 3:
						if (temp.yLine<(myLevel-1)) {
							int tempNum=temp.id;
							temp.id=mybBlocks[temp.yLine+1][temp.xLine].id;
							mybBlocks[temp.yLine+1][temp.xLine].id=tempNum;
							return;
						}
						break;
					}
					
				}
			}
		}
	}
	
	public boolean onChick(float x,float y){
		for (int i = 0; i < myLevel2; i++) {
			Block block=mybBlocks[i/myLevel][i%myLevel];
			if (block.onClick(x, y)) {
				onchickBlock(block);
			boolean win=oncheckWin();
				return win;
			}
		}
		return false;
		
	}

	private boolean oncheckWin() {
		// TODO Auto-generated method stub
		for (int i = 0; i < myLevel2; i++) {
			Block block=mybBlocks[i/myLevel][i%myLevel];
			if (block.id!=i) {
				return false;
			}
		}
		return true;
	}

	private void onchickBlock(Block block) {
		// TODO Auto-generated method stub
		if (block.xLine>0&&mybBlocks[block.yLine][block.xLine-1].id==whiteB) {
			int temp=block.id;
			block.id=mybBlocks[block.yLine][block.xLine-1].id;
			mybBlocks[block.yLine][block.xLine-1].id=temp;
			addsteps(block,mybBlocks[block.yLine][block.xLine-1]);
		}
		if (block.xLine<myLevel-1&&mybBlocks[block.yLine][block.xLine+1].id==whiteB) {
			int temp=block.id;
			block.id=mybBlocks[block.yLine][block.xLine+1].id;
			mybBlocks[block.yLine][block.xLine+1].id=temp;
			addsteps(block, mybBlocks[block.yLine][block.xLine+1]);
		}
		if (block.yLine>0&&mybBlocks[block.yLine-1][block.xLine].id==whiteB) {
			int temp=block.id;
			block.id=mybBlocks[block.yLine-1][block.xLine].id;
			mybBlocks[block.yLine-1][block.xLine].id=temp;
			addsteps(block, mybBlocks[block.yLine-1][block.xLine]);
		}
		if (block.yLine<myLevel-1&&mybBlocks[block.yLine+1][block.xLine].id==whiteB) {
			int temp=block.id;
			block.id=mybBlocks[block.yLine+1][block.xLine].id;
			mybBlocks[block.yLine+1][block.xLine].id=temp;
			addsteps(block,mybBlocks[block.yLine+1][block.xLine]);
		}
	}
	public void setmap(int[]map){
		for (int i = 0; i < myLevel2; i++) {
			Block temp=mybBlocks[i/myLevel][i%myLevel];
			temp.id=map[i];
		}
	}
	public int[]getmap(){
		int[] map=new int[myLevel2];
		for (int i = 0; i < myLevel2; i++) {
			Block temp=mybBlocks[i/myLevel][i%myLevel];
			map[i]=temp.id;
		}
		return map;
	}
	public void addsteps(Block blog1,Block blog2){
		if (steps==null) {
			steps=new int[1][2];
			steps[0][0]=blog1.xLine+blog1.yLine*myLevel;
			steps[0][1]=blog2.xLine+blog2.yLine*myLevel;
		}else {
			int[][]temp=new int[steps.length+1][];
			for (int i = 0; i < steps.length; i++) {
				temp[i]=new int[steps[i].length];
				for (int j = 0; j < steps[i].length; j++) {
					temp[i][j]=steps[i][j];
				}
			}
			temp[steps.length]=new int[2];
			temp[steps.length][0]=blog1.xLine+blog1.yLine*myLevel;
			temp[steps.length][1]=blog2.xLine+blog2.yLine*myLevel;
			steps=temp;
		}
	}
	public void doMove(int i,int j){
		int temp=mybBlocks[i/myLevel][i%myLevel].id;
		mybBlocks[i/myLevel][i%myLevel].id=mybBlocks[j/myLevel][j%myLevel].id;
		mybBlocks[j/myLevel][j%myLevel].id=temp;
	}
	
}
