Android Jump游戏:AI根据规则集生成关卡

use*_*120 1 android design-patterns game-engine

我正在制作像涂鸦跳跃这样的Android游戏.到目前为止,我随机创建每个级别,使用我想要的不同类型平台的百分比:

FE

  • 1级:100%稳定的平台
  • 2级:80%稳定平台,20%打破平台
  • X级:40%稳定,10%稳定但跳跃后溶解,10%稳定但移动,20%断裂,10%爆炸,10%垂直移动等

现在,我创建了各种适当的数量,随机播放,然后我遍历列表以捕捉任何不一致.就好比如果有两个突破平台,我不能从一个跳到另一个.我还在平台上放置物体以跳得更高.如果有一个对象,则以下平台应该更远.

这一切都有效,但它只是被黑客攻击在一起,并且我想要添加的内容越多越复杂.

有没有办法用AI解决这个问题?我可以拥有一套规则的东西,它会生成一个遵守这些规则的随机平台/对象组合?有人能指出我正确的方向吗?

编辑

我没有看到状态机解决方案工作的一个案例是,当我创建阵型时:稳定,破裂,稳定并且我无法从1到达平台3.然后我将不得不在平台1上添加弹簧但是在创建时第一个平台我对下一个状态一无所知.有任何想法吗?

假设我处于一种状态并且有3种不同的转换选项:在我的情况下,转换是什么?我是否必须随机选择下一个州并检查这是否是一个选项(根据我的百分比)?

@Carlos:你说:"对象的集合,可以按类别排序,因此规则可以是面向类别的".你是什​​么意思?

Car*_*les 5

关于对象生成,肯定你必须改变你的方法,因为控制器中的模型逻辑太多了,更重要的是,因为逻辑可能会改变,你会变得疯狂地改变它并再次测试一切.

我会做的是一个充当对象工厂的类.在其中,您将拥有一个状态机,即一组代表当前状态的变量,以及一系列定义接下来会发生什么的规则.

在第一种方法中,考虑您的平台,我会:

  • 一个init函数,它接收一些值,例如你需要的对象类型,以及每个值的多少(绝对值的比例,如你所愿)
  • 对象的集合,可以分类,因此规则可以是面向分类的*(见下文)
  • 一种标志和变量,定义模型的限制,例如,考虑你提到的
    • 这是最后一个对象或其类别
    • 什么是当前距离(对象数量,px或任何你需要的)到每个类别的最后一个对象(所以我们可以检查何时对距离有一些限制)
  • 表示对象之间关系的表,例如:
    • 之后一个,它不是alowed 一个
    • 之后,不允许那个,至少这个距离
  • 接收请求的函数,考虑来自标志和关系的限制,提供有效对象,更新标志,并将该对象标记为已提供服务.如果没有任何物体,也不要提供任何物品.

因此,当你构建世界时,你不需要创建一个随机数组然后用硬编码逻辑对所有内容进行排序,而是要求工厂自己初始化,然后在循环中,你继续要求下一个对象,您确定它是有效的.

然后,如果更改或添加新逻辑或限制,则只需更新已有的结构,添加或修改条目.

更重要的是,你可以尝试构建一个人类可读的文件,比如xml,你可以在其中定义对象的集合,以及它们之间的限制性关系,然后构建一个引擎来解析它并将其转换为java数据结构,所以你可以以非常友好的方式改变这种逻辑.

有了这个,您可以构建一个真正可扩展且易于维护的代码.

更新:

当你有一个可能需要修改的对象取决于下一个对象时,你可以用两种方式来支付它(首先我想到):

  1. 从最后一个平台开始,然后向后退.由于你跟踪完整的历史,你知道平台n是稳定的,n-1是破裂的,因此n-2必须在弹簧稳定.当然,您必须找到一种方法将此规则放在任何类型的表中,因此您可以使用其余规则自动化它.我建议用纸做.
  2. 其他可能的事情是你服务的对象,而不是一个接一个,但当有理由怀疑你将依赖于下一个时,可能会持有一些.但这将是棘手的,你可以变得疯狂.

当你设计规则时,你发现大多数事情是允许的,不要让自己复杂化:你可以创建规则作为例外列表,我的意思是,下一个状态可以是任何一个,同时没有在你的规则表中,除了明确禁止它之外.此外,您可以混合使用这两种规则.例如,如果对于一种对象,一切都被允许但只有一件事,你可以将该规则放在禁止的事物表中.如果对于其他元素,相反,几乎所有内容都被禁止,您可以将允许的内容放在允许的事物表中.这样,当你打算为下一个服务时,你会看到当前状态,然后检查两个表:

  • 如果禁止的东西表中有任何东西,你选择的东西不在那里.
  • 如果允许的事物表中有任何东西,你选择那里的东西.
  • 如果任何表中没有任何内容,您可以选择任何内容.

如果您有多种可能性,则选择任何可用对象.请记住,您根据百分比在开头生成了完整的集合,因此您在此时选择的任何一个集合也将完成您的基数规则.

此外,请记住,这可能会导致最终阻塞情况:当您接近结束时,因此您没有剩余的对象,可能您会发现没有任何一个可用对象有效.此时你可以决定

  1. 简单地丢弃最后一个元素(如果它不重要,可以说,49或50个平台)
  2. 或者你可以把它们发送到控制器,这样它就可以把它们放在其他的中间(我不推荐这个,因为你会重复逻辑),
  3. 或者您可以更改服务对象的方式:将它们保存在工厂中,直到构建完所有内容,这样您就可以插入其余对象,然后返回完整列表
  4. 将剩余的对象更改为该点的其他允许类型,可能是一些更中性的元素.

*关于我何时说

"对象集合,可以按类别排序,因此规则可以是面向类别的".

我的意思是你可以拥有与特定对象相关的规则

  • 你有一个对象是"水平移动的平台",另一个是"垂直移动的平台".它们是不同的对象,您可以设计一个规则,例如:在水平移动的平台之后,不能成为爆炸平台.这是一个涉及对象的规则.
  • 而且,"水平移动的平台"和另一个"垂直移动的平台"都可以被认为是一个类别的一部分,让我们说"移动的平台".并且您可以制定涉及类别的规则,例如"在爆炸平台之后,不能成为移动的平台".
    • 当然,您可以设计规则对象 - 对象,类别 - 类别或对象 - 类别.
    • 另外,请记住,类别不需要是在现实世界中有意义的东西,它们可以像你想要的那样任意.例如,您可以定义一个名为"疯狂平台"的分类,其中包括爆炸和移动平台,或者您可以创建一个名为"类别1"的类别,其中包含"移动垂直和破坏",因为任何符合您需求的原因.

此外,请记住,您需要太多不同的东西:一个是我描述的对象工厂,以生成一个有效的世界(因为它是您主要关心的),但是您需要一个完全不同的系统来表示应用程序生命周期,如Junior Buckeridge描述如下.


所以,总而言之,我知道所有这些看起来都像是疯狂,但我可以说,对我来说,你处于任何可能发展的一个更有趣和最有趣的部分之中.毕竟,当你把所有东西放在一起时,你会看到你想象的世界,就像魔法一样!