迷宫小游戏

* 功能描述 1.提示输入迷宫的行列数:6  6
* 2.请输入迷宫的路径信息
0 0 1 1 1 1
1 0 0 0 1 1
1 0 1 1 1 1
1 0 1 1 1 1
1 0 1 1 1 1
1 0 0 0 0 0

* 搜索迷宫路径...
* 3.打印“迷宫不存在有效路径”
*/

根据迷宫的特点,找路径。

1.需要创建一个二维数组存储每个节点的位置信息,还需要知道每一个节点的值是1或者0,还需要判断该节点上、下、左、右是否能走,
所以一个简单的二维数组不能满足需求;此时需要建立一个Node[]类,来存储迷宫的节点信息。

class Node{
int x;int y;//节点的横纵坐标
int val;//每个节点的值
boolean right;boolean left;boolean down;boolean up;//四个方向
//构造方法为变量初始化
public Node(int x,int y,int data){
this.x=x;
this.y=y
this.data=datal;
   }
}

 

2.根据迷宫寻找路径的特点,若找到一个点行不通,则应该退回上一节点继续寻找。根据这种特点,需要一个栈结构来进行迷宫路径的寻找。最后根据入栈的节点值,依据横纵坐标来判断路径。按照先看右边,再下方,再上,再左的顺序查找

需要的属性及方法

属性:节点的坐标、节点值 用一个Node类型的数组来存储,栈顶指针

方法:出栈、入栈、判断栈满栈空、栈的长度 、返回栈顶元素

class Stack{
Node[] array;
int top;
public Stack(){  //构造函数
this.array=new Node[10];
this.top=0;}
public void push(Node node){
        if(full()){
            this.array=Arrays.copyOf(this.array,this.array.length * 2);
        }
        this.array[this.top]=node;
        this.top++;
    }

    // 出栈
    public void pop(){
        this.top--;
    }

    // 返回栈顶元素
    public Node top(){
        return this.array[this.top-1];
    }

    // 判断栈空
    public boolean empty(){
        return this.top==0;
    }

    // 判断栈满
    public boolean full(){
        return this.array.length==this.top;
    }
}

 

 3.迷宫类,用来判断节点的上下左右是否能走,以及输出路径

class Maze{
private int row;
private int col;
private Node[][] maze;//二维数组,存储迷宫节点
private Stack stack;//栈结构,寻找迷宫路径用

//构造函数
public Maze(){
    this(8,8);
}
//根据属性进行构造函数
public Maze(int row,int col){
    this.row=row;
    this.col=col;
    this.maze=new Node[this.row][this.col];
    this.stack=new Stack();//引用变量new
}
//设置节点的初值,把节点的值、横纵坐标赋给maze数组
public setMazeNode(int data,int i,int j){this.maze[i][j]=new Node(data,i,j);}/**
 /* 生成节点的坐标和值
 * 设置迷宫每一个节点的四个方向的行走状态
 */
public void setMazeNodeState(){
for(int i=0;i<row;i++){
  for(int j=0;j<col;j++){
   if(maze[i][j]==1){continue;}
  //调整节点的右方向
  if(j<col-1&&maze[i][j+1]==0){
  this.maze[i][j].right=true;}
  //下方向
  if(i<row-1&&maze[i+1][j]==0){
  this.maze[i][j].down=true;
   //左方向
   if(j>0&&this.maze[i][j-1].data==0){
   this.maze[i][j].left=true;}
   //上方向
   if(i>0 &&this.maze[i-1][j].data==0){
   this.maze[i][j].up=true;}
   }
  }
 }
}
//寻找迷宫路径
public void findMazePath(){
    /**
     * 逻辑:如果当前栈顶节点的右方节点是0,则先把右方的节点压入栈;如果该节点的下方节点是0,若没有,再找左边的节点。
     * 如果都没有,则出栈当前节点,再找栈顶节点的右、下、左
     */
    if((this.maze[0][0].data==1)||(this.maze[this.row-1][this.col-1].data==1)){
       return;
    }
    this.stack.push(this.maze[0][0]);
    while(!this.stack.empty()){
        //获取栈顶节点
        Node node=this.stack.top();
        //栈顶节点就是出口节点,迷宫路径搜索完成了
        if(node.x==row-1&&node.y==col-1){
            return;
        }
        if(node.right){//右方向可以走
            this.maze[node.x][node.y].right=false;//将当前节点的右方向置为false
            this.maze[node.x][node.y+1].left=false;//将右边节点的左边置为不能走
            this.stack.push(this.maze[node.x][node.y+1]);
            continue;//返回循环的开始继续循环
        }
        if(node.down){
            this.maze[node.x][node.y].down=false;//将当前节点的下方向置为false;
            this.maze[node.x+1][node.y].up=false;//将下边节点的上边置为不能走
            this.stack.push(this.maze[node.x+1][node.y]);
            continue;
        }
        if(node.left){
            this.maze[node.x][node.y].left=false;//将当前节点的左方向置为false
            this.maze[node.x][node.y-1].right=false;//将左边节点的右边置为不能走
            this.stack.push(this.maze[node.x][node.y-1]);
            continue;
        }
        if(node.up){
            this.maze[node.x][node.y].up=false;//将当前节点的上方向置为false;
            this.maze[node.x-1][node.y].down=false;//将上边节点的下边置为不能走
            this.stack.push(this.maze[node.x-1][node.y]);
            continue;
        }
        this.stack.pop();
    }
}
public void showMazePath(){
         if(stack.empty()){
             System.out.println("未找到迷宫的有效路径");
         }else{
             /*
             若栈不空,说明找到了迷宫路径,将栈中元素出栈,将*赋给出栈元素,然后再继续遍历栈内元素
              */
             while(!this.stack.empty()){
                 Node node=this.stack.top();
                 this.maze[node.x][node.y].data='*';
                 this.stack.pop();
             }
             /*
             遍历二维数组,如果二维数组中的值为*,则打印出*,否则打印数据
              */
             for(int i=0;i<row;i++){
                 for(int j=0;j<col;j++){
                     if(this.maze[i][j].data=='*'){
                         System.out.print('*'+" ");
                     }else{
                         System.out.print(this.maze[i][j].data+" ");
                     }
                 }
                 System.out.println();
             }
         }
     }
}

 

4.主类,用来设置二维数组,实现题型哪一方下等功能

public  class Mainn{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("请输入迷宫的行列数:");
        int row = in.nextInt();
        int col = in.nextInt();

        // 用row和col生成迷宫对象
        Maze maze = new Maze(row, col);

        System.out.println("请输入迷宫的路径信息:");
        for(int i=0; i<row; ++i){
            for(int j=0; j<col; ++j){
                int data = in.nextInt();
                // data i j
                maze.setMazeNode(data, i, j);
            }
        }

        // 设置迷宫每一个节点的四个方向的行走状态
        maze.setMazeNodeState();

        // 开始寻找迷宫路径
        maze.findMazePath();

        // 输出迷宫路径结果
        maze.showMazePath();
    }
}

 

 

 


posted @ 2019-10-15 12:13  acehm  阅读(218)  评论(0编辑  收藏  举报