




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#include Maze.h/* 全局变量定义*/static uint8 GucXStart = 0; /* 起点横坐标 */static uint8 GucYStart = 0; /* 起点纵坐标 */static uint8 GucXGoal0 = XDST0; /* 终点X坐标,有两个值 */static uint8 GucXGoal1 = XDST1;static uint8 GucYGoal0 = YDST0; /* 终点Y坐标,有两个值 */static uint8 GucYGoal1 = YDST1;static uint8 GucMouseTask = WAIT; /* 状态机,初始状态为等待 */static uint8 GucMapStepMAZETYPEMAZETYPE = 0xff; /* 保存各坐标的等高值 */static MAZECOOR GmcStackMAZETYPE * MAZETYPE = 0; /* 在mapStepEdit()中作堆栈使用 */static MAZECOOR GmcCrosswayMAZETYPE * MAZETYPE = 0; /* Main()中暂存未走过支路坐标 */static int cX = 0,cY = 0;static uint8 b=0;static uint8 zz=0;static uint8 SEARCHMETHOD=1;/* Function name: Delay* Descriptions: 延时函数* input parameters: uiD :延时参数,值越大,延时越久* output parameters: 无* Returned value: 无*/void delay (uint32 uiD) for (; uiD; uiD-);/* Function name: mapStepEdit* Descriptions: 制作以目标点为起点的等高图* input parameters: uiX: 目的地横坐标* uiY: 目的地纵坐标* output parameters: GucMapStep: 各坐标上的等高值* Returned value: 无*/void mapStepEdit (int8 cX, int8 cY) uint8 n = 0; /* GmcStack下标 */ uint8 ucStep = 1; /* 等高值 */ uint8 ucStat = 0; /* 统计可前进的方向数 */ uint8 i,j; GmcStackn.cX = cX; /* 起点X值入栈 */ GmcStackn.cY = cY; /* 起点Y值入栈 */ n+; /* * 初始化各坐标等高值 */ for (i = 0; i MAZETYPE; i+) for (j = 0; j (ucStep) /* 前方等高值大于计划设定值 */ ucStat+; /* 可前进方向数加1 */ if (GucMapBlockcXcY & 0x02) & /* 右方有路 */ (GucMapStepcX + 1cY (ucStep) /* 右方等高值大于计划设定值 */ ucStat+; /* 可前进方向数加1 */ if (GucMapBlockcXcY & 0x04) & (GucMapStepcXcY - 1 (ucStep) ucStat+; /* 可前进方向数加1 */ if (GucMapBlockcXcY & 0x08) & (GucMapStepcX - 1cY (ucStep) ucStat+; /* 可前进方向数加1 */ /* * 没有可前进的方向,则跳转到最近保存的分支点 * 否则任选一可前进方向前进 */ if (ucStat = 0) n-; cX = GmcStackn.cX; cY = GmcStackn.cY; ucStep = GucMapStepcXcY; else if (ucStat 1) /* 有多个可前进方向,保存坐标 */ GmcStackn.cX = cX; /* 横坐标X值入栈 */ GmcStackn.cY = cY; /* 纵坐标Y值入栈 */ n+; /* * 任意选择一条可前进的方向前进 */ if (GucMapBlockcXcY & 0x01) & /* 上方有路 */ (GucMapStepcXcY + 1 (ucStep) /* 上方等高值大于计划设定值 */ cY+; /* 修改坐标 */ continue; if (GucMapBlockcXcY & 0x02) & /* 右方有路 */ (GucMapStepcX + 1cY (ucStep) /* 右方等高值大于计划设定值 */ cX+; /* 修改坐标 */ continue; if (GucMapBlockcXcY & 0x04) & /* 下方有路 */ (GucMapStepcXcY - 1 (ucStep) /* 下方等高值大于计划设定值 */ cY-; /* 修改坐标 */ continue; if (GucMapBlockcXcY & 0x08) & /* 左方有路 */ (GucMapStepcX - 1cY (ucStep) /* 左方等高值大于计划设定值 */ cX-; /* 修改坐标 */ continue; /* Function name: mouseSpurt* Descriptions: 电脑鼠从起点以最短路径跑向终点* input parameters: 无 * output parameters: 无* Returned value: 无*/void mouseSpurt (void) uint8 ucTemp = 0xff; int8 cXdst = 0,cYdst = 0; /* * 对终点的四个坐标分别制作等高图 * 取离起点最近的一个点作为目标点 */ if (GucMapBlockGucXGoal0GucYGoal0 & 0x0c) /* 判断该终点坐标是否有出口 */ mapStepEdit(GucXGoal0,GucYGoal0); /* 制作等高图 */ if (ucTemp GucMapStepGucXStartGucYStart) /* 保存离起点最近的坐标 */ cXdst = GucXGoal0; cYdst = GucYGoal0; ucTemp = GucMapStepGucXStartGucYStart; if (GucMapBlockGucXGoal0GucYGoal1 & 0x09) /* 判断该终点坐标是否有出口 */ mapStepEdit(GucXGoal0,GucYGoal1); /* 制作等高图 */ if (ucTemp GucMapStepGucXStartGucYStart) /* 保存离起点最近的坐标 */ cXdst = GucXGoal0; cYdst = GucYGoal1; ucTemp = GucMapStepGucXStartGucYStart; if (GucMapBlockGucXGoal1GucYGoal0 & 0x06) /* 判断该终点坐标是否有出口 */ mapStepEdit(GucXGoal1,GucYGoal0); /* 制作等高图 */ if (ucTemp GucMapStepGucXStartGucYStart) /* 保存离起点最近的坐标 */ cXdst = GucXGoal1; cYdst = GucYGoal0; ucTemp = GucMapStepGucXStartGucYStart; if (GucMapBlockGucXGoal1GucYGoal1 & 0x03) /* 判断该终点坐标是否有出口 */ mapStepEdit(GucXGoal1,GucYGoal1); /* 制作等高图 */ if (ucTemp GucMapStepGucXStartGucYStart) /* 保存离起点最近的坐标 */ cXdst = GucXGoal1; cYdst = GucYGoal1; ucTemp = GucMapStepGucXStartGucYStart; objectGoTo(cXdst,cYdst); /* 运行到指定目标点 */* Function name: objectGoTo* Descriptions: 使电脑鼠运动到指定坐标* input parameters: cXdst: 目的地的横坐标* cYdst: 目的地的纵坐标* output parameters: 无* Returned value: 无*/void objectGoTo (int8 cXdst, int8 cYdst) uint8 ucStep = 1; int8 cNBlock = 0, cDirTemp; int8 cX,cY; cX = GmcMouse.cX; cY = GmcMouse.cY; mapStepEdit(cXdst,cYdst); /* 制作等高图 */ /* * 根据等高值向目标点运动,直到达到目的地 */ while (cX != cXdst) | (cY != cYdst) ucStep = GucMapStepcXcY; /* * 任选一个等高值比当前自身等高值小的方向前进 */ if (GucMapBlockcXcY & 0x01) & /* 上方有路 */ (GucMapStepcXcY + 1 ucStep) /* 上方等高值较小 */ cDirTemp = UP; /* 记录方向 */ if (cDirTemp = GucMouseDir) /* 优先选择不需要转弯的方向 */ cNBlock+; /* 前进一个方格 */ cY+; continue; /* 跳过本次循环 */ if (GucMapBlockcXcY & 0x02) & /* 右方有路 */ (GucMapStepcX + 1cY ucStep) /* 右方等高值较小 */ cDirTemp = RIGHT; /* 记录方向 */ if (cDirTemp = GucMouseDir) /* 优先选择不需要转弯的方向 */ cNBlock+; /* 前进一个方格 */ cX+; continue; /* 跳过本次循环 */ if (GucMapBlockcXcY & 0x04) & /* 下方有路 */ (GucMapStepcXcY - 1 ucStep) /* 下方等高值较小 */ cDirTemp = DOWN; /* 记录方向 */ if (cDirTemp = GucMouseDir) /* 优先选择不需要转弯的方向 */ cNBlock+; /* 前进一个方格 */ cY-; continue; /* 跳过本次循环 */ if (GucMapBlockcXcY & 0x08) & /* 左方有路 */ (GucMapStepcX - 1cY ucStep) /* 左方等高值较小 */ cDirTemp = LEFT; /* 记录方向 */ if (cDirTemp = GucMouseDir) /* 优先选择不需要转弯的方向 */ cNBlock+; /* 前进一个方格 */ cX-; continue; /* 跳过本次循环 */ cDirTemp = (cDirTemp + 4 - GucMouseDir)%4; /* 计算方向偏移量 */ if (cNBlock) mouseGoahead(cNBlock); /* 前进cNBlock步 */ cNBlock = 0; /* 任务清零 */ /* * 控制电脑鼠转弯 */ switch (cDirTemp) case 1: mouseTurnright(); break; case 2: mouseTurnback(); break; case 3: mouseTurnleft(); break; default: break; /* * 判断任务是否完成,否则继续前进 */ if (cNBlock) mouseGoahead(cNBlock); /* Function name: mazeBlockDataGet* Descriptions: 根据电脑鼠的相对方向,取出该方向上迷宫格的墙壁资料* input parameters: ucDir: 电脑鼠的相对方向* output parameters: 无* Returned value: GucMapBlockcXcY : 墙壁资料*/uint8 mazeBlockDataGet (uint8 ucDirTemp) cX = 0,cY = 0; /* * 把电脑鼠的相对方向转换为绝对方向 */ switch (ucDirTemp) case MOUSEFRONT: ucDirTemp = GucMouseDir; break; case MOUSELEFT: ucDirTemp = (GucMouseDir + 3) % 4; break; case MOUSERIGHT: ucDirTemp = (GucMouseDir + 1) % 4; break; default: break; /* * 根据绝对方向计算该方向上相邻格的坐标 */ switch (ucDirTemp) case 0: cX = GmcMouse.cX; cY = GmcMouse.cY + 1; break; case 1: cX = GmcMouse.cX + 1; cY = GmcMouse.cY; break; case 2: cX = GmcMouse.cX; cY = GmcMouse.cY - 1; break; case 3: cX = GmcMouse.cX - 1; cY = GmcMouse.cY; break; default: break; return(GucMapBlockcXcY); /* 返回迷宫格上的资料 */* Function name: rightMethod* Descriptions: 右手法则,优先向右前进* input parameters: 无* output parameters: 无* Returned value: 无*/void rightMethod (void) if (GucMapBlockGmcMouse.cXGmcMouse.cY & MOUSEWAY_R) & /* 电脑鼠的右边有路 */ (mazeBlockDataGet(MOUSERIGHT) = 0x00) /* 电脑鼠的右边没有走过 */ mouseTurnright(); /* 电脑鼠右转 */ return; if (GucMapBlockGmcMouse.cXGmcMouse.cY & MOUSEWAY_F) & /* 电脑鼠的前方有路 */ (mazeBlockDataGet(MOUSEFRONT) = 0x00) /* 电脑鼠的前方没有走过 */ return; /* 电脑鼠不用转弯 */ if (GucMapBlockGmcMouse.cXGmcMouse.cY & MOUSEWAY_L) & /* 电脑鼠的左边有路 */ (mazeBlockDataGet(MOUSELEFT ) = 0x00) /* 电脑鼠的左边没有走过 */ mouseTurnleft(); /* 电脑鼠左转 */ return; /* Function name: leftMethod* Descriptions: 左手法则,优先向左运动* input parameters: 无* output parameters: 无* Returned value: 无*/void leftMethod (void) if (GucMapBlockGmcMouse.cXGmcMouse.cY & MOUSEWAY_L) & /* 电脑鼠的左边有路 */ (mazeBlockDataGet(MOUSELEFT ) = 0x00) /* 电脑鼠的左边没有走过 */ mouseTurnleft(); /* 电脑鼠左转 */ return; if (GucMapBlockGmcMouse.cXGmcMouse.cY & MOUSEWAY_F) & /* 电脑鼠的前方有路 */ (mazeBlockDataGet(MOUSEFRONT) = 0x00) /* 电脑鼠的前方没有走过 */ return; /* 电脑鼠不用转弯 */ if (GucMapBlockGmcMouse.cXGmcMouse.cY & MOUSEWAY_R) & /* 电脑鼠的右边有路 */ (mazeBlockDataGet(MOUSERIGHT) = 0x00) /* 电脑鼠的右边没有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合伙买车合同协议书样本
- 线路控制制作合同协议书
- 企业与员工社保合同范本
- 不需负责任协议的合同
- 上海市二手车合同协议
- 招标采购助听器合同范本
- 规划合同范本2025
- 怎样审订货合同范本模板
- 不平等的合同哪种协议
- 怎样签订二手房协议合同
- 智研咨询发布-2025年中国数控折弯机行业产业链全景分析及发展趋势预测报告
- 旅游发展公务员聘用合同范例
- 康复数字化管理系统需求说明
- 注塑车间15个岗位职责说明
- 中国高血压防治指南(2024年修订版)解读课件
- 肾内科护理病历
- 谵妄的观察及护理
- 旅游业应急事故处理及游客服务手册
- 遂川县草林自来水厂标准化管理运行管理手册
- 水利水电施工监理常用表格
- 高三年级年级主任工作计划
评论
0/150
提交评论