2

次の状態図があります。ネストされていない状態間を遷移する単純なステート マシンを作成する方法を知っています。ただし、ネストされた状態間を遷移する方法がわかりません。誰かが適切に高いレベルでこれを行う方法を説明できますか (つまり、特に寛大に感じない限り、コードを書く必要はありません:P)。

モデルにしたいもの [修正、提案に基づいて]

状態図: 実装しようとしているもの

実装方法を知っていること (以下のコード)

状態図: これを実装する方法を知っています

public class MyState : State // State enumeration
{
    public static MyState A = new MyState("State A");
    public static MyState B = new MyState("State B");
    public static MyState C = new MyState("State C");
    public static MyState D = new MyState("State D");
    public static MyState E = new MyState("State E");
    public static MyState F = new MyState("State F");
    public static MyState NEUT = new MyState("Neutral");
    public static MyState P = new MyState("P");
    protected MyState(string name) : base(name) { }
}

public class MyEvent : Event // Event enumeration
{
    public static MyEvent X_POS = new MyEvent("X+");
    public static MyEvent X_NEG = new MyEvent("X-");
    public static MyEvent Y_POS = new MyEvent("Y+");
    public static MyEvent Y_NEG = new MyEvent("Y-");

    protected MyEvent(string name) : base(name) { }
}

// State Machine implementation
public class MyStateMachine : StateMachine<MyState, MyEvent>
{
    public MyStateMachine() : base(MyState.P) // MyState.P = initial state
    { // Set up the transition table
        // P
        this.addTransition(MYState.P, MyState.NEUT, MyEvent.Y_NEG);

        // NEUTRAL
        this.addTransition(MyState.NEUT, MyState.P, MyEvent.Y_POS);
        this.addTransition(MyState.NEUT, MyState.A, MyEvent.Y_NEG);
        this.addTransition(MyState.NEUT, MyState.B, MyEvent.Y_POS);
        this.addTransition(MyState.NEUT, MyState.C, MyEvent.Y_NEG);
        this.addTransition(MyState.NEUT, MyState.D, MyEvent.Y_POS);
        this.addTransition(MyState.NEUT, MyState.E, MyEvent.Y_NEG);
        this.addTransition(MyState.NEUT, MyState.F, MyEvent.Y_POS);

        // A
        this.addTransition(MyState.A, MyState.NEUT, MyEvent.Y_POS);

        // B
        this.addTransition(MyState.B, MyState.NEUT, MyEvent.Y_NEG);

        // C
        this.addTransition(MyState.C, MyState.NEUT, MyEvent.Y_POS);

        // D
        this.addTransition(MyState.D, MyState.NEUT, MyEvent.Y_NEG);

        // E
        this.addTransition(MyState.E, MyState.NEUT, MyEvent.Y_POS);

        // F
        this.addTransition(MyState.F, MyState.NEUT, MyEvent.Y_NEG);
    }

    public void move(MyEvent eevent)
    {
        try
        {
            this.moveNext(eevent);
        }
        catch (Exception e) { }
    }
}

編集:問題の核心は、遷移が元のスーパーステートの現在のサブステートに依存する場合に、特定のスーパーステートのサブステートから別のスーパーステートのサブステートへの遷移をどのように説明/実装するかだと思います。私の例を使用すると、現在の状態がスーパーステート「ニュートラル」内の「P」である場合、ステート マシンをどのように説明/実装して、イベント Y+ がニュートラル スーパーステートから完全に「ニュートラルではない」スーパーステートに移行することを示すことができますか?具体的には「P」サブステートに入ります。

4

1 に答える 1

0

X 経由で移動する P、AB、CD、および EF のステートマシンを実際に作成したい場合があります。各ステートはサブステートマシンで構成されます。「メイン」ステートマシンは X トランジションを介して P、AB、CD、および EF に移動し、サブステートマシンは Y トランジションを介してニュートラルではない方向に移動します。これをさらに詳しく説明する必要がある場合はお知らせください。

于 2012-11-30T18:44:39.170 に答える