⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 state.java

📁 八数码
💻 JAVA
字号:

public class State {
	
private int[]  state = new int[9];
private int size = 1;
private State[] expendStates;

public State(int[] s){
  int i;
  for(i=0;i<9;i++){
  state[i] = s[i];
  }
}

public State(String t){
  if(t.equals("d")){
	  state = new int[]{2,8,3,1,0,4,7,6,5};
  }
  else if(t.equals("d1")){
	  state = new int[]{2,8,0,1,3,4,7,6,5};
  }
}//默认初始数组*******************测试用

public boolean equals(State st){
	
	int[] s = st.getState();
	for(int i=0;i<9;i++){
		if(s[i]!=state[i])return false;
	}
	return true;
}//判断状态是否相同

public int[] getState(){
	return state;
}//返回state数组

public int getBlank(){
	for(int i = 0;i<9;i++){
		if(state[i]==0)return i;
	}
	return -1;
}//返回空格的位置

public int expandSize(){
	//有三种情况
	//当空格在中间时,有四种可能的移动
	//当空格在四个角上时,有二种可能的移动
	//当空格在四边上时,有三种可能的移动
	if(state[4]==0) size = 4;
	else if(state[0]==0 || state[2]==0 || state[6]==0 || state[8]==0) size = 2;
	else size = 3;
	expendStates = new State[size];
	return size;
}

public State[] expandState(){

	int[] exState = getState().clone();
	int[] temp = getState().clone();
	expendStates[0] = new State(temp);//初始化数组
	
    if(size == 1) expandSize();
    int blank = getBlank();
    
	if(size == 4){//当空格在中间时,size = 4,空格的位置是4
		//上格下移
		temp[4] = temp[1];
		temp[1] = 0;
		expendStates[0] = new State(temp);
		//左格右移
		temp = exState.clone();
		temp[4] = temp[3];
		temp[3] = 0;
		expendStates[1] = new State(temp);
		//下格上移
		temp = exState.clone();
		temp[4] = temp[7];
		temp[7] = 0;
		expendStates[2] = new State(temp);
		//右格左移
		temp = exState.clone();
		temp[4] = temp[5];
		temp[5] = 0;
		expendStates[3] = new State(temp);
	}
	
	else if(size == 2){	//当空格在四个角上时,有二种可能的移动,size =2,空格的位置是0,2,6,8
		if(blank == 0){//当空格在左上角时
			//右格左移
			temp = exState.clone();
			temp[0] = temp[1];
			temp[1] = 0;
			expendStates[0] = new State(temp);
			//下格上移
			temp = exState.clone();
			temp[0] = temp[3];
			temp[3] = 0;
			expendStates[1] = new State(temp);
		}
		else if(blank == 2){//当空格在右上角时
			//左格右移
			temp = exState.clone();
			temp[2] = temp[1];
			temp[1] = 0;
			expendStates[0] = new State(temp);
			//下格上移
			temp = exState.clone();
			temp[2] = temp[5];
			temp[5] = 0;
			expendStates[1] = new State(temp);
		}
		else if(blank == 6){//当空格在左下角时
			//右格左移
			temp = exState.clone();
			temp[6] = temp[7];
			temp[7] = 0;
			expendStates[0] = new State(temp);
			//上格下移
			temp = exState.clone();
			temp[6] = temp[3];
			temp[3] = 0;
			expendStates[1] = new State(temp);
		}
		else if(blank == 8){//当空格在右下角时
			//左格右移
			temp = exState.clone();
			temp[8] = temp[7];
			temp[7] = 0;
			expendStates[0] = new State(temp);
			//上格下移
			temp = exState.clone();
			temp[8] = temp[5];
			temp[5] = 0;
			expendStates[1] = new State(temp);
		}
	}
	
	//temp = exState;
	else if(size == 3){	//当空格在四个边上时,有三种可能的移动,size =3,空格的位置是1,3,5,7
		if(blank == 1){//当空格在上边时
			//下格上移
			temp = exState.clone();
			temp[1] = temp[4];
			temp[4] = 0;
			expendStates[0] = new State(temp);
			//左格右移
			temp = exState.clone();
			temp[1] = temp[0];
			temp[0] = 0;
			expendStates[1] = new State(temp);
			//右格左移
			temp = exState.clone();
			temp[1] = temp[2];
			temp[2] = 0;
			expendStates[2] = new State(temp);
		}
		else if(blank == 3){//当空格在左边时
			//上格下移
			temp = exState.clone();
			temp[3] = temp[0];
			temp[0] = 0;
			expendStates[0] = new State(temp);
			//右格左移
			temp = exState.clone();
			temp[3] = temp[4];
			temp[4] = 0;
			expendStates[1] = new State(temp);
			//下格上移
			temp = exState.clone();
			temp[3] = temp[6];
			temp[6] = 0;
			expendStates[2] = new State(temp);
		}
		else if(blank == 5){//当空格在右边时
			//上格下移
			temp = exState.clone();
			temp[5] = temp[2];
			temp[2] = 0;
			expendStates[0] = new State(temp);
			//左格右移
			temp = exState.clone();
			temp[5] = temp[4];
			temp[4] = 0;
			expendStates[1] = new State(temp);
			//下格上移
			temp = exState.clone();
			temp[5] = temp[8];
			temp[8] = 0;
			expendStates[2] = new State(temp);
		}
		else if(blank == 7){//当空格在下边时
			//上格下移
			temp = exState.clone();
			temp[7] = temp[4];
			temp[4] = 0;
			expendStates[0] = new State(temp);
			//左格右移
			temp = exState.clone();
			temp[7] = temp[6];
			temp[6] = 0;
			expendStates[1] = new State(temp);
			//右格左移
			temp = exState.clone();
			temp[7] = temp[8];
			temp[8] = 0;
			expendStates[2] = new State(temp);
		}
	}
	
	return expendStates;
}

public void printState(){
	System.out.println();
	for(int i=0;i<9;i++){
		System.out.print(state[i]+"  ");
		if(i%3==2&&i!=0)System.out.println();
	}
	System.out.println();
}//打印状态

public int moveTo(State st){
	int[] s = st.getState();
	int i;
	for(i=0;i<9;i++ )
	{
	if(s[i] != state[i] && s[i]!=0)
	return i;
	}
	return -1;
}//返回移动后的棋子的位置


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -