java中的大型分支树?

时间:2013-03-02 10:05:22

标签: java branching-and-merging switching

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

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

我目前正在尝试的是一个包含四个值的数组:stage,location,step,choice。

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

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代表了一个非常孤立的系统,它不打算去任何地方。我希望使用存储在我的数组中的stage变量从一个主要分支移动到另一个主分支(如果你愿意,可以爬树)。我目前的实现只是使用嵌套的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的更新)如果它导致另一个分支路径怎么办?这会导致另一条分支路径?最终,我希望所有路径都聚集在同一个位置,以便我可以移动到下一个“阶段”。

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

就像我说的那样,我无法找到关于此的更多信息。

让我试着提出这个问题:除了以下还有其他任何分支逻辑语句:

if(something)
    stuff;
else
    otherStuff;

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

例如,您可以LocationEvaluation返回SpecificLocationEvaluator,而StepEvaluation会返回ChoiceEvaluator或{{1}}或其中之一。所有这些都将实现Callable接口。

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

一旦你构建了这个结构,你就会拥有一个可以遍历的树来解决它。

我不能充分理解能够提供更具体的实现细节的问题 - 并且如果我误解了一些分支(即上面的类/步骤的名称)而道歉