状态机代码

拷贝来自: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();
        }
    }
}

 

posted on 2018-04-28 11:08 WYVE 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/wyvern0618/p/8966495.html

Quartus II是Altera公司的一款FPGA/CPLD设计工具,它提供了高级综合器、布局布线工具以及功能模拟器等。在Quartus中创建状态机(State Machine)主要是用来描述系统的行为,特别是状态转换和事件驱动的行为。 状态机代码通常使用Verilog或VHDL语言编写,这两种都是硬件描述语言。以下是一个简单的Verilog状态机示例: ```verilog module fsm ( input clk, input rst, input event_in, // 输入事件 output state_out // 输出当前状态 ); // 定义状态 typedef enum { IDLE, RUN, STOP } State; // 定义状态机变量 State current_state; reg [7:0] state_reg; // 使用寄存器保存状态 // 初始化 initial begin current_state = IDLE; state_reg = IDLE; end // 时钟周期内状态更新 always @(posedge clk or posedge rst) begin if (rst) begin current_state <= IDLE; state_reg <= IDLE; end else if (event_in) begin case (current_state) IDLE: if (event_in == START) current_state = RUN; else if (event_in == STOP) current_state = STOP; RUN: if (event_in == STOP) current_state = STOP; STOP: current_state = IDLE; // 可以添加额外的停止状态处理 endcase state_reg <= current_state; end end // 输出当前状态 assign state_out = state_reg; endmodule ``` 在这个例子中,`clk`是时钟输入,`rst`是复位信号,`event_in`是触发状态变化的外部事件,`state_out`则是表示当前状态的输出。状态机根据接收到的事件从一个状态转换到另一个状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值