当前位置: 代码迷 >> Java相关 >> 用java在七*7格子上虚拟建立4个连续3格子,为什么又是出现死循环,哪里出错了,新人求解
  详细解决方案

用java在七*7格子上虚拟建立4个连续3格子,为什么又是出现死循环,哪里出错了,新人求解

热度:180   发布时间:2016-04-22 21:36:04.0
用java在7*7格子上虚拟建立4个连续3格子,为什么又是出现死循环,哪里出错了,新人求解
第一个类
public class playTextDriver{
public static void main(String[] args){
play a=new play();
a.setRandomLocations();

}

}
第二个类

public class play{
private int [][] locations=new int[7][7];
private int x,y;
private int direction;

public void setRandomLocations(){

for(int q=0;q<4;q++)//创建4个
{  
do{
  findEmptyGrid();
  System.out.print("x="+x+"  ");
System.out.print("y="+y+"  ");
  }
  while(!makeRightDirection());
  addNewDotCom();



//System.out.println(direction+"  ");

for(int i=0;i<7;i++){
for(int j=0;j<7;j++)
System.out.print(locations[j][i]);
System.out.println();

}
}

}
//********************************************
private void findEmptyGrid()///用来寻找49个格子中没有用过的格子,结果在类中x,y中体现
{
  x=(int)(Math.random()*10);          //用来随机产生一个格子的坐标,
y=(int)(Math.random()*10);         //坐标范围从0到6
do
{
while(x>6){
x=(int)(Math.random()*10);
}
while(y>6){
y=(int)(Math.random()*10);
}
}while(locations[x][y]==-1);
}
//**********************************************
private void makeDirection()//用来产生上下左右四个方向,结果在direction用0到3体现出来
{
direction=(int)(Math.random()*10);   //产生0到3代表以确定的格子
while(direction>3)                       // 将朝上下左右4个方向,
{direction=(int)(Math.random()*10);}
//System.out.print(direction);
}
//**********************************************
private boolean rightDirection(int x1,int y1,int x2,int y2){
if((x1<0)||(x1>6)||(x2<0)||(x2>6))  //判断那两个格子是否会越出49个格子
return false;
if((y1<0)||(y1>6)||(y2<0)||(y2>6))
return false;
if((locations[x1][y1]!=-1)&&(locations[x2][y2]!=-1))//判断那两个格子已经
return true; //被用过了
else return false;

}
//**********************************************
private boolean makeRightDirection(){//用来产生给定坐标符合“有空格”条件的方向
//如果这个坐标4个方向都不能使用,则返回false
//否则为true
boolean rightDir=false;
int[] text;
text=new int[4];
for(int j=0;j<4;j++)
text[j]=-1;
int numOfDone=0;


do{
boolean goOnMakeDirection;
do
{
makeDirection();
//System.out.println("direction="+direction);

int j=0;
for(j=0;j<4;j++){
if(direction==text[j])
break;}
if(j==4)
goOnMakeDirection=false;
else
goOnMakeDirection=true;


}
while(goOnMakeDirection);

switch(direction)
{
case 0:rightDir=rightDirection(x,y-1,x,y-2);text[0]=0;break;
case 1:rightDir=rightDirection(x,y+1,x,y+2);text[1]=1;break;
case 2:rightDir=rightDirection(x-1,y,x-2,y);text[2]=2;break;
case 3:rightDir=rightDirection(x+1,y,x+2,y);text[3]=3;break;
}

numOfDone++;

if((numOfDone==4)&&(!rightDir))//这个循环超过了5次,说明4个方向都不合适
break;

}
while(!rightDir);
if((!rightDir)==true)
return false;
else return true; 


}


//************************************
private void addNewDotCom(){//根据给定的坐标和方向,添加3个连续的坐标
locations[x][y]=-1;
switch(direction)
{
case 0:locations[x][y-1]=-1;locations[x][y-2]=-1;break;
case 1:locations[x][y+1]=-1;locations[x][y+2]=-1;break;
case 2:locations[x-1][y]=-1;locations[x-2][y]=-1;break;
case 3:locations[x+1][y]=-1;locations[x+2][y]=-1;break;
}

}

//******************************************

}
我是用文本写的代码,测试时有时会出现死循环,弄了一整天不知道哪来错了,,新人求解
另外,,我发的代码不能像你们那样,,我也不知道怎么弄额,,,
Java 死循环

------解决方案--------------------
findEmptyGrid方法里的问题,当随机生成的x和y都在6以内而这个点又标记为-1时死循环啦
------解决方案--------------------
要把代码粘再两个[...]这里[/...]之间才有格式。
另外,case要用{}括起来的。。
------解决方案--------------------
  相关解决方案