一,需求

1,迭代1

设置指定位置(x, y, heading)
获取当前位置(x, y, heading)
右转90度,位置不变
左转90度,位置不变

2, 迭代2

前进一步,方向不变
后退一步,方向不变
转180度 位置不变

3,迭代3

右转45度,位置不变
左转45度,位置不变
注解:当角度为45 奇数倍时,前进一步需要向x y轴都需要变化

4,迭代4

forward n step 沿当前方向前进n步, 方向不变
backward n setp 沿当前方向后退n步, 方向不变
repet command n time:将指定的动作(左转右转前进后退,一共8个动作)重复执行N次

二,实现

头文件:

enum {NORTH,NORTHEAST,EAST,EASTSOUTH,SOUTH,SOUTHWEST,WEST,WESTNORTH
};typedef struct Position {int locx, locy;int direc; // 方向,0,1,2,3对应北东南西
} position;typedef enum Command{FORWARD,BACKWARD,TURNRIGHT,TURNLEFT,TURNROUND,TURNRIGHT45DEG,TURNLEFT45DEG,COMMAND_ONE_BUT,FORWARDN,BACKWARDN,COMMAND_TWO_BUT
}Command;void Create();
void Init(int x, int y, int heading);
position GetPosition();
void Forward();
void Backward();
void TurnRight();
void TurnLeft();
void TurnRound();
void TurnRight45deg();
void TurnLeft45deg();
void ForwardN(int n);
void BackwardN(int n);
void Repeat(int m,Command command, ...);

源代码:

#include <stdarg.h>const int dx[]={ -1, -1, 0, 1, 1, 1, 0 , -1};
const int dy[]={ 0, 1, 1, 1, 0, -1, -1, -1 };
static position sp;void Init(int x, int y, int heading)
{sp.locx = x;sp.locy = y;sp.direc = heading;
}void Create()
{Init(0,0,NORTH);
}position GetPosition()
{return sp;
}static void Move(int dis)
{sp.locx += dx[sp.direc] * dis;sp.locy += dy[sp.direc] * dis;
}void Forward()
{Move(1);
}void Backward()
{Move(-1);
}void ForwardN(int n)
{Move(n);
}void BackwardN(int n)
{Move(-n);
}static void Turn(int d)
{sp.direc += d;sp.direc %= 8;
}void TurnRight()
{Turn(2);
}void TurnLeft()
{Turn(6);
}void TurnRound()
{Turn(4);
}void TurnRight45deg()
{Turn(1);
}void TurnLeft45deg()
{Turn(7);
}int isOneParaCommand(Command command)
{return command<COMMAND_ONE_BUT;
}void ExecutCommand(Command command, int n)
{switch(command){case FORWARD:return Forward();case BACKWARD:return Backward();case TURNLEFT:return TurnLeft();case TURNRIGHT:return TurnRight();case TURNROUND:return TurnRound();case TURNLEFT45DEG:return TurnLeft45deg();case TURNRIGHT45DEG:return TurnRight45deg();case FORWARDN:return ForwardN(n);case BACKWARDN:return BackwardN(n);}
}void Execut(Command command, va_list arg)
{int n=0;if (!isOneParaCommand(command)) {n = va_arg(arg, int);}ExecutCommand(command,n);va_end(arg);
}void Repeat(int m,Command command, ...)
{va_list arg;va_start(arg, command);while(m--){Execut(command,arg);}va_end(arg);
}

三,测试用例

#define ASSERT_POSITION(x,y,h)  position sp = GetPosition();\GTEST_ASSERT_EQ((x),sp.locx);\GTEST_ASSERT_EQ((y),sp.locy);\GTEST_ASSERT_EQ((h),sp.direc);TEST_F(MockCppTest, get_default_location)
{ASSERT_POSITION(0, 0, NORTH);
}TEST_F(MockCppTest, init_config)
{Init(1, 2, WEST);ASSERT_POSITION(1, 2, WEST);
}TEST_F(MockCppTest, turn_left)
{Init(1, 2, WEST);TurnLeft();ASSERT_POSITION(1, 2, SOUTH);
}TEST_F(MockCppTest, turn_right)
{Init(1, 2, WEST);TurnRight();ASSERT_POSITION(1, 2, NORTH);
}TEST_F(MockCppTest, forward)
{Init(0, 0, WEST);Forward();ASSERT_POSITION(0, -1, WEST);
}TEST_F(MockCppTest, backward)
{Init(0, 0, WEST);Backward();ASSERT_POSITION(0, 1, WEST);
}TEST_F(MockCppTest, turn_round)
{Init(0, 0, WEST);TurnRound();ASSERT_POSITION(0, 0, EAST);
}TEST_F(MockCppTest, turn_left_45degree)
{Init(1, 2, WEST);TurnLeft45deg();ASSERT_POSITION(1, 2, SOUTHWEST);
}TEST_F(MockCppTest, turn_right_45degree)
{Init(1, 2, WEST);TurnRight45deg();ASSERT_POSITION(1, 2, WESTNORTH);
}TEST_F(MockCppTest, forward_to_WESTNORTH)
{Init(0, 0, WESTNORTH);Forward();ASSERT_POSITION(-1, -1, WESTNORTH);
}TEST_F(MockCppTest, forwardN)
{Init(0, 0, WEST);ForwardN(3);ASSERT_POSITION(0, -3, WEST);
}TEST_F(MockCppTest, backwardN)
{Init(0, 0, WEST);BackwardN(5);ASSERT_POSITION(0, 5, WEST);
}TEST_F(MockCppTest, repeat_forward)
{Init(0, 0, WEST);Repeat(10,FORWARD);ASSERT_POSITION(0, -10, WEST);
}TEST_F(MockCppTest, repeat_forward_N)
{Init(0, 0, WEST);Repeat(10,FORWARDN, 5);ASSERT_POSITION(0, -50, WEST);
}

演进式设计——扫地机器人相关推荐

  1. 扫地机器人水箱背景_你真的懂扫地机器人吗?这些不为人知的小细节值得一看...

    扫地机器人在人们的家中可谓十分常见,虽说功能上大相径庭,扫地.拖地永远是它们的主打,但在设计上却有着许多不同,其中更是蕴藏了许多不为人知的巧思.今天,我们就以石头扫地机器人系列产品举例,来看看扫地机器 ...

  2. 好评度前五的扫地机器人

    随着扫地机器人的普及程度越来越高,解决了人们地面清扫的一大难题,如果你是一名朝九晚五,偶尔加班的上班族,那么扫地机器人带来的好处则更加的明显,帮你解决做家务的难题,由此扫地机器人更加受到用户的喜爱. ...

  3. 扫地机器人湿地_扫地机器人的制作方法

    本发明涉及智能家居领域,尤其涉及一种扫地机器人. 背景技术: 计算机技术.微电子技术等方面的快速发展,推动了智能家居在家庭中的应用.随着老百姓生活水平逐渐提高,工作和生活节奏加快,使用可靠.高效的智能 ...

  4. 选择智能扫地机器人的三个要点

    智能扫地机器人选购攻略,智能吸尘器该如何选择.各种智能产品的出现及普及使得人们对人工智能已经并不陌生.近年来,随着科技的飞速发展,各种智能机器产品在其性能上都有了不同程度的较大进步,智能扫地机器人便是 ...

  5. 基于视觉的扫地机器人导航系统(模块设计)

    摘要 自20世纪60年代以来,机器人的各项相关技术取得了巨大的进步.而就扫地机器人而言,扫地机器人受到越来越多家庭的欢迎,国外先进的扫地机器人主要采用了视觉导航技术,而国内在基于视觉导航机器人的应用上 ...

  6. 基于51单片机的扫地小车,扫地机器人设计 主要功能有寻迹避障,来回清扫功能,往返清扫功能

    基于51单片机的扫地小车,扫地机器人设计. 有原理图,程序代码,原文. 可做实物. 主要功能有寻迹避障,来回清扫功能,往返清扫功能. YID:3350665853241481南唐开心的卷柏

  7. stm32毕设 stm32智能扫地机器人设计与实现

    文章目录 0 简介 1 课题背景 2 硬件系统总体框架 2.1 电机驱动 2.2 红外线传感器 2.3 超声波传感器 2.4 MPU6050 2.5 ATK-ESP8266 WI FI 模块 2.6 ...

  8. 单片机毕设 stm32智能扫地机器人设计与实现

    文章目录 0 简介 1 课题背景 2 硬件系统总体框架 2.1 电机驱动 2.2 红外线传感器 2.3 超声波传感器 2.4 MPU6050 2.5 ATK-ESP8266 WI FI 模块 2.6 ...

  9. 毕设分享 stm32的智能扫地机器人设计与实现 - 单片机 物联网

    文章目录 0 简介 1 课题背景 2 硬件系统总体框架 2.1 电机驱动 2.2 红外线传感器 2.3 超声波传感器 2.4 MPU6050 2.5 ATK-ESP8266 WI FI 模块 2.6 ...

最新文章

  1. 前端 ----jQuery的动画效果
  2. 特约专栏丨陈纯院士:大规模动态时序图实时处理技术、平台及应用
  3. MySQL跑在CentOS 6 和 7上的性能比较
  4. XTUOJ 1206 Dormitory's Elevator
  5. 【EventBus】EventBus 源码解析 ( 取消订阅 )
  6. Android中TextView限制一行显示及其它效果
  7. vue 多选自动触发_Vue,初次邂逅(二)
  8. 【POJ - 1050】To the Max (dp)
  9. java监听双按键_java 键盘监听 按一次键监听到两次
  10. LaTeX设置参考文献条目行距以及条目内行距的方法
  11. android button imagebutton 区别,android - 可点击的ImageView和ImageButton之间的区别
  12. 添加七牛云存储_七牛云存储如何正确设置流量带宽告警配置(阈值告警)?
  13. GLKVector3参考
  14. html jwt权限控制,SpringBoot+SpringSecurity+JWT实RESTfulAPI权限控制
  15. Error creating bean with name 'rocketMQTemplate' defined in class path resource
  16. solr的索引库配置
  17. IE9如何降级返回IE8
  18. DSP与FPGA的SRIO通信实现
  19. 如何下载大同市卫星地图高清版大图
  20. 《财务共享服务》读书笔记

热门文章

  1. http://www.xueh188.top/index.php/archives/33/
  2. Android | ListView、RecyclerView 实现一键回到顶部
  3. CodeForces 630I Parking Lot (组合计数)
  4. c语言printf char数组,在C中输出二维char数组的最快方法
  5. python位运算(、|、^、~、>>、<<)
  6. mac系统自动登录的方法
  7. 自动化测试记录--beautifulreport报告改变用例描述
  8. 自定义VBA函数(Fucntion)怎样才能只被VBA引用?
  9. B站笔试真题之[编程题]简单表达式计算
  10. 常见2D和3D视觉算法