项目三 基于A*搜索算法迷宫游戏开发

项目三 基于A*搜索算法迷宫游戏开发

随机生成一个迷宫,并求解迷宫
玩家可以自行求解

项目目标和主要内容

1)迷宫游戏是非常经典的游戏,在该题中要求随机生成一个迷宫,并求解迷宫;
2)要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘方向键控制,并在行走路径上留下痕迹;
3)系统走迷宫路径要求基于A*算法实现,输出走迷宫的最优路径并显示。
4)设计交互友好的游戏图形界面。

项目总体框架

总体框架

关键算法分析

深度优先遍历生成迷宫:

void createMaze() {
    //将当前格压入栈
    path.push(cur);
    while(!path.empty()) {
        ArrayList<Node> mNei=notVisitedNei(cur);
        if(mNei.size()==0){
            //如果该格子没有可访问的邻接格,则跳回上一个格子
            cur = path.pop();
            continue;
        }
        //随机选取一个邻接格(并且在地图内)
        next = mNei.get(new Random().nextInt(mNei.size()));
        int x = next.x;
        int y = next.y;
        //如果该节点被访问过,则回到上一步继续寻找
        if(visit[x][y]){
            cur = path.pop();
        }
        //否则将当前格压入栈,标记当前格为已访问,并且在迷宫地图上移除障碍物
        else{
            path.push(next);
            visit[x][y] = true;
            mMap[x][y] = road;
            //打通当前格与下一格
            //打通墙,将墙的位置改换定义为路
            mMap[(cur.x + x) / 2][(cur.y + y) / 2] = road;
            //当前格等于下一格
            cur = next;
        }
    }
    //设置入口
    mMap[start.x-1][start.y]=1;
    //设置出口
    mMap[end.x+1][end.y]=1;
}

A*搜索算法求解迷宫:


    public Node findPath(Node startNode, Node endNode) {
        openList.add(startNode);// 把起点加入 open list

        while (openList.size() > 0) {
            Node currentNode = findMinFNodeInOpenList();// 遍历 open list ,查找F值最小的节点,把它作为当前要处理的节点
            //如果open list为空,寻路失败,找不到到达终点的路径(也就是迷宫没有路可以到达)
            openList.remove(currentNode);// 将刚刚F最小的那个点从open list中移除
            closeList.add(currentNode);// 把这个节点移到 close list

            ArrayList<Node> neighborNodes = findNeighborNodes(currentNode);//寻找邻居节点(4个中寻找)
            for (Node node : neighborNodes) {
                if (exists(openList, node)) {//如果邻居节点在open列表中
                    foundPoint(currentNode, node);//更新列表中父节点和估价函数信息
                } else {
                    notFoundPoint(currentNode, endNode, node);//如果邻居节点不在open列表中,则将该点加入open列表中
                }
            }
//如果终点加入到了open list中,此时路径已经找到,从终点开始,每个方格沿着父节点移动直至起点,这就是最优路径
            if (find(openList, endNode) != null) {//如果找到尾节点,则返回尾节点
                return find(openList, endNode);
            }
        }

        // return find(openList, endNode);
        return null;
    }

项目实现及结果分析

开始页面展示:
开始页面

游戏界面展示:
游戏界面1
游戏界面2

结束界面展示:
结束界面

无法用图片展现的功能:
玩家按下空格键可以显示A*算法求解路线

实验总结

1.利用深度优先算法生产迷宫地图
2.利用A*算法求解迷宫

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏格拉没有底~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值