Android Jump游戏:A.I。根据规则集生成级别

时间:2013-12-12 22:21:26

标签: android design-patterns game-engine

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

f.e。

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

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

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

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

修改

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

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

通过这种方式,您可以构建一个可扩展且易于维护的代码。

<强>更新

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

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

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

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

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

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

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

    5. *关于我什么时候说

        

      &#34;对象的集合,可以按类别排序,所以   规则可以是面向类别的&#34;。

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

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

      另外,请记住,您需要的东西太多了:一个是我描述的对象工厂,以生成一个有效的世界(因为它是您主要关注的问题),但是您需要一个完全不同的系统来表示应用程序的生命周期正如Junior Buckeridge所描述的那样循环。


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

答案 1 :(得分:0)

我认为你取得了很好的进步,而且随着你为游戏添加“魔力”,它变得更加复杂。 根据我的经验,游戏中较难的部分是为物体,敌人和英雄设计规则。

为此,状态机图(如Mealy或Moore)应该提供您需要的东西。如果你的模型变得更复杂,或者你正在转向类似事件的编程模型,你可以尝试基于系统的马尔可夫链。

一旦掌握了这一点,你就开始构建游戏的主循环,这应该是:

  • 初始化

循环:

  • 更新英雄位置
  • 更新敌人位置
  • 更新对象位置
  • 检查碰撞英雄 - 敌人
  • 检查碰撞英雄对象
  • 检查敌人对象(如果需要)碰撞
  • 检查等级条件(例如胜利等级)

循环直到状态中断

之后你可以添加一些多线程,但我建议你先在功能上取得进步,然后提高性能。

继续。 问候。