AI人工智能能在今年是一个非常火嘚方向当然了。不不过今年它一直火了非常多年,有关AI人工智能能的一些算法层出不穷AI人工智能能在非常多领域都有应用,就拿我熟悉的游戏领域来说吧一些寻路算法,比方说A*算法(我的就以前使用了A*算法进行寻路)另一些高级的算法,比方说决策树等都在游戲中得以了广泛的应用。我眼下想制作的项目和AI人工智能能也有一定的关系因此。我这个月開始学习搭建一些简单的AI人工智能能框架
Qt為了更加方便地在既有的GUI界面上增添更加复杂的逻辑,在4.6的时候引入了有限状态机这个概念有限状态机指的是以限定个数的状态进行相互转换,而形成的一种有机的总体它在游戏中用得或许多,我曾经在制作游戏项目的时候也见过自己制作有限状态机来处理复杂逻辑的因此我開始又一次拾起有限状态机,看看能不能更深入地挖掘它的内容
Qt的文档非常丰富,在介绍有限状态机的时候甚至专门有一个章節叫做“The Declarative State Machine Framework”,来介绍它的使用方法假设大家还对QML的有限状态机不是非常熟悉的话。还是看看这篇Qt帮助文档吧!
Qt的有限状态机分为两個重要的内容。一个是“State”指的是详细的某个状态,另外一个则是“Transition”指的是两个状态之间的详细的转换。我在使用的时候发现QML提供的有限状态机。仅仅提供了SignalTransition以及TimeoutTransition这种转换并没有像Qt那样提供非常多有用的Transition。刚開始尝试简单的时候认为还好,可是想到以后的状态機异常复杂一旦涉及到的状态千变万化,就可能要写非常多的状态实在是不方便。我拿我正在制作的项目打例如吧:
上图是一个很easy的囿限状态机它仅仅有入口,没有出口而且仅仅有三个状态。除了初始状态s1之外仅仅是在s2和s3之间做切换。在图中方框表示状态,箭頭表示一个转换(transition)那么不包含開始那个箭头。我们这里总共出现了6个状态也是3×2个状态。
用QML代码表示的话是这个样子:
onEntered: output( "我刚来到這个世界,还不太懂人类的语言可以教教我吗?" )
这不过针对一个最小可运行的有限状态机而言诸如Galgame这种游戏,它的分支情况是许多的并且假设知道乘法原理的话,当x和y很大的时候产生的转换(Transition)的个数也是很惊人的。
究其原因是由于SignalTransition必须依附于State类作为它的sourceState。因此峩们必须想办法缩小规模才行
因此我在研究Qt的有限状态机机制。幸运的是在强大的Qt下。有限状态机的各个部分也是能够定制的QState的祖先类是QAbstractState,QTransition的祖先类是QAbstractTransition它们都是一定规模的抽象类,我们是须要实现它们的少数方法就能够结合Qt的有限状态机做自己的处理了。于是我淛作了一个名为AIState的状态类它的作用是:
1、 保存它所发出的全部转换(Transition)的引用。当此状态激活时统一让全部转换都为它服务。
相同地我制作了一个名为ConditionalTransition的类,它有下面几个特性:
1、 能够设置sourceState让其与State脱离父子关系,即能够定义在不论什么须要的位置
2、 提供触发的条件属性;
3、 向状态机发送自己定义的事件。
// 仅仅同意状态机正在执行而且源状态被激活的向状态机发送事件 // 假设当前条件为真而且源转換为其本身,那么通过执行转换
红色代表的是处于激活的状态,绿色则是处于激活的状态所拥有的转换结合上面的QML代码我们能够知道,程序中总共仅仅定义了两个转换而且转换定死的是targetState,而不是绑在了sourceState上这么做能够把状态和转换进行解耦。
比曾经的实现少用了四个轉换假设有限状态机大起来了。这种效率提升是很可观的
版权声明:本文博主原创文章,博客未经同意不得转载。
}