3

私の質問は、スケーラブルなロジックの分岐についてです。

Javaで論理ツリーの分岐を行うエレガントな方法はありますか(ただし、ルートシステムのように見えると常に思っていましたが、それは重要ではありません)。研究のサイド プロジェクトとして、非常に単純なテキスト ベースのアドベンチャー ゲームを開発しようとしていますが、これらの大規模なロジック システムをナビゲートするための最善の方法がわかりません。

私が現在試しているのは、stage、location、step、choice の 4 つの値を保持する配列です。

[編集 - ユーザーの選択を保存するための選択変数を追加し、後で混乱しないように、コード内の実際の名前を反映するように名前を変更しました]

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

ステージは、ツリーの単一の主要部分を表すと想定されています。場所は、ツリー内の私の場所を表すことになっています。ステップは、特定の場所での進行状況を表すことになっています。選択はユーザー入力です

現在、1 本の木しか扱っていないため、ステージはあまり使用されていません。場所とステップはうまく機能していますが、ステップ内で決定を下すたびに、システムが故障します。

より多くの変数を作成して、ツリーのより深いレイヤーを表現することもできますが、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 を開始するメイン クラス userInput、userOptions、および outputArea の 3 つのサービスを提供する GUI クラス。

現時点で私の問題のロジックを処理する DecisionTreeStage1 クラス (switch ステートメントを使用)。DecisionTreeStage1 クラス内で自分の位置を追跡するように設計された LocationTracker クラス ユーザーが持つオプションを変更し、ユーザーのアクションの結果で出力フィールドを更新する DialogueToOutput クラス。

特別な関心事項: ある時点で複数の決定分岐と 1 つのメイン ツリー (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 を更新するだけです) 別の分岐パスにつながる場合はどうなりますか? そして、それは別の分岐経路につながりますか?最終的には、次の「ステージ」に移動できるように、すべてのパスを同じ場所に収束させたいと考えています。

私の本当の望みは、この問題を無限にスケーラブルにすることです。毎回 decisionPoint 配列に静的で任意の数の変数宣言を作成する必要なく、必要なだけ 1 つのブランチに深く入り込みたいと考えています。

私が言ったように、私はこれについて多くの情報を見つけることができませんでした。

この質問を提示してみましょう: 次以外の分岐論理ステートメントはありますか?

if(something)
    stuff;
else
    otherStuff;

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

もしそうなら、それらは何ですか?

PS - Java の 3 項 if ステートメントについては知っていますが、私がやっていることには役に立たないようです。:)

4

2 に答える 2

3

Java では、C で構築できるツリーと同様に、通常のツリー構造を構築できます。オブジェクト参照が理論的にポインターであるかどうかに関係なく、ツリー構造では適切にポインターに置き換えられます。

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

グラフ (巡回グラフを含む) とリンクされたリストを問題なく作成することもできます。大きな構造体に問題がある明確な理由はありません (オブジェクト参照がメモリを使用することを除けば)。

于 2013-03-02T14:31:47.327 に答える
0

値を返す代わりに、Callable実行する必要がある を返すことができます。これは連鎖することができます(理論的には無限に)

LocationEvaluationたとえば、を返すことができ、次にまたはまたはそのようなSpecificLocationEvaluatorもののいずれかを返すことができます。これらはすべて Callable インターフェースを実装します。StepEvaluationChoiceEvaluator

方法によっては、LocationEvaluation が常に SpecificLocationEvaluator を返すように厳密な型チェックを行うか、ジェネリックにすることができます。その後、任意の順序で連鎖させることができます。

構造を構築すると、基本的に、それを解決するためにトラバースされるツリーができます。

より具体的な実装の詳細を提供できるほど問題を十分に理解していません-分岐の一部(つまり、上記のクラス/ステップの名前)を誤解していた場合はお詫びします

于 2013-03-02T16:47:16.487 に答える