可执行,无优化,比较乱,呵呵,谁要是有心情改了,或者在其它地方有比较清晰的实现,回发我一份:)
=======================================================================
public class MazeGame {
final int MOUSE_TEAMSIZE=250;
Mouse []MTeam = new Mouse[MOUSE_TEAMSIZE];
Maze maze = new Maze();
boolean out = false;
public MazeGame (){
maze.createMaze();
}
public static void main(String args[]){
MazeGame mazegame = new MazeGame();
mazegame.adventure();
}
public boolean adventure(){
boolean ret=false;
Mouse firstMouse = new Mouse(0);
firstMouse.direct = 3;
firstMouse.roomid = 0;
setMouse(0,firstMouse);
int tbret = 0;
int step=0;
while(out!=true){
tbret = 0;
for(int i=0;i<MTeam.length;i++){
if(MTeam[i]!=null ){
if( MTeam[i].step==step){
if( MTeam[i].travel())
tbret++;
}
}
if(out==true ){
System.out.println("==end==");
for(int k=0;k<MTeam.length;k++){
if(MTeam[k]!=null){
for(int j=0;j<MTeam[k].pos;j++){
System.out.print(MTeam[k].path[j]+",");
}
System.out.println("");
}
}
break;
}
}
if(tbret==0){
System.out.println("no path");
break;
}
step++;
}
return ret;
}
public int getEmptyPosition(){
for(int i=0;i<MTeam.length;i++){
if(MTeam[i]==null)
return i;
}
return -1;
}
public void setMouse(int Position,Mouse mouse){
MTeam[Position] = mouse;
if(mouse!=null)
mouse.mouseid = Position;
}
class Mouse{
final int MAX_PATH=250;
int path[]=new int[MAX_PATH];
int pos = 0;
int roomid;
int direct;
int mouseid;
int step=0;
public Mouse(int mouseid ){
this.mouseid = mouseid;
}
public boolean travel(){
int icount=0;
Room room = maze.getRoom(roomid);
path[pos++] = roomid;
if(room.visited){
for(int j=0;j<this.pos;j++){
System.out.print(this.path[j]+",");
}
System.out.println("");
setMouse(this.mouseid,null);
return false;
}
room.visited = true;
int comedirect = direct;
int sourceroomid= roomid;
if(room.east==1 && comedirect!=0){
Room newroom = maze.nextRoom(sourceroomid,0);
if(newroom == null){
out = true;
return true;
}
if(!newroom.visited){
int aindex = getEmptyPosition();
if(aindex>-1){
Mouse subMouse = this.copy(this);
subMouse.roomid = newroom.roomid;
subMouse.direct = 2;
subMouse.step +=1;
setMouse(aindex,subMouse);
icount++;
}else
return false;
}
}
if(room.south==1 && comedirect!=1){
Room newroom = maze.nextRoom(sourceroomid,1);
if(newroom == null){
out = true;
return true;
}
if(!newroom.visited){
int aindex = getEmptyPosition();
if(aindex>-1){
Mouse subMouse = this.copy(this);
subMouse.roomid = newroom.roomid;
subMouse.direct = 3;
subMouse.step +=1;
setMouse(aindex,subMouse);
icount++;
}else
return false;
}
}
if(room.west==1 && comedirect!=2){
Room newroom = maze.nextRoom(sourceroomid,2);
if(newroom == null){
out = true;
return true;
}
if(!newroom.visited){
if(!newroom.visited){
int aindex = getEmptyPosition();
if(aindex>-1){
Mouse subMouse = this.copy(this);
subMouse.roomid = newroom.roomid;
subMouse.direct = 0;
subMouse.step +=1;
setMouse(aindex,subMouse);
icount++;
}else
return false;
}
}
}
if(room.north==1 && comedirect!=3){
Room newroom = maze.nextRoom(sourceroomid,3);
if(newroom == null){
out = true;
return true;
}
if(!newroom.visited){
if(!newroom.visited){
int aindex = getEmptyPosition();
if(aindex>-1){
Mouse subMouse = this.copy(this);
subMouse.roomid = newroom.roomid;
subMouse.direct = 1;
subMouse.step +=1;
setMouse(aindex,subMouse);
icount++;
}else
return false;
}
icount++;
}
}
setMouse(this.mouseid,null);
if(icount>0)
return true;
else{
for(int j=0;j<this.pos;j++){
System.out.print(this.path[j]+",");
}
System.out.println("");
return false;
}
}
public Mouse copy(Mouse old){
Mouse newmouse = new Mouse(old.mouseid);
newmouse.direct = old.direct;
newmouse.roomid = old.roomid;
newmouse.pos = old.pos;
newmouse.step = old.step ;
for(int i=0;i<old.path.length;i++)
{
newmouse.path[i]=old.path[i];
}
return newmouse;
}
}
class Maze{
Room [] mazeroms = new Room[25];
public void createMaze(){
int i=0;
mazeroms[i] = new Room(i,1,0,0,1);i++;
mazeroms[i] = new Room(i,1,0,1,0);i++;
mazeroms[i] = new Room(i,1,1,1,0);i++;
mazeroms[i] = new Room(i,1,0,1,0);i++;
mazeroms[i] = new Room(i,0,1,0,0);i++;
mazeroms[i] = new Room(i,1,0,0,1);i++;
mazeroms[i] = new Room(i,1,0,1,1);i++;
mazeroms[i] = new Room(i,1,0,1,1);i++;
mazeroms[i] = new Room(i,1,0,1,1);i++;
mazeroms[i] = new Room(i,0,1,1,0);i++;
mazeroms[i] = new Room(i,1,1,0,0);i++;
mazeroms[i] = new Room(i,1,0,1,0);i++;
mazeroms[i] = new Room(i,1,1,1,0);i++;
mazeroms[i] = new Room(i,1,0,1,0);i++;
mazeroms[i] = new Room(i,0,1,1,1);i++;
mazeroms[i] = new Room(i,0,1,0,1);i++;
mazeroms[i] = new Room(i,1,1,0,0);i++;
mazeroms[i] = new Room(i,1,0,1,1);i++;
mazeroms[i] = new Room(i,1,1,1,0);i++;
mazeroms[i] = new Room(i,0,1,1,0);i++;
mazeroms[i] = new Room(i,1,0,0,1);i++;
mazeroms[i] = new Room(i,1,0,1,1);i++;
mazeroms[i] = new Room(i,1,0,1,0);i++;
mazeroms[i] = new Room(i,0,0,1,1);i++;
mazeroms[i] = new Room(i,0,1,1,1);
}
public Room nextRoom(int roomid,int direction){
int row = roomid/5;
int col=roomid%5;
switch(direction){
case 0:
col+=1;
break;
case 1:
row+=1;
break;
case 2:
col-=1;
break;
case 3:
row-=1;
break;
}
if(row<0||row>4||col<0||col>4)
return null;
return getRoom(row*5+col);
}
public Room getRoom(int roomid){
if(roomid>mazeroms.length)
return null;
else
return mazeroms[roomid];
}
}
class Room{
boolean visited =false;
int east;
int south;
int west;
int north;
int roomid;
public Room(int roomid,int east,int south,int west,int north){
this.east = east;
this.south = south;
this.west = west;
this.north = north;
this.roomid = roomid;
}
}
}