zoukankan      html  css  js  c++  java
  • 状态机代码

    拷贝来自:http://www.cnblogs.com/plateFace/p/5018686.html
    using System;
    namespace StateMachine2.State
    {
    
        public enum AnimationState
        {
            Walk = 1,
            Dead,
        }
    
        public abstract class State
        {
            abstract public int GetStateId{ get; }
            abstract public void Enter(StateEvent data);
            abstract public void Execute(StateEvent data);
            abstract public void Exit(StateEvent data);
        }
    
    
        //状态运行时候的参数
        public class StateEvent
        {
            public string data;
        }
    
        //行走状态
        public class State_Walk : State
        {
            public const int ID = 1;
    
            public override int GetStateId
            {
                get
                {
                    return ID;
                }
            }
    
            public override void Enter(StateEvent data)
            {
                Console.WriteLine("角色行走-进入");
            }
    
            public override void Execute(StateEvent data)
            {
                Console.WriteLine("角色行走-执行中");
            }
    
            public override void Exit(StateEvent data)
            {
                Console.WriteLine("角色行走-退出");
            }
        }
    
        //死亡状态
        public class State_Dead : State
        {
            public const int ID = 2;
            public override int GetStateId
            {
                get
                {
                    return ID;
                }
            }
    
            public override void Enter(StateEvent data)
            {
                Console.WriteLine("角色死亡-进入");
            }
    
            public override void Execute(StateEvent data)
            {
                Console.WriteLine("角色死亡-执行中");
            }
    
            public override void Exit(StateEvent data)
            {
                Console.WriteLine("角色死亡-退出");
            }
        }
    
        public class StateMachine
        {
            private State currentState = null;
            private State previousState = null;
            private StateEvent dataEvent = null;
            private bool isStop;
    
            public State CurrentState
            {
                get
                {
                    return currentState;
                }
            }
            public State PreviousState
            {
                get
                {
                    return previousState;
                }
            }
            public bool IsStop
            {
                get
                {
                    return isStop;
                }
    
                set
                {
                    isStop = value;
                }
            }
    
            private State GetState(AnimationState animationState)
            {
                switch (animationState)
                {
                    case AnimationState.Walk: return new State_Walk();
                    case AnimationState.Dead: return new State_Dead();
                }
                return new State_Walk();
            }
    
            public void ChangeState(AnimationState animationState, StateEvent data,StateEvent previousData = null)
            {
                ChangeState(GetState(animationState),data, previousData);
            }
    
            public void ChangeState(State state,StateEvent data, StateEvent previousData = null)
            {
                //如果切换的状态就是本状态,就退出
                if (currentState != null && state.GetStateId == currentState.GetStateId)
                    return;
    
                //退出上一个状态
                if (previousState != null)
                    previousState.Exit(previousData);
    
                //设置进状态,进入新状态
                currentState = state;
                dataEvent = data;
                currentState.Enter(data);
            }
    
    
    
    
            public void Update()
            {
                if (currentState == null)
                {
                    Console.WriteLine("当前没有状态可以执行");
                    return;
                }
                else if (IsStop)
                {
                    Console.WriteLine("状态机已经停止");
                    return;
                }
                else
                {
                    currentState.Execute(dataEvent);
                }
            }
        }
    
    }
    
    using StateMachine2.State;
    using System;
    
    namespace StateMachine2
    {
        class Program
        {
            static void Main(string[] args)
            {
                StateMachine sm = new StateMachine();
                sm.ChangeState(AnimationState.Walk, new StateEvent() { data = "行走需要的参数" });
                sm.Update();       //执行行走状态 
                sm.Update();       //执行行走状态     
                
                sm.ChangeState(AnimationState.Dead, new StateEvent() { data = "死亡需要的参数" });
                sm.Update();
                sm.IsStop = true;   //停止状态机
    
                sm.Update();        //再次执行状态
    
    
                Console.WriteLine("结束程序");
                Console.ReadLine();
            }
        }
    }
    
  • 相关阅读:
    HDOJ1003 MaxSum【逆推】
    HDOJ1698 Just a hook【线段树成段更新lazy标志】武科大ACM暑期集训队选拔赛4题
    HDOJ1102 Constructing Roads【最小生成树】武科大ACM暑期集训队选拔赛1题
    POJ2828 Buy Tickets【线段树,逆序遍历】
    HDOJ1215 ( 七夕节 )【居然还可以这么解~】
    HDOJ1089HDOJ1096【格式练习】
    HDOJ1233 ( 还是畅通工程 ) 【最小生成树,kruscal】
    HDOJ1035 ( Robot Motion ) 【递归】
    POJ3468 A Simple Problem with Integers【线段树 成段更新+求和 lazy标志】
    HDOJ1216 Assistance Required【打表】武科大ACM暑期集训队选拔赛7题
  • 原文地址:https://www.cnblogs.com/wyvern0618/p/8966495.html
Copyright © 2011-2022 走看看