使用状态机来实现状态切换,备忘。

#include <stdio.h>
#include <conio.h>
#pragma warning(disable:4996)
/*
四要素
state      状态
event      事件
action     动作
transition 变换
*/typedef enum
{sta_go = 0,sta_down,sta_right,sta_light,sta_stop
}state;
state now_state = sta_stop;//初始化目前状态为前进
state last_state = sta_stop;//初始化上一次状态为停止
typedef enum
{evt_rl =0,evt_yl,evt_gl,evt_people_pass,evt_turn_right,evt_turn_light
}eventid;typedef  void (*CallBack)(void);typedef struct {state curState;//当前状态eventid eventId;//事件IDstate nextState;//下个状态CallBack action;//回调函数,事件发生后,调用对应的回调函数
}StateTransform;void callback_go(void)
{printf("向前走\n");
}
void callback_stop(void)
{printf("停止\n");
}
void callback_right(void)
{printf("右转\n");
}
void callback_light(void)
{printf("左转\n");
}
void callback_down(void)
{printf("倒退特殊回调触发\n");
}
StateTransform stateTran_go[]{//顺序不能变{sta_go,evt_rl,                    sta_stop,callback_stop},{sta_go,evt_yl,                    sta_stop,callback_stop},{sta_go,evt_gl,                    sta_stop,callback_stop},{sta_go,evt_people_pass,           sta_stop,callback_stop},{sta_go,evt_turn_right,            sta_right,callback_right},{sta_go,evt_turn_light,            sta_light,callback_light},
};
StateTransform stateTran_down[]{{sta_down,evt_rl,                    sta_stop,callback_down},{sta_down,evt_yl,                    sta_light,callback_down},{sta_down,evt_gl,                    sta_light,callback_down},{sta_down,evt_people_pass,           sta_stop,callback_stop},{sta_down,evt_turn_right,            sta_right,callback_down},{sta_down,evt_turn_light,            sta_light,callback_down},
};
StateTransform stateTran_stop[]{{sta_stop,evt_rl,                    sta_stop,callback_stop},{sta_stop,evt_yl,                    sta_stop,callback_stop},{sta_stop,evt_gl,                    sta_go,callback_go},{sta_stop,evt_people_pass,           sta_stop,callback_stop},{sta_stop,evt_turn_right,            sta_right,callback_right},{sta_stop,evt_turn_light,            sta_light,callback_light},
};
StateTransform stateTran_right[]{{sta_right,evt_rl,                    sta_stop,callback_stop},{sta_right,evt_yl,                    sta_right,callback_right},{sta_right,evt_gl,                    sta_right,callback_right},{sta_right,evt_people_pass,           sta_stop,callback_stop},{sta_right,evt_turn_right,            sta_right,callback_right},{sta_right,evt_turn_light,            sta_light,callback_light},
};
StateTransform stateTran_light[]{{sta_light,evt_rl,                    sta_stop,callback_go},{sta_light,evt_yl,                    sta_light,callback_light},{sta_light,evt_gl,                    sta_light,callback_light},{sta_light,evt_people_pass,           sta_stop,callback_stop},{sta_light,evt_turn_right,            sta_right,callback_right},{sta_light,evt_turn_light,            sta_light,callback_light},
};void do_action(StateTransform* statTran)
{printf("last_state = % d\n now_state = % d\n", last_state, now_state);if (NULL == statTran){perror("statTran is NULL\n");return;}last_state= statTran->curState;//更新状态now_state = statTran->nextState;if (now_state != last_state){if (statTran->action != NULL){statTran->action();}}else{printf("事件没有改变\n");}
}void event_action(unsigned int event)
{switch (now_state){case sta_go:do_action(&stateTran_go[event]);break;case sta_down:do_action(&stateTran_down[event]);break;case sta_right:do_action(&stateTran_right[event]);break;case sta_light:do_action(&stateTran_light[event]);break;case sta_stop:do_action(&stateTran_stop[event]);break;default:printf("事件不合法\n");break;}
}
void main()
{int key;printf("开始运行.....\n");while (1){key = getchar();if (key=='r'){event_action(evt_rl);}if (key == 'y'){event_action(evt_yl);}if (key == 'g'){event_action(evt_gl);}if (key == 'p'){event_action(evt_people_pass);}if (key == 'R'){event_action(evt_turn_right);}if (key == 'L'){event_action(evt_turn_light);}}
}

运行结果
在除正在转弯的情况下,其余所有情况遇到黄灯都停止。同时所有状态遇到行人都停止。
举例不是很恰当,重要的是思想。

【学习笔记】状态机编程相关推荐

  1. ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)...

    ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...

  2. python学习笔记——多线程编程

    python学习笔记--多线程编程 基础不必多讲,还是直接进入python. Python代码代码的执行由python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时 ...

  3. 学习笔记之编程达到一个高的境界就是自制脚本语言(图)

    学习笔记之编程达到一个高的境界就是自制脚本语言(图) 编程达到一个高的境界就是自制脚本语言,通过这可以精通编程里面的高深的技术,如编译原理.语言处理器.编译器与解释器,这些都是代表一个程序员实力的技术 ...

  4. Python学习笔记:网络编程

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. linux学习笔记 -- 系统编程

    系统编程 相关概念 概念 简易cpu结构 mmu内存管理单元 环境变量 PATH SHELL HOME LANG TERM getenv setenv unsetenv 进程控制 fork函数 get ...

  6. 我的学习笔记_Windows_HOOK编程 2009-12-03 11:19

    一.什么是HOOK? "hook"这个单词的意思是"钩子","Windows Hook"是Windows消息处理机制的一个重要扩展,程序猿能 ...

  7. 小梅哥FPGA学习笔记——状态机设计学习

    状态机学习 状态机编写方式 设计目的 设计思路 设计代码编写 测试代码编写 仿真波形结果 状态机编写方式 状态机设计编写有三种方式,分别是一段式.两段式.三段式三种方式. 设计目的 通过一段式状态机编 ...

  8. Go语言学习笔记 (网络编程)

    网络编程分层概念:​ 层与协议 简单的例子: package mainimport ("fmt""net" )func main() {listenner, e ...

  9. 匈牙利匹配算法_学习笔记_Python编程实现

    大家好,下面是我关于匈牙利匹配算法的学习记录,内含两个例题的Python编程实现.这是我的第一篇博客,参考的网站在文中都有标注,如有问题欢迎指出~ 匈牙利匹配算法 匈牙利算法1--无权重二部图最大匹配 ...

  10. java 学习笔记-网络编程(八)

    网络编程 标签:学习各种网络协议的桥梁 什么是计算机网络 计算机网络的作用:资源共享和信息传递. 计算机网络的组成: a) 计算机硬件:计算机(大中小型服务器,台式机.笔记本等).外部设备(路由器.交 ...

最新文章

  1. java maven 项目依赖管理 简介
  2. 从零开始用TensorFlow搭建卷积神经网络
  3. ThreadLocal为什么会内存泄漏(java高级面试)
  4. 初步学习大数据——设置虚拟机固定ip地址
  5. spring事务管理之事务回滚的处理
  6. 系统服务及shell编程
  7. 使用Joson的格式字符串在Socket中通讯时数据格式的转换
  8. 里程碑!中文版.NET官网发布,.NET开发起飞!
  9. 使用vue-seamless-scroll自动滚动插件复制出来的数据点击事件无效的解决办法
  10. C#LeetCode刷题之#496-下一个更大元素 I(Next Greater Element I)
  11. 计算机二级考试改错题技巧
  12. PHP 配置open_basedir,让各虚拟站点独立运行
  13. 论文研读 —— 7. Very Deep Convolutional Networks for Large-Scale Image Recognition (3/3)
  14. CenterNet2:CenterNet再升级,原作者提出基于概率解释的两阶段目标检测
  15. 我看了《2018 微信数据报告》,你呢?
  16. 关于时区您了解多少呢?在中国我们使用的是哪个时区?
  17. 第二十章 : 正则表达式
  18. GSA 8月最新5G报告:全球已发布100台5G设备
  19. 音乐信号处理权威会议
  20. 社交软件实现查看附近的人

热门文章

  1. wincc mysql_Wincc操作数据库SQLSERVER
  2. 一个方便快捷gif在线水印制作(支持文字和图片)
  3. Secure CRT 最大显示行数的设置
  4. dnf时装补丁教程_DNF时装补丁制作教程
  5. 计算机视觉教程2-5:图像金字塔送她一朵玫瑰(附代码)
  6. visio2019怎么对图片加箭头标注,Visio设置图片作为背景
  7. 微服务网关(一)微服务的选择以及网关的功能
  8. 用Qt自己开发的 数学坐标绘图软件 可用于 论文,报告插图
  9. pyhook3安装教程及与之相关的一些问题的解决方法
  10. 如何彻底卸载3dmax2020_3DMax如何才能彻底卸载干净啊?