TC官方合作论坛

 找回密码
 立即注册
查看: 21459|回复: 94

[讨论] 【装逼篇】脚本开发中的人工智能实现------有限状态机原理

  [复制链接]
发表于 2013-10-6 06:23:07 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
麻码说标题越长越牛P,而且还要人看了似懂非懂才够噱头其实是冷月很久没有发帖了,实在是手痒得厉害......

首先贴一段百度来的原文:
  1. 一、状态机描述
  2. 状态机理论最初的发展在数字电路设计领域。在数字电路方面,根据输出是否与输入信号有关,状态机可以划分为Mealy型和Moore型状态机;根据输出是否与输入信号同步,状态机可以划分为异步和同步状态机。而在软件设计领域,状态机设计的理论俨然已经自成一体。Moore型状态机的输出只和当前状态有关,和输入无关,如果在软件设计领域设计出这种类型的状态机,则该状态机接受的事件都是无内蕴信息的事件(输入)。Mealy型状态机的输入是由当前状态和输入共同决定,对应到软件设计领域,则该状态机接收的事件含有内蕴信息,并且影响状态机的输出。显然,这种划分在软件设计领域毫无意义。虽然软件设计领域的状态机也有同步和异步的划分,但和数字电路方面的同步异步已经不同。
复制代码
  1. 二、状态机分类(后文中如无特别说明,则状态机指软件设计领域的通用有限状态机)
  2. 依据状态之间是否有包含关系,分以下两种
  3. (1)常规状态机。状态机中的所有状态是不相交的、互斥的。
  4. (2)层次状态机。状态机中的状态之间要么是互斥的,要么是真包含的,可以用树性结构来描述这些状态集,包含其它状态的状态称为枝节点,不包含其它状态的状态称为叶节点,为方便单树描述,总是设计一个状态包含所有的状态节点,称为根节点。状态机的状态只能停留在叶节点,而不能停留在枝节点,每个枝节点需要指定一个子节点为它的默认子节点,以便状态机进入枝节点的时候能够停留到叶节点。
复制代码
  1. 三、状态机实现
  2. (1)switch/case if/else方式实现。用于少量状态(3个及其以下)的时候,不需要引入专门的状态机模块。这种方式不能编写通用的状态机模块,不再多说。
  3. (2)面向过程方式:宏是实现面向过程方式的通用方式。虽然在状态机层面还是可以用面向对象的方式封装,这里还是把它称为面向过程的方式。
复制代码
蒙圈了吧,其实冷月也蒙圈了,还有英文版的,冷月看不懂英文就不发了......

有人要问了,这玩意有什么用?

为什么别人的脚本执行很流畅不会卡住?为什么别人的脚本速度快?为什么别人的脚本全自动?为什么别人的脚本...比我的好?

好吧,以前我们可以说是别人的项目框架设计合理,流程控制逻辑性强,代码风格严谨......等等等等,现在,我们可以很牛13的说一句,那是别人的状态机设计得好!

其实冷月认为吧,我们这些玩儿游戏脚本的所谓全智能零人工并没有多复杂(相比游戏引擎来说)

以冷月的浅薄认识归纳起来不过是以下几点:

一 数据采集
1 界面数据采集(脚本界面控件的数据采集,合理的控件设计,在完善和操作性之间的平衡是必须要把握好的)
2 文件数据采集(文本文件和配置文件是最常用的,通常用来保存数量大的数据)
3 游戏数据采集(游戏里的各类数据,一般通过图色获取或者内存读取)

二 数据处理
1 全局变量(全局变量通常是作为流程控制使用,不建议用来保存采集到的各类数据)
2 字符串(任何数据都可以转换为字符串输出,灵活的使用各种字符串处理方式是至关重要的!)
3 条件(利用采集到的数据,设置合理的条件,才能实现我们想要的效果,也就是各种表达式)

三 流程控制(以树形结构描述)
1 根节点 也就是事件功能,T语言中流程的起始点就是事件功能.通常会在事件功能中通过采集到的数据使脚本执行不同的主功能(比如主线,采集,副本,打怪,吃药等等等等)
2 枝节点 也就是主功能,包含功能ID和操作列表(功能ID只有用在多开的情况下),通过采集到的数据进行条件的判断从而执行不同的操作功能(比如图色,键鼠,内存读写等等)
3 叶节点 也就是操作功能,包含功能ID,默认操作,后续操作,返回值(通常数据的采集都是在操作功能里完成的,返回值是反馈给流程控制的重要数据)
其中,整个流程控制最核心的就是枝节点---主功能(智能不智能就看它了)
主功能的基本结构为:
1)进入操作
2)错误处理
好吧,前面说了这么多其实都是为了这个做铺垫......
1. 数据错误处理(包含了采集数据错误,比如文字识别错误,找图找色找字错误,还有数组下标越界,坐标越界等等)
2. 操作错误处理(比如因为延时造成的键鼠操作无效,或者各类操作超时,比如游戏卡屏,人物卡位(走不了),卡怪(打不死),卡物品(捡不到),等等)
3. 状态错误处理(比如窗口位置移动,遮挡,人物被PK,死亡,物品消耗,装备持久度等等)
3)退出操作
最后,很多人忽视的细节就是这个退出操作.
所有的功能流程最终必须执行一个退出操作,所有的操作功能必须不存在死循环!!!

好吧,其实说白了就是细节决定成败.想要脚本稳定,错误的处理就要严谨.想要脚本速度快,就要注意操作的方式和流程的优先级.想要脚本全自动,功能就要完善.
就拿一个简单的打怪功能来说(不考虑其他状态):
功能参数:功能ID,默认操作死循环,默认数量无限,默认怪物名称不限
1 判断操作,如果操作不为死循环执行2,否则执行3 (进入操作)
2 判断任务数量,如果任务完成执行9,否则执行3
3 判断是否选中怪,如果选中怪执行4,否则执行5
4 判断怪物名称,如果符合条件执行6,否则执行5
5 判断是否超时,如果超时执行9,否则按TAB键(选怪),执行3(超时错误处理)
6 发动攻击,执行7
7 判断怪物是否死亡,如果死亡执行1,否则执行8
8 判断操作是否超时,如果超时执行9,否则执行6 (超时错误处理)
9 根据功能执行状态返回完成或者超时的标记数据(退出操作并返回数据)

那么如何用T语言去实现这个功能的流程,就看你对T语言基础语法的掌握程度了,越熟悉基础语法实现起来越简单!!!

冷月的砖就抛到这里,难得发个贴,希望大家都来参与讨论,分享自己的经验.


篇外话:
其实,目前的后台脚本游戏数据的采集靠的还是各类插件(无论图色还是内存)
那么我们能用TC做些什么呢?
1 界面设计(学习要点:控件事件结合控件API的应用技巧)
2 字符串处理(学习要点:熟悉所有字符串API,以及灵活配合应用)
3 流程控制(学习要点:熟练掌握T语言基础语法中的流程控制语句,运算符与条件表达式)
游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

发表于 2013-10-6 07:03:40 | 显示全部楼层
装的真够大!把你QQ留到百合了,给你挂了个高富帅的帽子,看看有没有如花联系你~

不过内容还不错,建议贰陌,清风他们也来点!
回复 支持 反对

使用道具 举报

发表于 2013-10-6 08:11:48 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2013-10-6 08:32:22 | 显示全部楼层
何为学问?且看楼主!
回复 支持 反对

使用道具 举报

发表于 2013-10-6 09:01:38 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2013-10-6 09:10:44 | 显示全部楼层
装的真够大!把你QQ留到百合了,给你挂了个高富帅的帽子,看看有没有如花联系你~

不过内容还不错,建议贰陌,清风他们也来点!

TC兔子 发表于 2013-10-6 7:03:40

喜闻乐见
回复 支持 反对

使用道具 举报

发表于 2013-10-6 10:28:24 | 显示全部楼层
貌似很高科技的样子
回复 支持 反对

使用道具 举报

发表于 2013-10-6 10:38:17 | 显示全部楼层
看看那啊啊啊
回复 支持 反对

使用道具 举报

发表于 2013-10-6 10:49:15 | 显示全部楼层
这是基础理论了。看一下
回复 支持 反对

使用道具 举报

发表于 2013-10-6 11:38:13 | 显示全部楼层
111111111111111111111
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-10 12:50 , Processed in 0.038319 second(s), 22 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表