小妖精的完美游戏教室——人工智能,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 ...
随机推荐
- HTML的块级元素和行内元素
行内元素一般是内容的容器,而块级元素一般是其他容器的容器.一般情况下,行内元素只能包含内容或者其它行内元素,宽度和长度依据内容而定,不可以设置,可以和其它元素和平共处于一行:而块级元素可以包含行内元素 ...
- QPS的优化
cdn加速 吧静态资源放到别人的服务器上 精灵图 后台数据库用mysql+redis sql的优化 用缓存 程序架构:集群化部署 ,分布式+异步 celery:分布式异步任务框架 语言
- Linux SSH登录服务器报ECDSA host key "ip地址" for has changed and you have requested strict checking错误
错误:ECDSA host key "ip地址" for has changed and you have requested strict checking. 解决方案:在终端 ...
- windows 10系统在右键中添加管理员打开cmd
需要修改注册表内容,新建文件,后缀名改为reg,文件中粘贴下边的代码 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory ...
- MySql主从搭建详细步骤
环境: linux64位,一台机器两个实例,主库3306端口,从库3307端口 步骤: 一.下载安装 先下载安装mysql,这里使用了5.7.21版本,具体过程不做详细说明,可自行查资料如何下载 二. ...
- SQL-54 查找排除当前最大、最小salary之后的员工的平均工资avg_salary。
题目描述 查找排除当前最大.最小salary之后的员工的平均工资avg_salary.CREATE TABLE `salaries` ( `emp_no` int(11) NOT NULL,`sala ...
- dapper.simplecurd
[Table("Users")]//真实表名 publicclass User { [Key] publicint UserId { get; set; } [Column(&qu ...
- Python全栈day9习题
本内容主要为If条件语句和while循环的相关知识. 一.使用while循环输入1 2 3 4 5 6 8 9 10 i = 1 while i < 11: if i == 7: pass el ...
- Visitor 模式心得
最近读到Visitor模式,还是一知半解的.偶然翻到Uncle Bob对该模式的推导过程,有所心得,和大家分享一下. Uncle Bob 的链接是: http://butunclebob.com/Ar ...
- 微信小程序 画布drawImage实现图片截取
大多数图片都大小不一,选择框的尺寸也是宽高相等的,就会有图片被压缩 解决方法: 1.可以使用画布对图片先进行截取,保存截取图片(用户自己选取,或者指定图片中心区域截取),但是对于多张图片手动截取,会影 ...