游戏开发中常用的算法1(20道题一篇文章)

这篇具有很好参考价值的文章主要介绍了游戏开发中常用的算法1(20道题一篇文章)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、快速排序算法

步骤1:选取一串数字中的中心轴

步骤2:将大于中心轴的数字放在右边

步骤3:将小于中心轴的数字放在左边

步骤4:分别对左右两个序列重复前三步操作

public class QuickSort : MonoBehaviour
{
    private void Start()
    {
        int[] Nums = { 4, 3, 6, 1, 8, 0, 3, 2, 5, 7};
        Sort(Nums, 0, 9);
        for (int i = 0; i < 10; i++)
        {
            Debug.Log(Nums[i]);
        }
    }
    void Sort(int[] nums,int left,int right)
    {
        //退出条件
        if (left  >= right)
            return;
        int i = left;
        int j = right;

        //中心元素取为第一个元素
        int temp = nums[left];

        while(i != j)
        {
            //从最右边的元素开始比较中心元素
            while(i < j && nums[j] >= temp)
            {
                j--;
            }
            if(i < j )
            {
                nums[i] = nums[j];
            }
           while(i < j && nums[i] <= temp)
            {
                i++;
            }
           if(i < j)
            {
                nums[j] = nums[i];
            }
        }
        nums[i] = temp;
        Sort(nums, left, i - 1);
        Sort(nums, i+1, right);
    }
}

二、冒泡排序算法

步骤一、从数组的最左侧两个元素进行比较

步骤二、将较大的数向右移动,再进行比较

步骤三、直到将最大的数字放在最右边

步骤四、重复上述操作,不过这次比较数组的数量-1

public class BubbleSort : MonoBehaviour
{
    private void Start()
    {
        int[] array = { 6, 5, 8, 7, 1, 2, 3, 5 };
        Sort(array);
        for (int i = 0; i < array.Length; i++)
        {
            Debug.Log(array[i]);
        }
    }

    private void Sort(int[] array)
    {
        //进行i次排序,对数组内所有元素都进行比较
        for (int i = 0; i < array.Length - 1; i++) 
        {
            //对某一元素进行的相邻元素的比较,比较次数差i次
            for(int j = 0; j < array.Length-1-i; j++)
            {
                if(array[j] > array[j+1])
                {
                    int temp = array[j];
                    //如果左边的数字比右边的大,就把大的数字向右平移一位
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }
}

三、二分查找(要求数组顺序排列)

一、初始化三个序号,分别代表第一个,最后一个和中间序号

二、用中间序号的值和目标值进行对比,如果相等就返回

三、如果中间序号的值大于目标值,就向左缩小范围

四、如果中间序号的值小于目标值,就向右缩小范围

第一种实现:常规实现

public class BinarySearch : MonoBehaviour
{
    private void Start()
    {
        int[] array = { 8, 11, 21, 28, 32, 43, 48, 56, 69, 72, 80, 94 };
        Debug.Log(Search(array, 80)); 
    }
    private int Search(int[] array,int key)
    {
        var min = 0;
        var max = array.Length - 1;
        var mid = 0;
        while(min <= max)
        {
            mid = (min + max) / 2;
            if(array[mid] > key)
            {
                max = mid - 1;
            }
            else if(array[mid] < key)
            {
                min = mid + 1;
            }
            else if(array[mid] == key)
            {
                return mid;
            }
        }
        return 0;
    }
}

第二种实现:递归实现

Debug.Log(SearchTwo(array, 80,0,12));
 
private int SearchTwo(int[] array,int key,int low,int high)
    {
        if (low > high)
            return -1;
        var mid = (low + high) >> 1;
        if (array[mid] > key)
        {
            return SearchTwo(array, key, low, mid - 1);
        }
        else if (array[mid] < key)
        {
            return SearchTwo(array, key, mid + 1, high);
        }
        else
            return mid;
    }
}

四、基于四叉树/八叉树的碰撞检测

五、随机寻路算法、跟踪算法、闪避算法(与跟踪算法相反)

DFS(Deep First Search)、BFS(Breadth Fitst Search)

六:A*寻路算法

A*主要是利用三个数值来计算最佳路径,分别是G代价、H代价、F代价

G:从某节点到开始节点的移动距离

H:从某节点到目标节点的估计移动距离,从任何节点迭代实际所需的距离大于或者等于H代价。

F:F代价等于G+H,F值越低,作为寻径选择就越有吸引力

我们的目标是简单的选择最低的F代价,不断的重复,直到我们的目标节点

代码部分可以见:

(1条消息) Unity A星(A Star/A*)寻路算法_unity寻路算法_九本才的博客-CSDN博客

现在有A*的寻路插件

七:B*寻路算法

理解B*可以把它想象成一个朝着目标前进的贪吃蛇,如果遇到障碍就会分裂成两条蛇,一左一右绕开障碍,只要有一条蛇碰到目标就结束寻路

优点:目标点在封闭空间内时,BStar效率优势明显

缺点:喜欢贴着墙走

八、Nav Mesh导航系统

NacigationMesh是一种数据结构,用于描述游戏世界的可行走表面

Navigation是Unity自带的导航,具备基本的Bake,NavMesh和NavMeshAgent等基本导航功能

新版中有NavMeshComponent,能够实现动态烘焙

步骤:

打开Navgation面板、

设置烘焙参数(Bake Agent)、

设置行走区域(设置为Navigation Static)、烘焙

角色添加寻路控制器(Nav Mesh Agent)、

挂在一个脚本到Player身上,告诉目标点即可

using UnityEngine;
using UnityEngine.AI;

public class Player : MonoBehaviour
{
	private NavMeshAgent agent;
	public Transform target;

	void Start()
	{
		agent = GetComponent<NavMeshAgent>();
		agent.destination = target.position;
	}
}

九、数组中仅出现过一次的元素

方法一:使用位异或运算

仅针对数组中只出现一次的情况

使用位运算,最后只剩下没有重复的元素

using UnityEngine;
/// <summary>
/// 某个只出现一次的数字
/// 思路:采用异或操作,相同为0,不同为1
/// a^a = 0; a^0 = a;
/// </summary>
public class SingleNumber : MonoBehaviour
{
    public int[] nums = { 1, 2, 3, 2, 1 };
    private void Start()
    {
        SingleNumber1(nums);
    }
    public void SingleNumber1(int[] nums )
    {
        int result = 0;
        for(int i = 0; i < nums.Length; i++)
        {
            //第一次异或操作完了就是第一个元素,然后第一个元素和第二个元素对比
            //如果两个相同,返回就是0,如果不相同,
            result ^= nums[i];
        }
        Debug.Log(result);
    }
}

方法二:使用Set集合

HashSet具有去重性

使用!Add即可

   /// <summary>
    /// 使用HashSet来解决,HashSet具有去重特性!
    /// </summary>
    /// <param name="nums"></param>
    public void SingleNumber2(int[] nums)
    {
        HashSet<int> hash = new HashSet<int>();
        for (int i = 0; i< nums.Length;i++)
        {
            if(!hash.Add(nums[i]))
            {
                hash.Remove(nums[i]);
            }
        }
        foreach (var item in hash)
            Debug.Log(item);
    }
}

十、多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

方法一、排序后输出中间元素即可

public class Majority : MonoBehaviour
{
    int[] nums = { 1, 2, 3, 4, 5, 6, 7, 2, 2, 2, 2, 2 };
    private void Start()
    {
        Major1(nums);
        Major2(nums);
    }
    /// <summary>
    /// 方法1:先排序,再输出一半中的元素
    /// </summary>
    /// <param name="nums"></param>
    public void Major1(int [] nums)
    {
        Array.Sort(nums);
        Debug.Log(nums[nums.Length/2]);
    }

方法二、摩尔投票法

把第一个元素作为开始元素,如果紧接的两个元素不相同,count就减,如果相同,count就加,到最后还剩下的count就是最多的元素

/// <summary>
    /// 方法2:摩尔投票法
    /// </summary>
    public void Major2(int[] nums)
    {
        int major = nums[0];
        int count = 1;
        for (int i = 1; i < nums.Length; i++)
        {
            //消除完了,就进行下一个
            if(count == 0)
            {
                count++;
                major = nums[i];
            }
            //跟后面的元素相同的话,这个元素数目就继续增加
            else if(major == nums[i])
            {
                count++;
            }
            else
            {
                count--;
            }
        }
        Debug.Log(major);
    }
}

十一、合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

方法1:使用三目运算符

即:

x?y:z 表示如果表达式x为true,则返回y;
如果x为false,则返回z

是省略if{}else{}的简单形式。

using UnityEngine;
/// <summary>
/// 合并两个有序数组
/// </summary>

public class Merge : MonoBehaviour
{
    int[] nums1 = { 1, 2, 3,0,0,0 };
    int[] nums2 = { 2, 5, 6 };
    private void Start()
    {
        MergeNums(nums1, 3, nums2, 3);
        foreach (var item in nums1)
        {
            Debug.Log(item);
        }
    }
    /// <summary>
    /// 合并有序数组方法1
    /// </summary>
    /// <param name="数组1"></param>
    /// <param name="数组1的长度"></param>
    /// <param name="数组2"></param>
    /// <param name="数组2的长度"></param>
    public int[] MergeNums(int[] nums1,int m,int[] nums2,int n)
    {
        int i = m - 1;
        int j = n - 1;
        int end = m + n - 1;
        while(j>=0)
        {
            nums1[end--] = (i >= 0 && nums1[i] > nums2[j]) ? nums1[i--] : nums2[j--];
        }
        return nums1;
    }
}

方法二:使用官方API

Array.Copy:合并两个数组

Array.Sort:排序方法,由小及大

public void MegerNums2(int[] num1, int m ,int[] nums2, int n )
    {
        Array.Copy(nums2, 0, nums1, m, n);
        Array.Sort(nums1);
    }

十二、鸡蛋掉落

给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。

已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。

每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。

请你计算并返回如果要确定 f 确切的值 的话,我们的 最小操作次数 是多少?

   文章来源地址https://www.toymoban.com/news/detail-462910.html

到了这里,关于游戏开发中常用的算法1(20道题一篇文章)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 七大 排序算法(一篇文章梳理)

    排序算法是计算机科学中不可或缺的一部分,它们在数据处理、数据库管理、搜索引擎、数据分析等多个领域都有广泛的应用。排序算法的主要任务是将一组数据元素按照某种特定的顺序(如升序或降序)进行排列。本文将对一些常见的排序算法进行详细的介绍和分析,包括

    2024年03月08日
    浏览(41)
  • Ubuntu20.04——一篇文章让你从零配置VINS_Mono环境以及运行(2023年最新)

    注:文末包含该文章涉及的所有安装包的网盘链接 零、换源(也可以先不换,后面觉得下载慢再换也行) 1、备份原来的源 2、打开源保存文件 3、换源(换其中一个就行,也可以去搜别的源) 4、更新源 一、安装git(克隆源代码)、gedit(编辑文本)、cmake、gcc、g++、build-e

    2024年02月04日
    浏览(28)
  • 【Unity自制手册】unity常用API大全——一篇文章足以(万字详解)

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏 unity 实战系列 ⭐相关文章⭐ ⭐【软件设计师高频考点暴击】 -本站最全-unity常用API大全(万字详解),不信你不收藏 -关于游戏剧情模式中用到的基础简单API -控制游

    2024年02月12日
    浏览(32)
  • Python常用基础语法知识点大全合集,看完这一篇文章就够了

    Python 是一门独特的语言,快速浏览一下他的要点: 面向对象:每一个变量都是一个类,有其自己的属性(attribute)与方法(method)。 语法块:用缩进(四个空格)而不是分号、花括号等符号来标记。因此,行首的空格不能随意书写。 注释:行内用“#”号,行间注释写在两

    2023年04月22日
    浏览(40)
  • 【C++算法图解专栏】一篇文章带你掌握差分算法

    ✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343 📣专栏定位:为 0 基础刚入门数据结构与算法的小伙伴提供详细的讲解,也欢迎大佬们一起交流~ 📚专栏地址:https://blog.csdn.net/Newin2020/article/details/126445229 ❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创

    2024年04月11日
    浏览(28)
  • 【最短路算法】一篇文章彻底弄懂Dijkstra算法|多图解+代码详解

    博主简介: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: 算法 ;该专栏专注于蓝桥杯和ACM等算法竞赛🔥 近期目标: 写好专栏的每一篇文章 Dijkstra算法适用于 最短路问题

    2023年04月08日
    浏览(26)
  • TD算法超详细解释,一篇文章看透彻!

    郑重声明:本系列内容来源 赵世钰(Shiyu Zhao)教授的强化学习数学原理系列,本推文出于非商业目的分享个人学习笔记和心得。如有侵权,将删除帖子。原文链接:https://github.com/MathFoundationRL/Book-Mathmatical-Foundation-of-Reinforcement-Learning 上一节我们讲到, Robbins-Monro Algorithm 算法解

    2024年02月01日
    浏览(34)
  • 看完这篇文章你就彻底懂啦{保姆级讲解}-----(I.MX6U驱动UART串口通信) 2023.5.20

    串口是我们在开发过程中最常用到的外设,所以我们必须掌握。 串口驱动初始化部分 好!按照老样子,接下来开始详细讲解每行代码的用处,以及为什么这样写! 串口驱动初始化部分讲解开始: //将IO功能设置为UART1_RXD和UART1_TXD。 //配置UART1_TX_DATA、UART1_RX_DATA的IO属性。 先关

    2024年02月05日
    浏览(96)
  • 什么是算法?读完这篇文章你就知道了

    算法是指完成一个任务所需要的具体步骤和方法。也就是说给定初始状态或输入数据,经过计算机程序的有限次运算,能够得出所要求或期望的终止状态或输出数据。 编程界的“Pascal之父”Nicklaus Wirth有一句人尽皆知的名言:“算法+数据结构=程序”。(Algorithm+Data Structures

    2024年02月04日
    浏览(36)
  • 【r-tree算法】一篇文章讲透~

    目录 一、引言 二、R-tree算法的基本原理 1 数据结构 2 插入操作 3 删除操作 4 查询操作 5 代码事例 三、R-tree算法的性能分析 1 时间复杂度 2 空间复杂度 3 影响因素 四、R-tree算法的变体和改进 1 R*-tree算法 2 X-tree算法 3 QR-tree算法 五、R-tree算法的应用实例 1 地理信息系统(GIS)

    2024年04月10日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包