【问题标题】:Large branching trees in java?java中的大分支树?
【发布时间】:2013-03-02 10:05:22
【问题描述】:

我的问题是关于可扩展的逻辑分支。

有没有一种优雅的方法可以在 java 中进行分支逻辑树(虽然我一直认为它们看起来更像根系统,但那不是重点)。我正在尝试开发一个非常简单的基于文本的冒险游戏,作为我学习的辅助项目,但我不确定在这些大型逻辑系统中导航的最佳方式是什么。

我目前正在尝试的是一个包含四个值的数组:阶段、位置、步骤、选择。

[编辑 - 添加选择变量来存储用户选择,更改名称以反映我的代码中的实际名称,这样我以后就不会感到困惑]

int[] decisionPoint = {stage, location, step, choice};

一个阶段应该代表树的一个主要部分。 一个位置应该代表我在树中的位置。 一个步骤应该代表我通过给定位置的进度。 选择是用户输入

目前,由于我只处理一棵树,因此舞台的使用并不多。位置和步骤运行良好,但每当我在一个步骤内做出决定时,系统就会崩溃。

我可以继续创建越来越多的变量来表示树中越来越深的层,但我觉得 Java 可能在某个地方提供了更好的解决方案。

目前,我正在使用 switch 语句根据存储在 nextQuestion 中的值来确定我在程序中的位置。有更好的吗?或者,有没有办法将数组扩展到我在这里使用的数组之外,使其更具多态性(在单个问题/文本的方法中/我可以让它从一个较小的数组创建一个更大的数组吗?我可以将较小的数组作为参数传递,但将参数定义为较大的数组吗?)

//Switch example
switch(LocationTracker.getLocation()) { //start location finding switch
    case 1 : //Location 1
        switch (LocationTracker.getStep()) {//start location1 switch
            case 1 :
                location1s1(graphicsStuff);
                break;
            case 2 :
                location1s2(graphicsStuff);
                break;
         } break; //end location1 switch
    case 2 : //Location 2
        switch (LocationTracker.getStep()) {
            //same stuff that happened above
        } break;

我在网上找到的所有内容都会将我带到与我可以使用的不同在线调查创建者无关的页面。如果我可以查看他们的源代码,那就太好了,但由于我不能,我希望你们能提供帮助。 :)

[编辑]

哇,这么早在这么短的时间内做出如此好的反应!

我将尝试非常明确地详细说明我现在是如何解决问题的。值得一提的是,这在技术上确实有效,只是每次我需要在一个分支中创建一个分支时,我都必须在一个字符串数组中创建另一个变量来跟踪我的位置,实际上我只是在寻找一个解决方案'随着程序变得越来越复杂,不需要无限扩展的字符串。

现在我有一个包含 5 个类的程序: 启动 GUI 的主类 提供三种服务的 GUI 类:userInput、userOptions 和 outputArea。

目前处理我的问题逻辑的 DecisionTreeStage1 类(使用 switch 语句)。 LocationTracker 类,旨在跟踪我在 DecisionTreeStage1 类中的位置 DialogueToOutput 类更改用户拥有的选项,并使用他们的操作结果更新输出字段。

特殊兴趣点: 我想在某个时候有多个决策分支,以及一棵主树(也许称它为 Yggdrasil?:D)。目前,DecisionTreeStage1 代表一个非常孤立的系统,不打算去任何地方。我希望使用存储在我的数组中的阶段变量从一个主要分支移动到下一个(如果你愿意,可以爬树)。我目前的实现只是使用嵌套的 switch 语句来决定我要去哪里。这带来了一个恼人的限制:每次我的路径越来越深时,我都需要在我的数组中使用另一个变量来存储该数据。例如:

//Switch example deeper
switch(LocationTracker.getLocation()) { //start location finding switch
    case 1 : //Location 1
        switch (LocationTracker.getStep()) {//start location1 switch
            case 1 :
                switch(LocationTracker.getChoice()) {//Make a decision at this step based on the user choice

鉴于这个例子,如果用户的选择不只是导致一些逻辑怎么办? (在这种情况下,只是对 outputArea 的更新)如果它导致另一个分支路径怎么办?这会导致另一条分支路径吗?最终,我希望所有路径都汇聚在同一个位置,这样我就可以进入下一个“阶段”。

我真正的希望是让这个问题无限扩展。我希望能够根据需要深入到一个分支,而不必每次都在我的决策点数组中创建静态和任意数量的变量声明。

正如我所说,我无法找到有关此的太多信息。

让我试着提出这个问题:除了:

之外,还有其他分支逻辑语句吗?
if(something)
    stuff;
else
    otherStuff;

switch(something) {
    case 1:
        stuff;
        break;
    case 2:
        otherStuff;
        break;

如果是这样,它们是什么?

PS - 我知道 Java 中的三元 if 语句,但它似乎对我正在做的事情没有用。 :)

【问题讨论】:

  • 对我来说太抽象了。你能举一个更具体的例子吗?也许它可以帮助您了解您想要实现的目标。
  • 我觉得这个问题很有趣。听起来您想找到一种优雅的方式来折叠常见的“子开关”实现。对吗?
  • 可能你必须编写递归函数。但是需要更多的细节来帮助如何做。
  • @EricJohnson 是的,这似乎是我的问题!
  • @Sylvanus - 我已经开始怀疑类似的事情,但我什至不知道从哪里开始。我开始怀疑我的数组声明是否会随着我深入兔子洞而改变,可以这么说,但是自从我使用递归以来已经有一段时间了。 :) 我也不知道递归将如何与我的 GUI 交互,但这可能只是缺乏经验。我得再考虑一下。

标签: java branching-and-merging switching


【解决方案1】:

您可以在 Java 中构建普通的树结构,类似于可以在 C 中构建的树。无论对象引用在理论上是否是指针,它们都可以很好地替代树结构中的指针:

class Node {
  Node left;
  Node right;
  Node parent;
}

您还可以构建图(包括循环图)和链表没问题。大型结构应该有问题没有任何明显的原因(除了对象引用使用一些内存)。

【讨论】:

  • 这看起来像我正在寻找的工具。显然我正在尝试做的是称为循环图,所以我会更彻底地研究它。对短语循环图的认识也将我带到了这个链接:stackoverflow.com/questions/10874024/…,它提供了一个与我想要的类似的例子,所以也许它会帮助我将来遇到同样问题的人。非常感谢@Audrius!
【解决方案2】:

您可以返回只需要执行的Callable,而不是返回一个值。然后可以将其链接(理论上是无限的)

您可以有一个 LocationEvaluation 例如,它可以返回一个 SpecificLocationEvaluator ,而后者又返回一个 StepEvaluationChoiceEvaluator 或类似的。所有这些都将实现 Callable 接口。

根据您的操作方式,您可以进行严格的类型检查,以便 LocationEvaluation 始终返回 SpecificLocationEvaluator 或者它可以是泛型的,然后您可以按任意顺序链接其中的任何一个。

一旦你构建了结构,你就会得到一棵树,它会被遍历来解决它。

我没有充分理解问题,无法提供更具体的实现细节 - 如果我误解了一些分支(即上面的类/步骤的名称),我深表歉意

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    相关资源
    最近更新 更多