小妖精的完美游戏教室——人工智能,A*算法,实现篇
//================================================================
//
//  Copyright (C) 2017 Team Saluka
//  All Rights Reserved
//
//  Author:小妖精Balous
//
//================================================================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Saruka
{
    /// <summary>
    /// A*算法
    /// </summary>
    public class AStar
    {
        private AStar() { }
/// <summary>
        /// A*搜索算法
        /// </summary>
        /// <param name="navGrid">导航网格</param>
        /// <param name="startPosition">起点坐标</param>
        /// <param name="targetPosition">目标点坐标</param>
        /// <param name="heuristics">启发因子</param>
        /// <returns>路径</returns>
        public static List<NavNode> SearchPath(NavGrid navGrid, Vector3 startPosition, Vector3 targetPosition, Heuristics heuristics)
        {
            if (navGrid == null)
            {
                Debug.LogError("你正在使用A*算法,但是没有提供导航网格!");
                return null;
            }
NavNode startNode = navGrid.NavNodeFromWorldPosition(startPosition);
            NavNode targetNode = navGrid.NavNodeFromWorldPosition(targetPosition);
if (!targetNode.isWalkable) return null;
List<NavNode> queueNodes = new List<NavNode>();
            HashSet<NavNode> evaluatedNodes = new HashSet<NavNode>();
queueNodes.Add(startNode);
while(queueNodes.Count > 0)
            {
                NavNode currentNode = queueNodes[0];
                for (int i = 1; i < queueNodes.Count; i++)
                    if (queueNodes[i].fCost < currentNode.fCost || queueNodes[i].fCost == currentNode.fCost && queueNodes[i].hCost < currentNode.hCost)
                        currentNode = queueNodes[i];
queueNodes.Remove(currentNode);
                evaluatedNodes.Add(currentNode);
//找到路径,返回路径
                if (currentNode == targetNode)
                {
                    List<NavNode> path = new List<NavNode>();
                    NavNode node = targetNode;
                    while(node != startNode)
                    {
                        path.Add(node);
                        node = node.parent;
                    }
                    path.Reverse();
                    return path;
                }
foreach (NavNode neighborNode in navGrid.GetNeighborNodes(currentNode))
                {
                    if (!neighborNode.isWalkable || evaluatedNodes.Contains(neighborNode)) continue;
float newGCostToNeighborNode = currentNode.gCost + heuristics.GetHeuristics(currentNode, neighborNode);
                    if (!queueNodes.Contains(neighborNode) || newGCostToNeighborNode < neighborNode.gCost) 
                    {
                        if (!queueNodes.Contains(neighborNode)) queueNodes.Add(neighborNode);
                        neighborNode.gCost = newGCostToNeighborNode;
                        neighborNode.hCost = heuristics.GetHeuristics(neighborNode, targetNode);
                        neighborNode.parent = currentNode;
                    }
                }
            }
            //找不到路径,返回null
            return null;
        }
    }
}
小妖精的完美游戏教室——人工智能,A*算法,实现篇的更多相关文章
- 小妖精的完美游戏教室——人工智能,A*算法,引言
		今天也要直播魔法,求科学的! 欢迎来到小妖精Balous的完美游戏教室! 经过前两周的学习,相信米娜桑已经对状态机有所了解了呢~虽然状态机能够实现几乎所有的人工智能,但是,在实践中,你们有没有发现,自 ... 
- 小妖精的完美游戏教室——人工智能,A*算法,启发因子篇
		//================================================================//// Copyright (C) 2017 Team Saluk ... 
- 小妖精的完美游戏教室——人工智能,A*算法,导航网络篇
		//================================================================//// Copyright (C) 2017 Team Saluk ... 
- 小妖精的完美游戏教室——人工智能,A*算法,结点篇
		//================================================================//// Copyright (C) 2017 Team Saluk ... 
- 小妖精的完美游戏教室——buff系统
		作者:小妖精Balous,未经作者允许,任何个人与单位不得将此源代码用于商业化项目 #region buff /// <summary> /// 是否魔法免疫,魔法免疫的生物不会受到除自己 ... 
- 小妖精的完美游戏教室——东方PROJECT,同人,墙
		//================================================================//// Copyright (C) 东方同人社// All Rig ... 
- 小妖精的完美游戏教室——东方PROJECT,同人,符卡系统
		//================================================================//// Copyright (C) 东方同人社// All Rig ... 
- 小妖精的完美游戏教室——东方PROJECT,同人,th12灵梦A
		╮(╯▽╰)╭没办法,小妖精Balous也很讨厌学院化的教育呀,一点意义都没有. 这次就上传东方地灵殿灵梦A逻辑部分的核心代码吧,估计连老师都看不懂.动画部分的代码就不放上来了. //======== ... 
- 小妖精的完美游戏教室——东方PROJECT,同人,子机
		//================================================================//// Copyright (C)// All Rights Re ... 
随机推荐
- jQuery.support属性
			jQuery.support 属性包含表示不同浏览器特性或漏洞的属性集. 此属性主要用于 jQuery 的内部使用 jQuery.support主要包括以下测试: boxModel: 如果这个页面和浏 ... 
- Mysql 了解changeBuffer 与 purge 调优
			需要删除.新增记录或更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB 会将这些更新操作缓存在 change buffer中, ... 
- 关于html的基础标签
			html: 超文本标记语言 h1 -- h6: 标题标签 一级标题,一个页面中只能存在一个h1 数字越大,标题的级别越小br:换行p:段落 自带换行,前后自带间隙a::::href属性---指定将要跳 ... 
- python之路-数据类型(方法)
			Int i = 1 print(i.bit_length()) # 转化成二进制的最小位数. ''' 0000 0001 ''' Str class str(basestring): "&q ... 
- python dns
- 从0到1用eclipse用maven搭建web项目
			1,默认已经搭建了JDK1.5以上,以及eclipseEE版本,和maven. 2,修改maven的本地仓库和镜像,修改本地仓库是为了方便我们管理,maven的默认仓库是在C盘的USER文件夹下,我一 ... 
- Js函数基本介绍
			1. 函数的创建 在JavaScript里面创建函数的关键字为function 函数名:就是在我们调用函数的时候需要书写的标识符 形参:全称为形式参数,调用函数的时候,这个函数所需要的参数是什么 实参 ... 
- Linux系统的磁盘管理
			Linux系统的磁盘管理有三个命令:df.du.fdisk. df:列出Linux中所有文件系统的整体磁盘使用量: du:对文件和目录所占用磁盘空间的查看: fdisk:用于磁盘分区时列出所有的磁盘. ... 
- DevExpress WinForms使用教程:皮肤颜色和LookAndFeel
			[DevExpress WinForms v18.2下载] v18.2版本中更改了控制背景颜色和皮肤一起处理的方式.在v18.1中引入了Project Settings页面,其中包含一个skin se ... 
- 设计模式二之观察者模式(Subject-Observer)
			观察者模式定义了一系列对象之间的一对多关系,当一个主题对象改变状态,其他所有的依赖者都会收到通知. 好了,你可能会觉得上面的描述略微复杂,较难理解,那么现在我们将用一个简单的例子去讲解这个模式. 我们 ... 
