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

  • 相关阅读:
    【转载】NHibernate的hbm.xml的配置文件大全
    C#读取文本播放相应语音【转】
    Convert.ToInt32、int.Parse(Int32.Parse)、int.TryParse三者之间的区别
    to_date()与24小时制表示法及mm分钟的显示
    DataGridView隔行显示不同的颜色
    Oracle锁表了如何处理
    自1月4号起,不再在博客园更新笔记
    Spring 自定义注解+Aspect切面实现日志记录
    Spring @webFilter注解实现过滤器 省略配置xml
    druid配置随手记
  • 原文地址:https://www.cnblogs.com/plateFace/p/5018686.html
Copyright © 2011-2022 走看看