狀態(tài)機_fsm(Finite State Machine)

一.狀態(tài)機


狀態(tài)機

二.個人理解的狀態(tài)機


個人理解的狀態(tài)機.jpg

三.自己搭建一個狀態(tài)機


搭建狀態(tài)機步驟

狀態(tài)機偷溺,管理多個狀態(tài)缘挑,每個狀態(tài)有多個動作盈简,狀態(tài)下動作的改變切換到另一個狀態(tài)
1.創(chuàng)建狀態(tài)機的管理(Manager)
using UnityEngine;
using System.Collections;

namespace SpacePlanner
{
    /// <summary>
    /// 處理用戶的一些復雜輸入烦绳,并不是全部
    /// 尤其是那些一步一步進行的操作
    /// </summary>
    public class UserInputHandler : MonoBehaviour
    {
        public bool IsRunning
        {
            get
            {
                return fsm != null;
            }
        }

        static UserInputHandler _instance;
        public static UserInputHandler Instance
        {
            get
            {
                if (_instance == null)
                {
                    GameObject go = new GameObject("UserInputHandler");
                    _instance = go.AddComponent<UserInputHandler>();
                }
                return _instance;
            }
        }
        
        FSM4InputHandler fsm;       
        void Update()//狀態(tài)機的執(zhí)行入口
        {
            if (fsm != null)
                fsm.Run();
        }

        public void StartHandleBuildWallInput()
        {
            fsm = new FSM4InputHandler();


            var tmpState = new State(fsm, "StartState");
            tmpState.AddAction(new MouseClickToStart("InBuildWallState"));
            tmpState.AddAction(new MouseMoveBeforeBuild());
            tmpState.AddAction(new MouseRightClickToStop());
            fsm.AddState(tmpState);
            fsm.curState = tmpState;

            tmpState = new State(fsm, "InBuildWallState");
            tmpState.AddAction(new MouseRightClickToStop());
            tmpState.AddAction(new MouseClickToContinue("StartState"));
            tmpState.AddAction(new MouseMoveInBuild());
            fsm.AddState(tmpState);

        }

   //     public void StartHandleBuildWallInput()
   //     {
   //         fsm = new FSM4InputHandler();
          
   //         var tmpState = new State(fsm, "StartState");
   //         tmpState.AddAction(new MouseClickToStart("InBuildWallState"));
            //tmpState.AddAction(new MouseMoveBeforeBuild());
   //         tmpState.AddAction(new MouseRightClickToStop());
   //         fsm.AddState(tmpState);
   //         fsm.curState = tmpState;

   //         tmpState = new State(fsm, "InBuildWallState");
   //         tmpState.AddAction(new MouseRightClickToStop());
   //         tmpState.AddAction(new MouseClickToContinue());
   //         tmpState.AddAction(new MouseMoveInBuild());
   //         fsm.AddState(tmpState);
           
   //     }

        public void StartHandleBuildAreaInput()
        {
            fsm = new FSM4InputHandler();
            //var tmpState = new State(fsm, "StartState");
            //tmpState.AddAction(new MoveBeforBuildArea());
            //tmpState.AddAction(new ClickToStartBuildArea("InBuildAreaState"));
            //fsm.AddState(tmpState);
            //fsm.curState = tmpState;

            var tmpState = new State(fsm, "InBuildAreaState");
            tmpState.AddAction(new MoveInBuildArea());
            tmpState.AddAction(new ClickToContinueBuildArea());
            tmpState.AddAction(new RightClickToStopBuildArea());
            fsm.AddState(tmpState);
            fsm.curState = tmpState;
        }

        public void StartHandleBuildDoorInput()
        {
            fsm = new FSM4InputHandler();

            var tmpState = new State(fsm, "StartState");
            tmpState.AddAction(new MouseMoveBeforeAddDoor());
            tmpState.AddAction(new MouseClickToAddDoor());
            tmpState.AddAction(new MouseRightClickToStopAddDoor());
            fsm.AddState(tmpState);
            fsm.curState = tmpState;
        }


        /// <summary>
        /// Alan添加的建立戶型狀態(tài)機控制
        /// </summary>
        public void StartHandleBuildUnitInput()
        {
            fsm = new FSM4InputHandler();

            var tmpState = new State(fsm, "StartState");
            tmpState.AddAction(new MouseMoveBeforeAddUnit());
            tmpState.AddAction(new MouseClickToAddUnit());
            tmpState.AddAction(new MouseRightClickToStopAddUnit());
            fsm.AddState(tmpState);
            fsm.curState = tmpState;
        }

        public void StartHandleBuildWinInput()
        {
            fsm = new FSM4InputHandler();
            var tmpState = new State(fsm, "StartState");
            tmpState.AddAction(new MouseMoveBeforeBuildWin());
            tmpState.AddAction(new MouseClickToBuildWin());
            tmpState.AddAction(new MouseRightClickToStopBuildWindow());
            fsm.AddState(tmpState);
            fsm.curState = tmpState;
        }

        //public void StartHandleBuildHandrailInput()
        //{
        //  fsm = new FSM4InputHandler();
        //  var tmpState = new State(fsm, "StartState");
        //  tmpState.AddAction(new MouseMoveBeforeAddHandrail());
        //  tmpState.AddAction(new MouseClickToAddHandrail());
        //  tmpState.AddAction(new MouseRightClickToStopAddHandrail());
        //  fsm.AddState(tmpState);
        //  fsm.curState = tmpState;
        //}

        public void StartHandleBuildPillarInput()
        {
            fsm = new FSM4InputHandler();
            var tmpState = new State(fsm, "StartState");
            tmpState.AddAction(new MouseMoveBeforeAddSpaceObject());
            tmpState.AddAction(new MouseClickToAddSpaceObject());
            tmpState.AddAction(new MouseRightClickToStopAddSpaceObject());
            fsm.AddState(tmpState);
            fsm.curState = tmpState;
        }

        public void StartSetApartmentMapMeasureInput()
        {
            fsm = new FSM4InputHandler();

            var tmpState = new State(fsm, "StartState");
            tmpState.AddAction(new MouseClickToStartSetMeasure("InSetApartmentMapMeasureState"));
            tmpState.AddAction(new MouseRightClickToStopSetMeasure());
            fsm.AddState(tmpState);
            fsm.curState = tmpState;

            tmpState = new State(fsm, "InSetApartmentMapMeasureState");
            tmpState.AddAction(new MouseClickToFinishSetMeasure());
            tmpState.AddAction(new MouseRightClickToStopSetMeasure());
            tmpState.AddAction(new MouseMoveInSetMeasure());
            fsm.AddState(tmpState);
        }
       具體分析這個狀態(tài)機的例子
       1.2個狀態(tài)"StartState"狀態(tài),"InBuildWallState"狀態(tài)
       2"StartState"狀態(tài)的三個動作MouseClickToStartMeasure堰汉,MouseMoveBeforeMeasure巷嚣,MouseRightClickToStopMeasure
       3"InBuildWallState"狀態(tài)的三個動作MouseMoveInMeasure,MouseClickToContinueMeasure楷扬,MouseRightClickToStopMeasure
       4 狀態(tài)下的動作切換到另一個狀態(tài)
        public void StartHandleMeasureInput()
        {
            fsm = new FSM4InputHandler();


            var tmpState = new State(fsm, "StartState");
            tmpState.AddAction(new MouseClickToStartMeasure("InBuildWallState"));
            tmpState.AddAction(new MouseMoveBeforeMeasure());
            tmpState.AddAction(new MouseRightClickToStopMeasure());
            fsm.AddState(tmpState);
            fsm.curState = tmpState;

            tmpState = new State(fsm, "InBuildWallState");
            tmpState.AddAction(new MouseRightClickToStopMeasure());
            tmpState.AddAction(new MouseClickToContinueMeasure("StartState"));
            tmpState.AddAction(new MouseMoveInMeasure());
            fsm.AddState(tmpState);

        }

        public void StopHandleInput() // 關(guān)閉狀態(tài)機
        {
            fsm = null;
        }
    }
}

2.狀態(tài)控制(入口)

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace SpacePlanner
{
    public static class FSM_CACHE_KEY
    {
        public static readonly string SELECTED = "SELECTED";
    }

    public class FSM4InputHandler
    {
        IDictionary<string, State> states = new Dictionary<string, State>();//所有的狀態(tài)

        public State curState;//當前的狀態(tài)
        public State GetState(string name)
        {
            return states[name];
        }
        
        public void Run()
        {
            curState = curState.OnStay();
        }

        State startState;
        public State StartState
        {
            get
            {
                return startState;
            }
            set { startState = value; }
        }

        public void AddState(State state)
        {
            if (!states.ContainsKey(state.name))
            {
                states.Add(state.name, state);
                if (states.Count == 1)
                    StartState = state;

            }
        }
    }
}

3.狀態(tài)控制(State)

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace SpacePlanner
{
    /// <summary>
    /// 用戶所處的交互狀態(tài)
    /// </summary>
    public class State
    {
        public string name;//狀態(tài)的名字
        public FSM4InputHandler fsm;//所屬的狀態(tài)機

        public State(FSM4InputHandler fsm, string name)
        {
            this.fsm = fsm;
            this.name = name;
            this.actions = new List<StateAction>();
        }

        protected List<StateAction> actions;//在這個狀態(tài)下的所用動作都保留下來

        public void AddAction(StateAction action)
        {
            actions.Add(action);
            action.SetFSM(fsm);
        }
        ____狀態(tài)機的執(zhí)行方法與切換________
        /// <summary>
        /// 處于該狀態(tài)下時需要執(zhí)行的方法
        /// </summary>
        /// <returns>下一個狀態(tài)</returns>
        public virtual State OnStay()
        {
            foreach (var action in actions)
            {
                try
                {
                    if (action.Execute() && action.nextState != null)
                        return fsm.GetState(action.nextState);
                }
                catch (System.Exception e)
                {
                    Debug.Log(e.ToString());
                    Debug.Log("狀態(tài)機執(zhí)行action異常解幽,轉(zhuǎn)到初始狀態(tài)");
                    return fsm.StartState;
                }
            }

            return this;
        }
    }
}

4.動作的抽象方法

using UnityEngine;
using System.Collections;
using System;


namespace SpacePlanner
{
    public abstract class StateAction
    {
        public StateAction() { } //沒有狀態(tài)的切換
        public StateAction(string nextState)//有狀態(tài)的切換
        {
            this.nextState = nextState;
        }
        FSM4InputHandler _fsm;
        public FSM4InputHandler FSM
        {
            get { return _fsm; }
        }
        public void SetFSM(FSM4InputHandler fsm)
        {
            _fsm = fsm;
        }
        public string nextState = null;
        public abstract bool Execute();//這個方法時核心,讓每個狀態(tài)下不同的動作重寫該方法烘苹,從而達到不一樣的效果
    }
    
  
}

5.動作的執(zhí)行方法(每個狀態(tài)下都有多個動作躲株,每個動作的具體效果的實施)

MouseClickToStartMeasure

using UnityEngine;
using System.Collections;
using System;

namespace SpacePlanner
{
    public class MouseClickToStartMeasure : StateAction
    {
        public MouseClickToStartMeasure(string nextState) : base(nextState)
        {
        }

        public override bool Execute()
        {
            var uiMgr = UIManager.Instance;
            if (uiMgr.ClickOnDrawingPanel())
            {
#if UNITY_ANDROID || UNITY_IPHONE
                uiMgr.DrawingPanel.SetAuxiliaryMeasureActive(false);
#endif
                Vector3 screenPos = uiMgr.ClickDrawingPanelData.position;
                Vector3 rwPos = TransformHelper.ScreenToRealWorldPoint(screenPos);
                Debug.Log("鼠標點擊開始測量" + screenPos + rwPos + TransformHelper.ScreenToUISpacePoint(screenPos, uiMgr.DrawingPanel.transform, false));
                //SPApplication.Instance.SendNotification(MVCNotifications.TO_C_BEGIN_BUILD_WALL, new BoolAndVec(rwPos, true));
                SPApplication.Instance.SendNotification(MVCNotifications.TO_C_BEGIN_MEASURE, new BoolAndVec(rwPos, true));
                RulerManager.Instance.ClearCurRulers();
                return true;
            }
            return false;
        }
    }
}

MouseMoveBeforeMeasure

using UnityEngine;
using System.Collections;
using System;

namespace SpacePlanner
{
    public class MouseMoveBeforeMeasure : StateAction
    {
        public MouseMoveBeforeMeasure() : base()
        {
        }

        public override bool Execute()
        {
            var uiMgr = UIManager.Instance;
            if (uiMgr.IsPointerOverDrawingPanel())
            {
#if UNITY_EDITOR || UNITY_STANDALONE
                Vector3 screenPos = Input.mousePosition;
#elif UNITY_ANDROID || UNITY_IPHONE
                Vector3 screenPos = uiMgr.DragDrawingPanelData.position;
#endif
                Vector3 rwPos = TransformHelper.ScreenToRealWorldPoint(screenPos);
                //VOAndVector3 data = new VOAndVector3(null, rwPos);
                MeasurePointAndVector data = new MeasurePointAndVector(null,rwPos);
                //Debug.Log("鼠標移動在測量之前"+rwPos);
                //SPApplication.Instance.SendNotification(MVCNotifications.TO_C_UPDATE_AUXILIARY_LINE, data);
                SPApplication.Instance.SendNotification(MVCNotifications.TO_C_UPDATE_AUXILIARY_LINE_MEASURE, data);
                //FPBApplication.Instance.SendNotification(ApplicationConstants.TO_V_POINTER_MOVE_WHEN_DRAW_WALL, screenPos);
            }

            return false;
        }
    }
}

MouseRightClickToStopMeasure

using UnityEngine;
using System.Collections;
using System;

namespace SpacePlanner
{
    public class MouseRightClickToStopMeasure : StateAction
    {
        public MouseRightClickToStopMeasure() : base()
        {
        }

        public override bool Execute()
        {
//#if UNITY_EDITOR || UNITY_STANDALONE
            if (Input.GetMouseButtonDown(1))
//#elif UNITY_ANDROID || UNITY_IPHONE
//            //if (UIManager.Instance.IsTouchReleased())
                 //SendNotification(MVCNotifications.TO_V_CLEAR_AUXILIARY_WALL_MEASURE);// 關(guān)掉輔助墻
//#endif
            {
                //畫墻結(jié)束后把UIFloatExitButton隱藏掉
                //GameObject uiFloatPanel = GameObject.Find("UIFloatExitButton(Clone)");
                //uiFloatPanel.SetActive(false);   
                //SPApplication.Instance.SendNotification(MVCNotifications.TO_C_STOP_BUILD_WALL_MEASURE, DrawingSelection.selectedObject);
                SPApplication.Instance.SendNotification(MVCNotifications.TO_C_STOP_BUILD_WALL_MEASURE, DrawingSelection.SelectMeasurePoint);
                //DrawingSelection.selectedObject = null;
                DrawingSelection.SelectMeasurePoint = null;
                CursorManager.Instance.setNormalCursor();
                return true;
            }
            return false;
        }
    }
}

2.測量狀態(tài)下的動作

MouseMoveInMeasure

using UnityEngine;
using System.Collections;
using System;
using SpacePlanner.Core.DataStructure;

namespace SpacePlanner
{
    public class MouseMoveInMeasure : StateAction
    {
        public MouseMoveInMeasure() : base()
        {
        }

        public override bool Execute()
        {
            var uiMgr = UIManager.Instance;
            MeasurePoint measurePoint = DrawingSelection.SelectMeasurePoint;
            if (uiMgr.IsPointerOverDrawingPanel())
            {
#if UNITY_EDITOR || UNITY_STANDALONE
                Vector3 screenPos = Input.mousePosition;
#elif UNITY_ANDROID || UNITY_IPHONE
                //Vector3 screenPos = uiMgr.DragDrawingPanelData.position;

                Vector3 endPos = uiMgr.DragDrawingPanelData.position;
                Vector3 dir = (measurePoint.Start - endPos).normalized;
                float circleRadius = 100f;
                Vector3 screenPos = endPos + dir * circleRadius;
#endif
                Vector3 rwPos = TransformHelper.ScreenToRealWorldPoint(screenPos);
                Wall wall = DrawingSelection.selectedObject as Wall;
                VOAndVector3 data = new VOAndVector3(wall, rwPos);
                //MeasurePoint measurePoint = DrawingSelection.SelectMeasurePoint;
                MeasurePointAndVector data1 = new MeasurePointAndVector(measurePoint,rwPos);
                //Debug.Log("在測量時移動鼠標" + screenPos + rwPos);
                SPApplication.Instance.SendNotification(MVCNotifications.TO_C_UPDATE_AUXILIARY_WALL_MEASURE, data1);
                SPApplication.Instance.SendNotification(MVCNotifications.TO_C_UPDATE_AUXILIARY_LINE_MEASURE, data1);
                //FPBApplication.Instance.SendNotification(ApplicationConstants.TO_V_POINTER_MOVE_WHEN_DRAW_WALL, screenPos);
            }

            return false;
        }
    }
}

MouseClickToContinueMeasure

using UnityEngine;
using System.Collections;
using System;
using SpacePlanner.Core.DataStructure;
using PureMVC.Patterns;

namespace SpacePlanner
{
    public class MouseClickToContinueMeasure : StateAction
    {
        public MouseClickToContinueMeasure(string nextState) : base(nextState)
        {
        }

        public override bool Execute()
        {
            var uiMgr = UIManager.Instance;

            Vector3 screenPos = uiMgr.ClickDrawingPanelData.position;
            Vector3 rwPos = TransformHelper.ScreenToRealWorldPoint(screenPos);
            Debug.Log("鼠標點擊結(jié)束畫一面墻" + screenPos + rwPos + TransformHelper.ScreenToUISpacePoint(screenPos, uiMgr.DrawingPanel.transform, false));
            Wall wall = DrawingSelection.selectedObject as Wall;
            MeasurePoint measurePoint = DrawingSelection.SelectMeasurePoint;
            UndoManager.Instance.AddNotification();

#if UNITY_EDITOR || UNITY_STANDALONE
            if (uiMgr.ClickOnDrawingPanel())
            {
                
                //SPApplication.Instance.SendNotification(MVCNotifications.TO_C_BUILD_ONE_WALL_DONE_MEASURE, wall);
                SPApplication.Instance.SendNotification(MVCNotifications.TO_C_BUILD_ONE_WALL_DONE_MEASURE, measurePoint);
                //UndoManager.Instance.AddNotification(new Notification(MVCNotifications.TO_C_BUILD_ONE_WALL_DONE, wall));// 添加命令到UndoManager里
                return true;
            }
#elif UNITY_ANDROID || UNITY_IPHONE
            if (uiMgr.IsTouchReleased())
             {
                          
                //SPApplication.Instance.SendNotification(MVCNotifications.TO_C_BUILD_ONE_WALL_DONE_MEASURE, wall);
                SPApplication.Instance.SendNotification(MVCNotifications.TO_C_BUILD_ONE_WALL_DONE_MEASURE_ANDROID, measurePoint);               
                //UndoManager.Instance.AddNotification(new Notification(MVCNotifications.TO_C_BUILD_ONE_WALL_DONE, wall));// 添加命令到UndoManager里
                return true;
              }
#endif
            {
                RulerManager.Instance.DisplayAllWallRuler();// 刷新標尺
            }
            return false;
        }
    }


}

MouseRightClickToStopMeasure

using UnityEngine;
using System.Collections;
using System;

namespace SpacePlanner
{
    public class MouseRightClickToStopMeasure : StateAction
    {
        public MouseRightClickToStopMeasure() : base()
        {
        }

        public override bool Execute()
        {
//#if UNITY_EDITOR || UNITY_STANDALONE
            if (Input.GetMouseButtonDown(1))
//#elif UNITY_ANDROID || UNITY_IPHONE
//            //if (UIManager.Instance.IsTouchReleased())
                 //SendNotification(MVCNotifications.TO_V_CLEAR_AUXILIARY_WALL_MEASURE);// 關(guān)掉輔助墻
//#endif
            {
                //畫墻結(jié)束后把UIFloatExitButton隱藏掉
                //GameObject uiFloatPanel = GameObject.Find("UIFloatExitButton(Clone)");
                //uiFloatPanel.SetActive(false);   
                //SPApplication.Instance.SendNotification(MVCNotifications.TO_C_STOP_BUILD_WALL_MEASURE, DrawingSelection.selectedObject);
                SPApplication.Instance.SendNotification(MVCNotifications.TO_C_STOP_BUILD_WALL_MEASURE, DrawingSelection.SelectMeasurePoint);
                //DrawingSelection.selectedObject = null;
                DrawingSelection.SelectMeasurePoint = null;
                CursorManager.Instance.setNormalCursor();
                return true;
            }
            return false;
        }
    }
}

總結(jié)一下狀態(tài)機的流程(注意事項)
1.有狀態(tài)切換的動作,stateAction的構(gòu)造函數(shù)不一樣镣衡,需要把狀態(tài)傳過去霜定。
2.狀態(tài),動作廊鸥,動作改變狀態(tài)望浩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市惰说,隨后出現(xiàn)的幾起案子磨德,更是在濱河造成了極大的恐慌,老刑警劉巖吆视,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剖张,死亡現(xiàn)場離奇詭異切诀,居然都是意外死亡,警方通過查閱死者的電腦和手機搔弄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門幅虑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人顾犹,你說我怎么就攤上這事倒庵。” “怎么了炫刷?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵擎宝,是天一觀的道長。 經(jīng)常有香客問我浑玛,道長绍申,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任顾彰,我火速辦了婚禮极阅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涨享。我一直安慰自己筋搏,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布厕隧。 她就那樣靜靜地躺著奔脐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吁讨。 梳的紋絲不亂的頭發(fā)上髓迎,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音建丧,去河邊找鬼排龄。 笑死,一個胖子當著我的面吹牛茶鹃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播艰亮,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼闭翩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了迄埃?” 一聲冷哼從身側(cè)響起疗韵,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侄非,沒想到半個月后蕉汪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體流译,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年者疤,在試婚紗的時候發(fā)現(xiàn)自己被綠了福澡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡驹马,死狀恐怖革砸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情糯累,我是刑警寧澤算利,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站泳姐,受9級特大地震影響效拭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胖秒,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一缎患、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扒怖,春花似錦较锡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俯邓,卻和暖如春骡楼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稽鞭。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工鸟整, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朦蕴。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓篮条,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吩抓。 傳聞我的和親對象是個殘疾皇子涉茧,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 狀態(tài)機是無論科研探索還是科技應(yīng)用方面都非常重要的一種分析工具。幾乎在所有涉及到隨時間演化的問題中疹娶,都可以找到狀態(tài)機...
    Esmool閱讀 4,425評論 0 26
  • iOS APP上架流程詳解 字數(shù)2714 閱讀100 評論0 喜歡1 前言:作為一名 iOS 開發(fā)工程師, APP...
    EverythingIsOk閱讀 269評論 0 0
  • 這個系列最終實現(xiàn)的狀態(tài)機并不是一個標準的狀態(tài)機伴栓,把狀態(tài)機的很多標準的概念進行了簡化,對概念的東西做了減法,實現(xiàn)了具...
    iPolaris閱讀 34,853評論 2 40
  • 在研究Raft算法的時候钳垮,看到其是使用狀態(tài)機實現(xiàn)的惑淳,于是找了一篇論文,了解了一下狀態(tài)機. 論文原文為Impleme...
    AlstonWilliams閱讀 3,154評論 0 4
  • 從母系社會以后饺窿,歷史好像都是由男人主導著歧焦、推進著。氏族社會之后的的炎黃短荐,再之后的堯倚舀、舜、禹等等忍宋,其首領(lǐng)或者統(tǒng)治者都...
    史七閱讀 169評論 0 0