zoukankan      html  css  js  c++  java
  • C# 实现简单状态机(参考代码)

    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();
            }
        }
    }

    效果图:

    image

  • 相关阅读:
    leetcode Remove Linked List Elements
    leetcode Word Pattern
    leetcode Isomorphic Strings
    leetcode Valid Parentheses
    leetcode Remove Nth Node From End of List
    leetcode Contains Duplicate II
    leetcode Rectangle Area
    leetcode Length of Last Word
    leetcode Valid Sudoku
    leetcode Reverse Bits
  • 原文地址:https://www.cnblogs.com/plateFace/p/5018686.html
Copyright © 2011-2022 走看看