📄 state.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 + -