创建AI的新手-从哪里开始?[关闭]


58

我是游戏编程的新手,正在尝试制作一款基本的2d自上而下的太空游戏,其中包含2艘相互竞争的太空船。我在用户控制的太空飞船上做得很好,但不知道如何开始编写AI。某些方法/模式是否适合这种情况?我什至要从哪里开始?


1
这是我从我的课程中学
Jari Komppa,

4
if语句。其中很多。
deceleratedcaviar

Answers:



27

如果这是您第一次开发AI,那么您不必担心状态模式,行为数学之类的问题,甚至不必为该主题准备一本书。

您可以从字面上摆脱这样的事情:

if( targetInRange == true )  
{
    FireAtTarget();
}
else if( bulletComingTowardsMe == true )
{
    MoveAwayFromBullet();
}
else
{
    WanderAroundAimlessly();
}

使AI正确的主要方面是通过思考角色希望角色具有哪些行为以及如何实际实现这一目标。因此,对于一个基本的太空飞船敌人来说,我想它可能会采取以下行动:

  • 四处走走
  • 逃跑

这些动作什么时候会发生?

  • 四处走动-无事可做
  • 火-当我发现敌人时
  • 逃跑-当我健康状况不佳/当我着火时/等等

由于角色可以进入的“状态”数量少而完成此操作后,可以使用简单的if语句,例如上面的语句。然后,我建议您查看“转向行为”,因为这些是非常简单的实施行为,可导致看起来非常好看的运动。

可以在这里找到更多信息:http : //www.red3d.com/cwr/steer/
我肯定会推荐Mat Buckland的《Programming Game AI By Example》一书,尤其是在您入门之初。

当您真正适应这些条件时,我建议您查看状态和策略模式。

重点是从小而简单开始。不用担心所有这些术语,每个人都会四处搜寻FSM,设计模式等等。首先设计和构建,然后担心如何使用现有方法或标准进行改进。

希望有帮助!


@Fuu为编辑伙伴欢呼:)
Ray Dey

9

您可能需要查看OpenSteer以及随附的“ 转向行为”文档。源代码不是初学者级别,但是源代码背后的概念应该为您提供一些好主意。


人们在游戏中使用opensteer还是更多用于模拟?
jle 2010年

我至少正在尝试在开发中的游戏中使用它。到目前为止,对我来说效果很好。我相信作者在Sony的Playstation小组工作时开发了很多内容-很有可能使它融入了一些游戏中。MobyGames将他列为JohnMadden Football的代言人,也是休闲装Larry游戏之一。
AShelly

FreeOrion在其战术战斗引擎中使用了OpenSteer。
Mike Strobel

1
+1对于提及opensteer。如果您想看到一些将非常简单的行为组合在一起以形成看起来非常非常复杂的东西的好例子。检查转向行为!Google,“ Boids”,看看一些很酷的用法。这并不是您想要的安静,但是它会告诉您,简单带来复杂性
daydayitmake

9

您可能想看看Strategy设计模式。基本上就船只的行为写出相同的基本策略:

  • 靠近目标
  • 攻击目标
  • 逃离目标
  • 走向大功率
  • 使用电源UPS

然后,您将使用逻辑(状态机)在这些策略之间进行选择。例如:如果船上的护盾降到了50%以下,则远离目标,朝着电源提升/治疗用品等方向移动。


1
因此,每次通过游戏循环时,它都会决定优先考虑哪些“策略”,然后执行?
2010年

@jle差不多。因此,您的每种策略都将分解为自己的类,从而使代码井井有条。
布赖恩·丹尼

7

我可以建议您买Ian Millington的《游戏的人工智能》一书-太好了!:) http://www.ai4g.com/

源代码位于Github-MIT许可下。

当然,如果您不使用C / C ++,那么这可能不太重要。

但是,对人工愚蠢/智能世界的介绍确实很棒。

您将需要的是转向和状态机。对于初学者。


2

如果您要使用状态机,请提供一些实用建议:当心大状态。

具有“逃逸”状态的诱惑很诱人,该状态可以处理要逃离的位置,设置高目标速度,清除所有目标等情况。最好有许多状态机,每个状态机都处理一个或几个船舶控制,例如处理目标位置的状态机,处理枪支的状态机等。

这看起来很愚蠢,因为您必须向每台机器添加逃逸状态,但是由于只限于一个或两个输出,因此状态最终很小,所以这不成问题。

另外,由于现在每个控制都在单独的控制下,因此您最终可以选择逃跑目标位置,同时仍然让攻击状态控制您的枪支。您可以在冷却液泄漏的情况下空袭敌人,同时仍然节省发动机功率。您可以在避免对策的同时转向以避免碰撞。使用单个无所不包的状态机,所有这些都是不可能的。



1

如何创建AI是一个棘手的问题,因为它包含许多部分:

  • 您可以为AI选择一个通用的架构/范例。它基于脚本吗?它会使用计划吗?它是简单的FSM还是您更喜欢BT?
  • 然后,您将这些范例与特定的实现/工具集一起应用。
  • 现在,您剩下了游戏设计的选择,因为您必须考虑架构将使用的行为。

其他海报推荐了好书,我也喜欢jacmoe推荐的AI4Games,尽管它在部分内容上非常通用(例如很多书,这当然是可以理解的)。

当然,每种类型的游戏都有其特定的需求,街机/射击游戏不需要复杂的架构即可支持有趣的游戏玩法。简单的操纵库就可以作为行为的基础,然后为各种类型的敌人添加详细信息(有些可以定期射击,有些可以通过预测玩家的移动来射击,有些可以面对敌人转弯,有些可以协调他们的攻击等)。

  • 我认为学习游戏(AI)编码的最佳方法就是看好的运行代码。因此,探索ohloh.net和github并寻找现有的FOSS项目!
  • 当然,你可以选择困难的部分,发挥现有的(但简单)的游戏。尝试对行为进行逆向工程,然后思考“我将如何设计?”。当然,提示总是有帮助的,这可能就是为什么您在gamedev.SE上问过!
  • 两者之间的隔is就是GameMaker论坛中现有的射击游戏!您可以找到许多简单的脚本来解决问题!;)

1

想想您在玩游戏时会做什么。问自己一些问题。

  • 需要什么信息才能做出决定?
  • 我什么时候应对变化?
  • 在这个特殊的比赛中,我的“长期”目标是什么?

然后,我要做的就是让AI在比赛场地上查看并列出AI根据这些问题可能做出的动作或动作。我用“聪明因素”对这些动作进行排序和排序。然后,就像基于随机性和玩家在游戏开始时选择的难度级别的某种组合来选择并执行动作/动作一样简单。

然后,在500毫秒后,我再次执行此操作。

它没有任何学习能力或其他任何东西,但是经过足够的调整它可以说服自己,这一切真的很重要

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.