`
sunday132
  • 浏览: 51137 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

A*算法实现

 
阅读更多

 

        在游戏编程中广泛使用了A*算法。 就比如红警里面你框一辆坦克然后在目的地上点一下鼠标,不管多远坦克都会自动跑到目标点上(前提是目标点是可以到达的畅通路径)。在这个过程中坦克起始位置和终点位置中间的路径已经由程序计算完成。而这个程序的算法我们称之为最优路径算法。

       是下面是最优算法A*原理的实现,当然只是原理算法的实现,只供学习和研究其效率一般,没有实现算法和数据结构的优化,负责的程序员应该进一步的优化它。 好了下面我们还是来看看如何实现吧。

地图中每一块都有3个属性
G = 移动代价。
H = 实际代价,离到终点的实际距离。
F = G+H
A* 就是寻找具有最小F值能到达终点的路径。
 
下面我们开始吧
先定义地图数据 0是可走1是不可行走
  int[][] map = {
      {
      0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, { 
      0, 1, 1, 1, 1, 0, 0, 1, 0, 0}, { 
      0, 1, 0, 0, 1, 0, 0, 0, 0, 0}, { 
      0, 1, 0, 0, 1, 1, 1, 1, 1, 0}, { 
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
  };
 
需要维护两个列表一个是开放列表还有一个封闭列表
 Vector open = new Vector();       // 开放列表 
  Vector close = new Vector();      // 封闭列表
 
定义节点类
  class Node {
    int x;
    int y;
    int g;     // G = 移动代价,沿着到父块而生成路径移动的代价。 
    int h;     // H = 从格子中给定 的方块到最终目标 B点的评估移动代价。          
    int f;     //  估价
    Node father;
    Node(Node node, int sx, int sy, int ex, int ey) {
      if (node != null) {  // 新建子节点
        father = node;    // 设置父节点
        x = sx;            // 当前x
        y = sy;           // 当前y
        h = (getABS(sx - ex) + getABS(sy - ey))*10; // 实际代价 当前块移动到终点块的绝对距离。
        g = node.g + 10;                                         // 代价推算 当前块移动代价=父块移动代价+移动代价
        f = g + h;                                                   // 估价
      }
      else {                 // 根节点
        x = sx;
        y = sy;
        h = 0;
        g = 0;
        f = 9999;
      }
    }
  }
 
private int getABS(int v) {
    if (v < 0) {
      return -v;
    }
    return v;
  }

  // 开始寻路
  public void xunLu(int sx, int sy, int ex, int ey) {
    boolean flag = true;  // 是否存在于open list中
    int minIndex = 0;     // 具有最小F值对象的的open list下标
    int newX = 0;
    int newY = 0;

    /**
     * 1 添加开始方块到开放列表。
     *   初始化根接点,把根节点放入开放列表.
     */
    Node minNode = new Node(null, sx, sy, ex, ey);
    open.add(minNode);

    while (open.size() != 0) {
      /**
       *  2 查找开放列表中具有最小F值的方块。
       */
      minNode = ((Node)open.get(0));
      minIndex = 0;
      for (int i = 1; i < open.size(); i++) {
         if (minNode.f > ( (Node) open.get(i)).f) {
            minNode = ( (Node) open.get(i));
            minIndex = i;
         }
      }

      /**
       * 3 把最小F值的方块从开放列表中取出然后放入封闭列表。
       */
      if (minNode != null) {
          close.add(minNode);
          open.remove(minIndex);
      }
        /**
         *  4 如果目前找到的最小F值块是终点就返回。
         */
        if (minNode.x == ex && minNode.y == ey) {
          do {
            minNode = minNode.father;
          }
          while (get != null);
          return;
        }
        /**
         *  5 对最小F值块(即上面刚刚放入封闭列表里面) 的8个相邻方块的进行判断.
         *    将4或8个方向,可以走的放入开放列表内.
         */
        for (int i = 0; i < 4; i++) {
          flag = true;
          newX = minNode.x + t[i][0];
          newY = minNode.y + t[i][1];
          /**
           *5。1 地图是否越界 如果它不可行走,或者存在于封闭列表,忽略它。
           */
          if(newY < 0 || newY > 4 || newX < 0 || newX > 9) {
            continue;
          }
          if (map[newY][newX] == 0) {    // 判断是否是可以移动
            for (int k = 0; k < close.size(); k++) {  
              if ( (((Node) close.get(k)).x == newX) &&
                   (((Node) close.get(k)).y == newY) ) {
                flag = false;
                break;
              }
            }

            if(flag) {
              for(int ii = 0; ii < open.size(); ii++) {  
                if( ((Node)open.get(ii)).x == newX &&  ((Node)open.get(ii)).y == newY) {
                  open.remove(ii);
                  break;
                }
              }
              open.add(new Node(minNode, newX,newY, ex, ey));
            }
          }
        }
      }
    } 

2
0
分享到:
评论

相关推荐

    layaair typescipt吃豆人a*算法实现

    以下是对"layaair TypeScript吃豆人A*算法实现"这一主题的详细解释。 **LayaAir引擎**: LayaAir是基于HTML5技术的2D/3D游戏引擎,支持跨平台开发,包括Web、Android和iOS。它提供了一套完整的开发工具链,可以方便...

    人工智能A*算法实现+python+北邮人工智能实训作业

    6. **test.py**:测试文件,包含了对A*算法实现的各种单元测试,确保算法的正确性。 7. **map.py**:地图类的定义,可能包括地图的操作方法,如移动、绘制、判断某个位置是否可通行等。 8. **output_txt.py**:...

    人工智能 A*算法实现自动寻路的程序

    总的来说,这个"人工智能 A*算法实现自动寻路的程序"是一个实用的教学工具,它不仅展示了A*算法的基本原理,还让用户能够直观地理解算法如何在复杂环境中找到最优路径。通过学习和实践这个程序,开发者能够提升对...

    A*算法实现八数码问题

    A*算法是一种启发式搜索算法,由A算法发展而来,结合了Dijkstra算法的优点并引入了启发式函数。该算法的核心在于它能够在搜索过程中平衡探索的深度和宽度,通过评估每个节点的f(n)值来决定下一步的搜索方向,其中f(n...

    A*算法实现迷宫问题

    6. **优化技巧**:在实际应用中,可以使用各种优化策略提高A*算法的效率,如使用二叉堆实现开放列表以降低查找和插入的时间复杂度,或者采用启发式函数的近似版本(如A*的变体Dijkstra's algorithm with landmarks)...

    A*算法实现最短路径搜索

    在学习了著名的A星算法之后,我便有了想法要把它实现出来。这是对A*算法的一整套详细实现,固定地图障碍物,自选起点和终点,实现最短最优路径搜索,可用在游戏自动寻路上(要用vs编译)

    A*算法实现8数码问题(C++)

    C++编写的使用A*算法解决8数码问题 1.输入初始状态,1~8数字,用空格隔开,0代表空格,顺序在矩阵中的位置为 1 2 3 4 5 6 7 8 9 如输入1 2 3 4 5 6 7 8 0,则初始矩阵为 1 2 3 4 5 6 7 8 0 2.输入目标状态,说明...

    使用A*算法实现的9宫格拼图小游戏,包含源码和程序

    《使用A*算法实现的9宫格拼图小游戏解析》 在编程领域,尤其是在游戏开发中,路径规划是一项至关重要的技术。A*(A-star)算法作为一种高效的寻路算法,被广泛应用于各种需要智能决策的场景,如机器人路径规划、...

    A*算法实现简单魔板源程序

    在这个特定的上下文中,"A*算法实现简单魔板源程序" 提供了一个用代码实现的实例,帮助理解并应用A*算法解决实际问题。 简单魔板通常是指一个具有特定规则的二维网格,玩家需要通过移动棋子或者翻转格子来达成某一...

    A*算法实现推箱子游戏

    本文将深入探讨如何利用A*算法实现推箱子游戏的智能解决方案。A*算法是一种在图形搜索中寻找最短路径的有效算法,它结合了Dijkstra算法的全局最优性与最佳优先搜索的效率,通过引入启发式函数来提高搜索速度。 首先...

    A*算法实现旅行商tsp java

    在给出的压缩包文件中,`TspA.java`很可能是实现A*算法的Java源代码。这个程序可能包含了以下关键组件: 1. **节点类(Node)**:表示图中的每个城市,存储位置信息和与其它城市的距离。 2. **图结构(Graph)**:...

    A*算法实现8数码问题

    标题中的"A*算法实现8数码问题"涉及到的是一个经典的计算机科学和人工智能领域的议题。A*算法是一种在图形搜索中用于找到从起点到终点最短路径的启发式搜索算法,而8数码问题(又称滑动拼图游戏)是该领域常用的示例...

    A*算法实现N数码问题求解

    在提供的3252_A算法压缩包文件中,很可能包含了实现A*算法解决N数码问题的源代码,可能包括以下几个部分: - `Node` 类:表示搜索树中的节点,包含状态、父节点、g值、h值和f值。 - `heuristic` 函数:计算启发式...

    使用A*算法实现8数码问题的求解

    A* 算法是一种广泛应用在路径搜索和图形遍历中的高效启发式搜索算法,它结合了Dijkstra算法的最优化路径寻找和Best First Search的高效性。在8数码问题(也称为滑动拼图游戏)中,A* 算法能够帮助我们找到解决拼图的...

    A*算法实现15数码问题

    7. **C#实现**:在C#编程环境中,我们可以使用`System.Collections.Generic.PriorityQueue`类来构建优先队列。同时,为了存储和操作状态,可以定义一个自定义的结构体或类,包含当前状态、g(n)值、h(n)值以及父节点...

Global site tag (gtag.js) - Google Analytics