c语言中的mysql可视化决策结构#

mgdq6dx1  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(403)

我想弄清楚这事已经有一段时间了。多次搜索都没有发现什么,所以我希望能得到帮助。我对c#有很好的理解,但我对结构或如何用最好的方式做事经验不足。我目前正在与一个团队合作开发我的第一款独立游戏,作为他们的首席程序员,因为我几乎获得了游戏编程学位,并且取得了很好的进展。我们正在unity中制作一部视觉小说(我主要想用if来制作艺术/声音资产和处理场景),在我需要开始为玩家实现决策结构之前,我已经尽可能地使用代码了。
现在我找到的大多数教程或指南都说一个简单的switch或if/then语句就可以了。问题是,在一个较长的游戏与多个时间表,我不知道这将是多么有效。例如,有些决策可能不会被击中,或者在不同的时间被击中。这给需要一个以上决定才能达成的对话路线带来了问题。如果玩家选择左走,打开一扇门,右走,踢过一个桶,我会有4个独立的变量吗?
这很难解释,因为我不太清楚这些决策结构通常是如何设置的,我读到的每一篇文章都显示了一个问题的简单陈述和结果场景,或者只是说使用一个视觉小说引擎。我希望在将来的某个时候扩展到一个点击游戏。所以我的主要问题是,我将如何构建一个存储和处理方面的决策树?到目前为止,我最好的猜测是存储一个结构或对象列表,每个对象都是一个决策,在其中存储以前的需求。这也意味着为了选择对话框,程序将从第一个连接(对象链接到对象)跳下树。
我可以设置一种存储特定选项的方法吗?树越复杂就越难。例如,如果你走的是一条能让你做出100多个决定的路,那么对话选项就会越来越长。我错过了什么?
我想我可以存储每个包含a、b、c或d的枚举数的决策。左题或右题只能用a和b来表示。但是,如果您有一个对话框选项,它需要一个枚举器,它最终会像这样。
kyle:choicehallway:1:choicedoor2:“欢迎来到左边走廊的门!”;
我想除非你沿着第一个走廊走,否则门是不可能到达的,但是我觉得如果你假设除非你这样做,否则什么东西是不可能到达的,这可能会给你的选择带来问题。有没有更好的办法?
我应该注意到我现在正在使用mysql数据库来存储对话框。我已经有进出口工作,只是没有处理它。

ca1c2owp

ca1c2owp1#

从游戏开发的Angular 来看,我想很容易地操纵变量/条件要求,例如任务或关卡等。
我建议使用由可脚本化对象组成的需求集合。可以将它们存储在对象中,以便在检查器中轻松地进行操作。
您可以创建一个名为“kick the bucket”的决策。

[CreateAssetMenuAttribute(menuName = "Decision")]
public Decision : ScriptableObject
{
   public string Name;
   public DecisionState State; // Use an Enum with states "Inactive" "Completed", "Failed", "Unavailable" etc.
   // Other variables that may be relevant, like score or whatever   
}

你可以在游戏开始时将状态设置为默认状态。然后,当你选择踢桶,标志它到任何状态,你想要的。
然后,您可以提出需求,接受决策和所需状态。

[CreateAssetMenuAttribute(menuName = "Requirement")]
public Requirement : ScriptableObject
{
   public Decision Decision;
   public DecisionState State;
}

现在,在您的房间、章节或任何脚本中,您可以附加一个执行任何逻辑所需的需求列表。您可以运行checkrequirements方法来查看是否满足所有要求。

public Room : MonoBehaviour
{
   public List<Requirement> Requirements;

   public bool CheckRequirements()
   {
      foreach (var requirement in Requirements)
      {
         if (requirement.Decision.State != requirement.State)
         {
            return false;
         }
      }
      return true;
   }
}

我喜欢这种方法的原因是,您可以轻松地创建新的决策和需求,然后将它们拖放到检查器槽中。所以当你在游戏流程中有了变化,你可以简单地添加或删除一个决定/需求。
编辑:
有点时间和想法。。。
为了使它更加设计友好,您还可以集成unityevents,在进入房间并为您设置某些决策时发生火灾。

public Room : MonoBehaviour
{
   UnityEvent OnRoomEnter;

   public void OnEnable() // Or whatever function you call when instantiating a room
   {
      OnRoomEnter();
   }

}

然后考虑以下几点

public GameManager : MonoBehaviour
{
   public void SetDecisionToActive(Decision decision)
   {
      decision.State = DecisionState.Active;
   }

    public void SetDecisionToInactive(Decision decision)
   {
      decision.State = DecisionState.Inactive;
   }
   // etc...
}

你现在可以将你的游戏管理器拖放到unity中一个“房间”单行为对象的事件槽中,选择一个方法,然后将你创建的一个决策拖到它的参数槽中。

kuhbmx9i

kuhbmx9i2#

只是一个小小的回答。希望这能帮到你。据我所知,你需要一个抽象的解决方案,而不是在每一个语句中都有其他的解决方案(https://i.stack.imgur.com/nvpih.jpg) ,使路径和设置像isinroomvariable=true和你的对象,这将显示你从哪里来,甚至函数你能做什么,当你在左室或右室

wsxa1bj1

wsxa1bj13#

听起来你在寻找一个有限状态机。我不会试图用一个状态机来表示整个游戏,而是将事物分解(例如,分成“章节”或类似的内容),每个章节都有自己的状态机,而“章节”的集合将是一个状态机本身(例如,如果你已经完成了第2章和第3章,你只能过渡到第4章,但你可以在完成第1章后过渡到第2章或第3章,以此类推)。
这是我在“普通”c#项目(即不是unity)中使用过的,但它应该与unity一起使用,而且设置起来非常简单:https://github.com/masstransit/automatonymous. 另外,看看文件中的“传奇”。虽然不直接适用,但它们将为您编排多个状态机提供一些指导。

相关问题