游戏AI综述

news2024/12/27 18:55:14

1、游戏AI的特点

随着深度学习等技术的突破性进展,现代的人工智能技术进步神速,已经在自然语言处理、机器翻译和图像识别等众多方面取得了进步,而且已经影响到了现实生活。

如果把围棋也看作游戏,那么大名鼎鼎的AlphaGo系列人工智能,已经体现了人工智能在为围棋项目中的较高水平。另外,也有一些人工智能再经济类电子游戏中取得了良好的成绩。

从概念上讲,游戏AI指的并不是此类AI。

电子游戏在早期就开始包含了计算机控制的敌方角色,但设计精妙的游戏AI再电子游戏早期历史中比较少见。其中一个受到广泛欢迎的作品是著名的《吃豆人》。

 在《吃豆人》游戏中,玩家扮演吃豆人在平面迷宫中移动,目标是走过迷宫中所有的位置,吃光所有的豆子。而敌人则会组织玩家,吃豆人被敌人碰到就会失败一次。

在此游戏中,设计师制作了多种类型的AI,每种敌人的行为逻辑都有所不同。例如,有些敌人会随机漫游,有些敌人会沿最短路径追击吃豆人的当前位置,有些敌人会以吃豆人前方为目标,还有一些敌人则以吃豆人的旁边或后方为目标。多个不同行为逻辑的敌人同时行动,迫使玩家不断观察、快速决策并付诸行动。虽然敌人总是遵循某种特定逻辑,但因敌人速度不同、关卡设计不同以及玩家行为不同,局面会时刻发生变化。因此虽然敌人行为模式相同,但每一局游戏都会给玩家新的体验。

从原理上来看,用4个敌人围住吃豆人并不是非常困难的事情。例如,在吃豆人进入某些出口较少的局部区域时,让敌人角色分别把守几个出口,玩家就很难找到突破的方法了。那为什么游戏开发者不从“如何彻底困死玩家”的角度考虑设计呢?显然,如果敌人真的足够聪明,那么这个游戏就不会令人着迷了,就像不太会有人喜欢一直与AlphaGo下围棋一样。

明白了这个例子,再与广义的人工智能对比,就很容易理解游戏AI的主要目标是什么了,以及它与普遍意义上的人工智能之间的区别。

通常人工智能的目标是解决具体问题。无论是语音识别、图像识别,还是机器翻译,这类问题都是有具体目标的。无论AI得到的结果正确与否,但至少有一个确定的答案或者相对确定的答案。

而游戏AI的目标是:让计算机角色与玩家有效交互 ,鼓励玩家积极尝试和探索,表达设计师的想法和理念,最终让玩家经理某种体验并收获了去。换句话说,游戏AI的核心不是“智能”,而是“乐趣”。

如果以乐趣和体验作为主要目的,那么我们对于游戏AI的认识就更清晰了。

2、常用AI技术

由于核心目标不同,设计游戏AI常用的技术也不同。游戏AI 开发最基本也最常用的方法是FSM(Finite State Machine)。

FSM本质上只是机械化的程序逻辑,只需要用最基本的分支语句就可以实现。设计FSM的难点在于针对需求设计状态转移图,并设计精确的从一个状态转移到另一个状态的条件。只有有了清晰的状态转移图,才可能用明确的代码描述规则。

另外,在重度AI游戏中(如足球或现实模拟类型的游戏),行为树(Behaviour Tree)也是一种常用的AI架构方法,而理解行为树的设计思路,依然需要状态机思想作为铺垫。

3、AI的层次

人们在考虑问题时,思路是“分层”的。例如在《吃豆人》游戏中,玩家在开局时要先观察地图,确认主角和敌人的位置;然后再做整体性决策,如先去哪一个区域,再去哪一个;最后才是具体操作,输入方向指令让主角沿着道路前进,朝预期的方向移动。当敌人和主角的位置发生变化时,需要再重复一次从观察、决策到具体操作的过程。每一次过程可能非常短暂,毕竟游戏高手习惯于这种快速的观察、决策和行动。

游戏AI亦是如此,一般来说稍微有点智能的AI角色,这稍有决策和行动两个层次的“思路”。如果只有一个层次的思路,行为就会变得极为单一。

而思维层次的高低与变成难度往往不成正比。例如,AI角色对当前局势进行判断和切换当前状态的操作,看上去很高级,但实现并不困难。而低级行为,如沿着地图移动到合适的位置,这种基本的寻路行为却涉及多种复杂算法。

通用的自动寻路并移动的算法,设计了搜索算法、三角形剖分(处理场景中的障碍物)、路径优化和动态避障等多种算法,而且在各种具体场景中会有大量细节需要处理。亲自动手实现一套导航系统难度相当大,好在Unity已经提供了较完善的导航系统,设计游戏AI可以从学习导航系统开始。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/979441.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用SimpleITK批量计算医学图像分割的mask体积,病灶体积

使用SimpleITK计算如下所示的病灶标注的整体体积。 可以在该代码的基础上,增加写入excel表的操作,这样就可以把模型推理前的体积和模型推理后的体积都写入excel表,然后进行一系列分析。 1 计算方式 用SimpleITK包进行ROI/病灶体积的计算 im…

C高级day1

一、用cut截取出用户的家目录。要求:不能用“:”作为分割 二、XMind思维导图

el-table纵向垂直表头

参考&#xff1a;https://www.jianshu.com/p/1f38eaffd070 <el-tablestyle"width: 100%":data"getValues":show-header"false"border:cell-style"cellStyle" ><el-table-columnv-for"(item, index) in getHeaders"…

两种解法解决 LeetCode 27. 移除元素【C++】

移除元素 27. 移除元素题目&#xff1a;[移除元素](https://leetcode.cn/problems/remove-element/description/)示例和提示&#xff1a;解法&#xff1a;1. 暴力解法 2. 快慢指针 27. 移除元素 题目&#xff1a;移除元素 示例和提示&#xff1a; 解法&#xff1a; 1. 暴力解…

【C++】DICOM医学影像工作站PACS源码

PACS即影像存档与传输系统&#xff0c;是医学影像、数字化图像技术、计算机技术和网络通讯技术相结合的产物&#xff0c;是处理各种医学影像信息的采集、存储、报告、输出、管理、查询的计算机应用程序。 PACS是基于DICOM标准的医学影像管理系统&#xff0c;其模块覆盖了从影像…

Java:ArrayList源码解析

Java&#xff1a;ArrayList源码解析 导言 我们都知道ArrayList是一个可以实现自动扩容的List类&#xff0c;为了理解ArrayList是如何进行扩容的&#xff0c;我们就有必要对ArrayList的源码进行分析。本文中将着重研究源码中ArrayList是如何实现自动扩容的。 源码解析 ArrayL…

合宙Air724UG LuatOS-Air LVGL API控件-页面 (Page)

页面 (Page) 当控件内容过多&#xff0c;无法在屏幕内完整显示时&#xff0c;可让其在 页面 内显示。 示例代码 page lvgl.page_create(lvgl.scr_act(), nil) lvgl.obj_set_size(page, 150, 200) lvgl.obj_align(page, nil, lvgl.ALIGN_CENTER, 0, 0)label lvgl.label_crea…

netbeans+wamp+php配置调试代码

netbeans版本&#xff1a;8.1 wamp版本是2.5,里面的php5.5.12&#xff0c;apache2.4.9&#xff0c;mysql5.6.17。 wamp已经自带Xdebug&#xff08;PHP程序调试器&#xff09;。 步骤&#xff1a; 1.路径&#xff1a;D:\wamp\bin\apache\apache2.4.9\bin\php.ini 2.打开ne…

MyBatis 动态 SQL 实践教程

一、MyBatis动态 sql 是什么 动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中&#xff0c;开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。例如&#xff0c;拼接时要确保添加了必要的空格&#xff0c;还要注意去掉列…

电脑上jpg图片怎么改大小kb?三招学会图片压缩

在电脑上处理jpg图片时&#xff0c;有时候我们需要修改图片的大小&#xff0c;尤其是在需要上传图片到一些限制大小的平台时。那么&#xff0c;如何更改jpg图片的大小呢&#xff1f;今天&#xff0c;我将分享三个实用的方法&#xff0c;让大家轻松解决图片太大的问题&#xff0…

仿射密码 affine

参考链接&#xff1a;https://www.cnblogs.com/0yst3r-2046/p/12172757.html 仿射加密法 在仿射加密法中&#xff0c;字母表的字母被赋予一个数字&#xff0c;例如 a0&#xff0c;b1&#xff0c;c2…z25 。仿射加密法的密钥为0-25直接的数字对。 仿射加密法与单码加密法没什么…

ubuntu修改用户名和用户密码

1.修改passwd文件 sudo gedit /etc/passwd2.修改shadow文件 sudo gedit /etc/shadow3.修改home目录下文件夹名 mv /home/原用户名/ /home/新用户名4.修改sudo权限&#xff08;修改group用户组&#xff09; sudo gedit /etc/group5.修改用户密码 sudo passwd username #修改…

位运算 |(按位或) (按位与) ^(按位异或)

目录 文章目录&#xff1a;本章讲解的主要是刷题系列 1&#xff1a;首先会介绍 I & ^这三个操作符的作用&#xff0c;性质 2&#xff1a;三道使用位运算操作符的经典 笔试题(来自剑指offer) 题目链接如下&#xff1a; 1:136. 只出现一次的数字 - 力扣&#xff08;LeetCode…

Jmeter进阶使用指南-使用断言

Apache JMeter是一个流行的开源负载和性能测试工具。在JMeter中&#xff0c;断言&#xff08;Assertions&#xff09;是用来验证响应数据是否符合预期的一个重要组件。它是对请求响应的一种检查&#xff0c;如果响应不符合预期&#xff0c;那么断言会标记为失败。 以下是如何在…

Echarts 中国地图

直接展示效果图&#xff1a; 我们需要引入两个文件&#xff1a; echarts.js 官网地址下载&#xff1a;快速上手 - Handbook - Apache ECharts chain.js 这个官网已经找不到了&#xff0c;需要自行搜寻下载 也可以私信我(网上下载的China.js会导致省名称定为不准确&#xff0…

Go语言最全面试题,拿offer全靠它,附带免积分下载pdf

面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 文章目录 Go 基础类GO 语言当中 NEW 和 MAKE 有什么区别吗&#xff1f;PRINTF(),SPRINTF(),FPRINTF() 都是格式化输出&#xff0c;有什么不同&#xff1f;GO 语言当中数组和切片的区别是什么&#xf…

【C++】函数重载 ③ ( 为函数指针赋值重载函数 )

文章目录 一、函数指针回顾1、函数指针概念2、函数指针语法3、代码示例 - 函数指针示例 二、为函数指针赋值重载函数1、为函数指针赋值重载函数2、代码示例 - 为函数指针赋值重载函数 博客总结 : 重载函数 : 使用 相同 的 函数名 , 定义 不同 的 函数参数列表 ;判定标准 : 只有…

判断计算机处理器的大小端

一、什么是大小端&#xff1f; 大端模式&#xff1a;低位字节存在高地址&#xff0c;高位字节存在低地址 小端模式&#xff1a;高位字节存在高地址&#xff0c;低位字节存在第地址 二、如何判断计算机处理器是大端还是小端&#xff1f; ①使用变量 x 的值本身来检查处理器存储…

九章云极DataCanvas公司参与大模型重点项目合作签约,建设产业集聚区

9月3日&#xff0c;2023中国国际服务贸易交易会石景山国际开放合作论坛在石景山首钢园成功举办&#xff0c;北京市委常委、常务副市长夏林茂&#xff0c;商务部服务贸易和商贸服务业司司长王东堂&#xff0c;北京市石景山区委书记常卫出席论坛并致辞。论坛期间正式举行“石景山…

关于内涝积水的那些事儿

内涝积水是指城市区域在强降雨、排水系统失效或不足的情况下&#xff0c;大量降雨无法及时排除而积聚在地面上的现象。内涝积水不仅给城市环境和居民的生活带来困扰&#xff0c;同时也给社会经济、交通运输和居民安全造成了严重的危害。 内涝积水的影响 1.内涝积水会对城市环境…