状态机入门概念
想象一下,你有一个机器人,你希望告诉它在不同的情况下应该做什么。状态机就像是给机器人的一组指示,根据它当前的状态或情况来执行。
这样想一想:机器人可以有不同的状态,就像你可以有不同的心情或处境一样。例如,机器人可以处于“快乐”状态、“伤心”状态或“生气”状态。
现在,假设你希望机器人根据它的状态做不同的事情。如果机器人处于“快乐”状态,你希望它跳舞。如果它处于“伤心”状态,你希望它播放一首悲伤的曲调。如果它处于“生气”状态,你希望它跺脚。
为了实现这个目标,你可以创建一个状态机。它就像是一个流程图,展示了机器人可能的不同状态以及在每个状态下应该执行的操作。
在我们的例子中,状态机可能是这样的:
- 如果机器人处于“快乐”状态,它应该跳舞。
- 如果机器人处于“伤心”状态,它应该播放一首悲伤的曲调。
- 如果机器人处于“生气”状态,它应该跺脚。
所以,每当机器人改变它的状态时,它会检查状态机,并根据当前的状态知道应该采取什么行动。如果它处于“快乐”状态,它会跳舞。如果它处于“伤心”状态,它会播放一首悲伤的曲调。如果它处于“生气”状态,它会跺脚。
状态机不仅仅用在机器人上,还可以用在计算机程序、游戏甚至是交通信号灯中。它们帮助我们组织和控制在不同情况下发生的事情。
交通信号灯
当我们讨论状态机的例子时,一个经典的示例是交通信号灯。让我们使用Python来实现一个简单的交通信号灯状态机:
class TrafficLight:
def __init__(self):
self.current_state = 'red'
def change_state(self):
if self.current_state == 'red':
print("红灯,停车")
self.current_state = 'green'
elif self.current_state == 'green':
print("绿灯,行走")
self.current_state = 'yellow'
elif self.current_state == 'yellow':
print("黄灯,请准备停车")
self.current_state = 'red'
else:
print("无效状态")
# 创建交通信号灯状态机
traffic_light = TrafficLight()
# 模拟信号灯状态变化
traffic_light.change_state() # 输出:红灯,停车
traffic_light.change_state() # 输出:绿灯,行走
traffic_light.change_state() # 输出:黄灯,请准备停车
traffic_light.change_state() # 输出:红灯,停车
增加等待时间
为了更加真实模拟现实交通灯,需要在信号灯转换之间增加等待时间,使用time.sleep
import time
在状态转换之前等待特定时间:
time.sleep(2) # 停留2秒
增加打印提示
使用循环打印
等待时间,秒为单位
def print_delay(self, seconds):for second in range(seconds): self.print_delay_second(1)
一秒打印一个等待提示...
def print_delay_second(self, second=1):start_time = time.time() while time.time() - start_time < second: pass print("waiting...")
状态机涉及的一些概念:
- 状态
- 转换
- 输入
- 输出
python里面有很多现成的实现好的状态机框架
体验一个简单的实现fysom
安装
pip install fysom
一个简单的例子:
from fysom import *
fsm = Fysom({'initial': 'awake',
'final': 'red',
'events': [
{'name': 'wakeup', 'src': 'sleeping', 'dst': 'awake'},
{'name': 'sleep', 'src': 'awake', 'dst': 'sleeping'}]})
print(fsm.current) # awake
fsm.sleep()
print(fsm.current) # sleeping
fsm.wakeup()
print(fsm.current) # awake
拓展,练习
使用fsom模拟交通灯?,参考如下:
from fysom import Fysom
import time
def on_green_light():
print("绿灯")
time.sleep(5)
fsm.trigger('change') # 绿灯持续5秒后触发状态转换到下一个状态
def on_yellow_light():
print("黄灯")
time.sleep(2)
fsm.trigger('change') # 黄灯持续2秒后触发状态转换到下一个状态
def on_red_light():
print("红灯")
time.sleep(5)
fsm.trigger('change') # 红灯持续5秒后触发状态转换到下一个状态
fsm = Fysom({'initial': 'green',
'events': [{'name': 'change', 'src': 'green', 'dst': 'yellow'},
{'name': 'change', 'src': 'yellow', 'dst': 'red'},
{'name': 'change', 'src': 'red', 'dst': 'green'}],
'callbacks': {'on_green': on_green_light,
'on_yellow': on_yellow_light,
'on_red': on_red_light}})
while True:
fsm.onchange() # 执行状态转换
time.sleep(1) # 在状态转换之间添加1秒的延时等待