找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4541|回复: 2
收起左侧

电脑鼠代码(可以参考,不建议使用)

[复制链接]
ID:419622 发表于 2018-11-2 13:20 | 显示全部楼层 |阅读模式
不建议使用,可以参考

单片机源程序如下:
  1. #include "Maze.h"

  2. /*********************************************************************************************************
  3.   全局变量定义
  4. *********************************************************************************************************/
  5. static uint8    GucXStart                           = 0;                /*  起点横坐标                  */
  6. static uint8    GucYStart                           = 0;                /*  起点纵坐标                  */

  7. static uint8    GucXGoal0                           = XDST0;            /*  终点X坐标,有两个值         */
  8. static uint8    GucXGoal1                           = XDST1;
  9. static uint8    GucYGoal0                           = YDST0;            /*  终点Y坐标,有两个值         */
  10. static uint8    GucYGoal1                           = YDST1;

  11. static uint8    GucMouseTask                        = WAIT;             /*  状态机,初始状态为等待      */

  12. static uint8    GucMapStep[MAZETYPE][MAZETYPE]      = {0xff};           /*  保存各坐标的等高值          */

  13. static MAZECOOR GmcStack[MAZETYPE * MAZETYPE]       = {0};              /* 在mapStepEdit()中作堆栈使用 */
  14. static MAZECOOR GmcCrossway[MAZETYPE * MAZETYPE]    = {0};              /* Main()中暂存未走过支路坐标() */
  15. //用户自定义变量

  16. /*********************************************************************************************************
  17. ** Function name:       Delay
  18. ** Descriptions:        延时函数
  19. ** input parameters:    uiD :延时参数,值越大,延时越久
  20. ** output parameters:   无
  21. ** Returned value:      无
  22. *********************************************************************************************************/
  23. void delay (uint32 uiD)
  24. {
  25.     for (; uiD; uiD--);
  26. }

  27. /*********************************************************************************************************
  28. ** Function name:       mapStepEdit
  29. ** Descriptions:        制作以目标点为起点的等高图
  30. ** input parameters:    uiX:    目的地横坐标
  31. **                      uiY:    目的地纵坐标
  32. ** output parameters:   GucMapStep[][]:  各坐标上的等高值
  33. ** Returned value:      无
  34. *********************************************************************************************************/
  35. void mapStepEdit (int8  cX, int8  cY)
  36. {
  37.     uint8 n         = 0;                                                /*  GmcStack[]下标              */
  38.     uint8 ucStep    = 1;                                                /*  等高值                      */
  39.     uint8 ucStat    = 0;                                                /*  统计可前进的方向数          */
  40.     uint8 i,j;
  41.    
  42.     GmcStack[n].cX  = cX;                                               /*  起点X值入栈                 */
  43.     GmcStack[n].cY  = cY;                                               /*  起点Y值入栈                 */
  44.     n++;
  45.     /*
  46.      *  初始化各坐标等高值
  47.      */
  48.     for (i = 0; i < MAZETYPE; i++) {
  49.         for (j = 0; j < MAZETYPE; j++) {
  50.             GucMapStep[i][j] = 0xff;
  51.         }
  52.     }
  53.     /*
  54.      *  制作等高图,直到堆栈中所有数据处理完毕
  55.      */
  56.     while (n) {
  57.         GucMapStep[cX][cY] = ucStep++;                                  /*  填入等高值                  */

  58.         /*
  59.          *  对当前坐标格里可前进的方向统计
  60.          */
  61.         ucStat = 0;
  62.         if ((GucMapBlock[cX][cY] & 0x01) &&                             /*  前方有路                    */
  63.             (GucMapStep[cX][cY + 1] > (ucStep))) {                      /*  前方等高值大于计划设定值    */
  64.             ucStat++;                                                   /*  可前进方向数加1             */
  65.         }
  66.         if ((GucMapBlock[cX][cY] & 0x02) &&                             /*  右方有路                    */
  67.             (GucMapStep[cX + 1][cY] > (ucStep))) {                      /*  右方等高值大于计划设定值    */
  68.             ucStat++;                                                   /*  可前进方向数加1             */
  69.         }
  70.         if ((GucMapBlock[cX][cY] & 0x04) &&
  71.             (GucMapStep[cX][cY - 1] > (ucStep))) {
  72.             ucStat++;                                                   /*  可前进方向数加1             */
  73.         }
  74.         if ((GucMapBlock[cX][cY] & 0x08) &&
  75.             (GucMapStep[cX - 1][cY] > (ucStep))) {
  76.             ucStat++;                                                   /*  可前进方向数加1             */
  77.         }
  78.         /*
  79.          *  没有可前进的方向,则跳转到最近保存的分支点
  80.          *  否则任选一可前进方向前进
  81.          */
  82.         if (ucStat == 0) {
  83.             n--;
  84.             cX = GmcStack[n].cX;
  85.             cY = GmcStack[n].cY;
  86.             ucStep = GucMapStep[cX][cY];
  87.         } else {
  88.             if (ucStat > 1) {                                           /*  有多个可前进方向,保存坐标  */
  89.                 GmcStack[n].cX = cX;                                    /*  横坐标X值入栈               */
  90.                 GmcStack[n].cY = cY;                                    /*  纵坐标Y值入栈               */
  91.                 n++;
  92.             }
  93.             /*
  94.              *  任意选择一条可前进的方向前进
  95.              */
  96.             if ((GucMapBlock[cX][cY] & 0x01) &&                         /*  上方有路                    */
  97.                 (GucMapStep[cX][cY + 1] > (ucStep))) {                  /*  上方等高值大于计划设定值    */
  98.                 cY++;                                                   /*  修改坐标                    */
  99.                 continue;
  100.             }
  101.             if ((GucMapBlock[cX][cY] & 0x02) &&                         /*  右方有路                    */
  102.                 (GucMapStep[cX + 1][cY] > (ucStep))) {                  /*  右方等高值大于计划设定值    */
  103.                 cX++;                                                   /*  修改坐标                    */
  104.                 continue;
  105.             }
  106.             if ((GucMapBlock[cX][cY] & 0x04) &&                         /*  下方有路                    */
  107.                 (GucMapStep[cX][cY - 1] > (ucStep))) {                  /*  下方等高值大于计划设定值    */
  108.                 cY--;                                                   /*  修改坐标                    */
  109.                 continue;
  110.             }
  111.             if ((GucMapBlock[cX][cY] & 0x08) &&                         /*  左方有路                    */
  112.                 (GucMapStep[cX - 1][cY] > (ucStep))) {                  /*  左方等高值大于计划设定值    */
  113.                 cX--;                                                   /*  修改坐标                    */
  114.                 continue;
  115.             }
  116.         }
  117.     }
  118. }
  119. /*********************************************************************************************************
  120. ** Function name:       mouseSpurt
  121. ** Descriptions:        电脑鼠从起点以最短路径跑向终点
  122. ** input parameters:    无
  123. ** output parameters:  无
  124. ** Returned value:      无
  125. *********************************************************************************************************/
  126. void mouseSpurt (void)
  127. {
  128.     uint8 ucTemp = 0xff;
  129.     int8    cXdst = 0,    cYdst = 0;
  130.     /*
  131.      *  对终点的四个坐标分别制作等高图
  132.      *  取离起点最近的一个点作为目标点
  133.      */
  134.     if (GucMapBlock[GucXGoal0][GucYGoal0] & 0x0c) {                     /*  判断该终点坐标是否有出口    */
  135.         mapStepEdit(GucXGoal0,GucYGoal0);                               /*  制作等高图                  */
  136.         if (ucTemp > GucMapStep[GucXStart][GucYStart]) {                /*  保存离起点最近的坐标        */
  137.             cXdst  = GucXGoal0;
  138.             cYdst  = GucYGoal0;
  139.             ucTemp = GucMapStep[GucXStart][GucYStart];
  140.         }
  141.     }
  142.     if (GucMapBlock[GucXGoal0][GucYGoal1] & 0x09) {                     /*  判断该终点坐标是否有出口    */
  143.         mapStepEdit(GucXGoal0,GucYGoal1);                               /*  制作等高图                  */
  144.         if (ucTemp > GucMapStep[GucXStart][GucYStart]) {                /*  保存离起点最近的坐标        */
  145.             cXdst  = GucXGoal0;
  146.             cYdst  = GucYGoal1;
  147.             ucTemp = GucMapStep[GucXStart][GucYStart];
  148.         }
  149.     }
  150.     if (GucMapBlock[GucXGoal1][GucYGoal0] & 0x06) {                     /*  判断该终点坐标是否有出口    */
  151.         mapStepEdit(GucXGoal1,GucYGoal0);                               /*  制作等高图                  */
  152.         if (ucTemp > GucMapStep[GucXStart][GucYStart]) {                /*  保存离起点最近的坐标        */
  153.             cXdst  = GucXGoal1;
  154.             cYdst  = GucYGoal0;
  155.             ucTemp = GucMapStep[GucXStart][GucYStart];
  156.         }
  157.     }
  158.     if (GucMapBlock[GucXGoal1][GucYGoal1] & 0x03) {                     /*  判断该终点坐标是否有出口    */
  159.         mapStepEdit(GucXGoal1,GucYGoal1);                               /*  制作等高图                  */
  160.         if (ucTemp > GucMapStep[GucXStart][GucYStart]) {                /*  保存离起点最近的坐标        */
  161.             cXdst  = GucXGoal1;
  162.             cYdst  = GucYGoal1;
  163.             ucTemp = GucMapStep[GucXStart][GucYStart];
  164.         }
  165.     }
  166.     zlg7289Download(1, 0, 1, 1);
  167.     zlg7289Download(1, 1, 1, 1);
  168.     zlg7289Download(1, 2, 1, 2);
  169.     zlg7289Download(1, 3, 1, 3);   
  170.     zlg7289Download(1, 4, 1, 4);   

  171.     objectGoTo(cXdst,cYdst);                                            /*  运行到指定目标点            */
  172. }
  173. /*********************************************************************************************************
  174. ** Function name:       objectGoTo
  175. ** Descriptions:        使电脑鼠运动到指定坐标
  176. ** input parameters:    cXdst: 目的地的横坐标
  177. **                      cYdst: 目的地的纵坐标
  178. ** output parameters:   无
  179. ** Returned value:      无
  180. *********************************************************************************************************/
  181. void objectGoTo (int8  x, int8  y)
  182. {
  183.     uint8 ucStep = 1;
  184.     int8  cNBlock = 0, cDirTemp;
  185.     int8 cX,cY;
  186.     cX = GmcMouse.cX;
  187.     cY = GmcMouse.cY;
  188.     mapStepEdit(x,y);                                           /*  制作等高图                  */
  189.     /*
  190.      *  根据等高值向目标点运动,直到达到目的地
  191.      */
  192.     while ((cX != x) || (cY != y)) {
  193.         ucStep = GucMapStep[cX][cY];
  194.         /*
  195.          *  任选一个等高值比当前自身等高值小的方向前进
  196.          */
  197.         if ((GucMapBlock[cX][cY] & 0x01) &&                             /*  上方有路                    */
  198.             (GucMapStep[cX][cY + 1] < ucStep)) {                        /*  上方等高值较小              */
  199.             cDirTemp = UP;                                              /*  记录方向                    */
  200.             if (cDirTemp == GucMouseDir) {                              /*  优先选择不需要转弯的方向    */
  201.                 cNBlock++;                                              /*  前进一个方格                */
  202.                 cY++;
  203.                 continue;                                               /*  跳过本次循环                */
  204.             }
  205.         }
  206.         if ((GucMapBlock[cX][cY] & 0x02) &&                             /*  右方有路                    */
  207.             (GucMapStep[cX + 1][cY] < ucStep)) {                        /*  右方等高值较小              */
  208.             cDirTemp = RIGHT;                                           /*  记录方向                    */
  209.             if (cDirTemp == GucMouseDir) {                              /*  优先选择不需要转弯的方向    */
  210.                 cNBlock++;                                              /*  前进一个方格                */
  211.                 cX++;
  212.                 continue;                                               /*  跳过本次循环                */
  213.             }
  214.         }
  215.         if ((GucMapBlock[cX][cY] & 0x04) &&                             /*  下方有路                    */
  216.             (GucMapStep[cX][cY - 1] < ucStep)) {                        /*  下方等高值较小              */
  217.             cDirTemp = DOWN;                                            /*  记录方向                    */
  218.             if (cDirTemp == GucMouseDir) {                              /*  优先选择不需要转弯的方向    */
  219.                 cNBlock++;                                              /*  前进一个方格                */
  220.                 cY--;
  221.                 continue;                                               /*  跳过本次循环                */
  222.             }
  223.         }
  224.         if ((GucMapBlock[cX][cY] & 0x08) &&                             /*  左方有路                    */
  225.             (GucMapStep[cX - 1][cY] < ucStep)) {                        /*  左方等高值较小              */
  226.             cDirTemp = LEFT;                                            /*  记录方向                    */
  227.             if (cDirTemp == GucMouseDir) {                              /*  优先选择不需要转弯的方向    */
  228.                 cNBlock++;                                              /*  前进一个方格                */
  229.                 cX--;
  230.                 continue;                                               /*  跳过本次循环                */
  231.             }
  232.         }
  233.         cDirTemp = (cDirTemp + 4 - GucMouseDir)%4;                      /*  计算方向偏移量              */
  234.         
  235.         if (cNBlock) {
  236.             mouseGoahead(cNBlock);                                      /*  前进cNBlock步               */
  237.         }        
  238.         cNBlock = 0;                                                    /*  任务清零                    */
  239.         
  240.         /*
  241.          *  控制电脑鼠转弯
  242.          */
  243.         switch (cDirTemp) {

  244.         case 1:
  245.             mouseTurnright();
  246.             break;

  247.         case 2:
  248.             mouseTurnback();
  249.             break;

  250.         case 3:
  251.             mouseTurnleft();
  252.             break;

  253.         default:
  254.             break;
  255.         }
  256.     }
  257.     /*
  258.      *  判断任务是否完成,否则继续前进
  259.      */
  260.     if (cNBlock) {
  261.         mouseGoahead(cNBlock);
  262.     }
  263. }
  264. /*********************************************************************************************************
  265. ** Function name:       mazeBlockDataGet
  266. ** Descriptions:        根据电脑鼠的相对方向,取出该方向上迷宫格的墙壁资料
  267. ** input parameters:    ucDir: 电脑鼠的相对方向
  268. ** output parameters:   无
  269. ** Returned value:      GucMapBlock[cX][cY] : 墙壁资料
  270. *********************************************************************************************************/
  271. uint8 mazeBlockDataGet (uint8  ucDirTemp)
  272. {
  273.     int8 cX = 0,cY = 0;
  274.    
  275.     /*
  276.      *  把电脑鼠的相对方向转换为绝对方向
  277.      */
  278.     switch (ucDirTemp) {

  279.     case MOUSEFRONT:
  280.         ucDirTemp = GucMouseDir;
  281.         break;

  282.     case MOUSELEFT:
  283.         ucDirTemp = (GucMouseDir + 3) % 4;
  284.         break;

  285.     case MOUSERIGHT:
  286.         ucDirTemp = (GucMouseDir + 1) % 4;
  287.         break;

  288.     default:
  289.         break;
  290.     }
  291.    
  292.     /*
  293.      *  根据绝对方向计算该方向上相邻格的坐标
  294.      */
  295.     switch (ucDirTemp) {

  296.     case 0:
  297.         cX = GmcMouse.cX;
  298.         cY = GmcMouse.cY + 1;
  299.         break;
  300.         
  301.     case 1:
  302.         cX = GmcMouse.cX + 1;
  303.         cY = GmcMouse.cY;
  304.         break;
  305.         
  306.     case 2:
  307.         cX = GmcMouse.cX;
  308.         cY = GmcMouse.cY - 1;
  309.         break;
  310.         
  311.     case 3:
  312.         cX = GmcMouse.cX - 1;
  313.         cY = GmcMouse.cY;
  314.         break;
  315.         
  316.     default:
  317.         break;
  318.     }
  319.    
  320.     return(GucMapBlock[cX][cY]);                                        /*  返回迷宫格上的资料          */
  321. }
  322. /*********************************************************************************************************
  323. ** Function name:       rightMethod
  324. ** Descriptions:        右手法则,优先向右前进
  325. ** input parameters:    无
  326. ** output parameters:   无
  327. ** Returned value:      无
  328. *********************************************************************************************************/
  329. void rightMethod (void)
  330. {
  331.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_R) &&         /*  电脑鼠的右边有路            */
  332.         (mazeBlockDataGet(MOUSERIGHT) == 0x00)) {                       /*  电脑鼠的右边没有走过        */
  333.         //delay(20000);
  334.        // delay(10000);
  335.         mouseTurnright();                                               /*  电脑鼠右转                  */
  336.         return;
  337.     }
  338.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_F) &&         /*  电脑鼠的前方有路            */
  339.         (mazeBlockDataGet(MOUSEFRONT) == 0x00)) {                       /*  电脑鼠的前方没有走过        */
  340.         return;                                                         /*  电脑鼠不用转弯              */
  341.     }
  342.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_L) &&         /*  电脑鼠的左边有路            */
  343.         (mazeBlockDataGet(MOUSELEFT ) == 0x00)) {                       /*  电脑鼠的左边没有走过        */
  344.        // delay(20000);
  345.        // delay(10000);
  346.         mouseTurnleft();                                                /*  电脑鼠左转                  */
  347.         return;
  348.     }
  349. }
  350. /*********************************************************************************************************
  351. ** Function name:       leftMethod
  352. ** Descriptions:        左手法则,优先向左运动
  353. ** input parameters:    无
  354. ** output parameters:   无
  355. ** Returned value:      无
  356. *********************************************************************************************************/
  357. void leftMethod (void)
  358. {
  359.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_L) &&         /*  电脑鼠的左边有路            */
  360.         (mazeBlockDataGet(MOUSELEFT ) == 0x00)) {                       /*  电脑鼠的左边没有走过        */
  361.         //delay(20000);
  362.        // delay(10000);
  363.         mouseTurnleft();                                                /*  电脑鼠左转                  */
  364.         return;
  365.     }
  366.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_F) &&         /*  电脑鼠的前方有路            */
  367.         (mazeBlockDataGet(MOUSEFRONT) == 0x00)) {                       /*  电脑鼠的前方没有走过        */
  368.         return;                                                         /*  电脑鼠不用转弯              */
  369.     }
  370.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_R) &&         /*  电脑鼠的右边有路            */
  371.         (mazeBlockDataGet(MOUSERIGHT) == 0x00)) {                       /*  电脑鼠的右边没有走过        */
  372.         //delay(20000);
  373.        // delay(10000);
  374.         mouseTurnright();                                               /*  电脑鼠右转                  */
  375.         return;
  376.     }
  377. }
  378. /*********************************************************************************************************
  379. ** Function name:       frontRightMethod
  380. ** Descriptions:        中右法则,优先向前运行,其次向右
  381. ** input parameters:    无
  382. ** output parameters:   无
  383. ** Returned value:      无
  384. *********************************************************************************************************/
  385. void frontRightMethod (void)
  386. {
  387.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_F) &&         /*  电脑鼠的前方有路            */
  388.         (mazeBlockDataGet(MOUSEFRONT) == 0x00)) {                       /*  电脑鼠的前方没有走过        */
  389.         return;                                                         /*  电脑鼠不用转弯              */
  390.     }
  391.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_R) &&         /*  电脑鼠的右边有路            */
  392.         (mazeBlockDataGet(MOUSERIGHT) == 0x00)) {                       /*  电脑鼠的右边没有走过        */
  393.         //delay(20000);
  394.         //delay(10000);
  395.         mouseTurnright();                                               /*  电脑鼠右转                  */
  396.         return;
  397.     }
  398.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_L) &&         /*  电脑鼠的左边有路            */
  399.         (mazeBlockDataGet(MOUSELEFT ) == 0x00)) {                       /*  电脑鼠的左边没有走过        */
  400.         //delay(20000);
  401.        // delay(10000);
  402.         mouseTurnleft();                                                /*  电脑鼠左转                  */
  403.         return;
  404.     }
  405. }
  406. /*********************************************************************************************************
  407. ** Function name:       frontLeftMethod
  408. ** Descriptions:        中左法则,优先向前运行,其次向左
  409. ** input parameters:    无
  410. ** output parameters:   无
  411. ** Returned value:      无
  412. *********************************************************************************************************/
  413. void frontLeftMethod (void)
  414. {
  415.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_F) &&         /*  电脑鼠的前方有路            */
  416.         (mazeBlockDataGet(MOUSEFRONT) == 0x00)) {                       /*  电脑鼠的前方没有走过        */
  417.         return;                                                         /*  电脑鼠不用转弯              */
  418.     }
  419.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_L) &&         /*  电脑鼠的左边有路            */
  420.         (mazeBlockDataGet(MOUSELEFT ) == 0x00)) {                       /*  电脑鼠的左边没有走过        */
  421.         //delay(20000);
  422.        // delay(10000);
  423.         mouseTurnleft();                                                /*  电脑鼠左转                  */
  424.         return;
  425.     }
  426.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_R) &&         /*  电脑鼠的右边有路            */
  427.         (mazeBlockDataGet(MOUSERIGHT) == 0x00)) {                       /*  电脑鼠的右边没有走过        */
  428.         //delay(20000);
  429.        // delay(10000);
  430.         mouseTurnright();                                               /*  电脑鼠右转                  */
  431.         return;
  432.     }
  433. }
  434. /*********************************************************************************************************
  435. ** Function name:       centralMethod
  436. ** Descriptions:        中心法则,根据电脑鼠目前在迷宫中所处的位置觉定使用何种搜索法则
  437. ** input parameters:    无
  438. ** output parameters:   无
  439. ** Returned value:      无
  440. *********************************************************************************************************/
  441. void centralMethod (void)
  442. {
  443.     if (!(GmcMouse.cX & 0x08)) {
  444.         if (!(GmcMouse.cY & 0x08)) {
  445.          
  446.             /*
  447.              *  此时电脑鼠在迷宫的左下角
  448.              */   
  449.             switch (GucMouseDir) {
  450.                
  451.             case UP:                                                    /*  当前电脑鼠向上              */
  452.             //    delay(20000);  
  453.                 frontRightMethod();                                     /*  中右法则                    */
  454.                 break;

  455.             case RIGHT:                                                 /*  当前电脑鼠向右              */
  456.             //    delay(20000);
  457.                 frontLeftMethod();                                      /*  中左法则                    */
  458.                 break;

  459.             case DOWN:                                                  /*  当前电脑鼠向下              */
  460.             //    delay(20000);
  461.                 leftMethod();                                           /*  左手法则                    */
  462.                 break;

  463.             case LEFT:                                                  /*  当前电脑鼠向左              */
  464.             //    delay(20000);
  465.                 rightMethod();                                          /*  右手法则                    */
  466.                 break;

  467.             default:
  468.                 break;
  469.             }

  470.         } else {
  471.          
  472.             /*
  473.              *  此时电脑鼠在迷宫的左上角
  474.              */   
  475.             switch (GucMouseDir) {
  476.                
  477.             case UP:                                                    /*  当前电脑鼠向上              */
  478.             //    delay(20000);
  479.                 rightMethod();                                          /*  右手法则                    */
  480.                 break;

  481.             case RIGHT:                                                 /*  当前电脑鼠向右              */
  482.             //    delay(20000);
  483.                 frontRightMethod();                                     /*  中右法则                    */
  484.                 break;

  485.             case DOWN:                                                  /*  当前电脑鼠向下              */
  486.             //    delay(20000);
  487.                 frontLeftMethod();                                      /*  中左法则                    */
  488.                 break;

  489.             case LEFT:                                                  /*  当前电脑鼠向左              */
  490.             //    delay(20000);
  491.                 leftMethod();                                           /*  左手法则                    */
  492.                 break;

  493.             default:
  494.                 break;
  495.             }
  496.         }
  497.     } else {
  498.         if (!(GmcMouse.cY & 0x08)) {
  499.          
  500.             /*
  501.              *  此时电脑鼠在迷宫的右下角
  502.              */   
  503.             switch (GucMouseDir) {
  504.                
  505.             case UP:                                                    /*  当前电脑鼠向上              */
  506.             //    delay(20000);
  507.                 frontLeftMethod();                                      /*  中左法则                    */
  508.                 break;

  509.             case RIGHT:                                                 /*  当前电脑鼠向右              */
  510.             //    delay(20000);
  511.                 leftMethod();                                           /*  左手法则                    */
  512.                 break;

  513.             case DOWN:                                                  /*  当前电脑鼠向下              */
  514.             //    delay(20000);
  515.                 rightMethod();                                          /*  右手法则                    */
  516.                 break;

  517.             case LEFT:                                                  /*  当前电脑鼠向左              */
  518.            //     delay(20000);
  519.                 frontRightMethod();                                     /*  中右法则                    */
  520.                 break;

  521.             default:
  522.                 break;
  523.             }
  524.             
  525.         } else {

  526.             /*
  527.              *  此时电脑鼠在迷宫的右上角
  528.              */
  529.             switch (GucMouseDir) {
  530.                
  531.             case UP:                                                    /*  当前电脑鼠向上              */
  532.            //     delay(20000);
  533.                 leftMethod();                                           /*  左手法则                    */
  534.                 break;

  535.             case RIGHT:                                                 /*  当前电脑鼠向右              */
  536.            //     delay(20000);
  537.                 rightMethod();                                          /*  右手法则                    */
  538.                 break;

  539.             case DOWN:                                                  /*  当前电脑鼠向下              */
  540.            //     delay(20000);
  541.                 frontRightMethod();                                     /*  中右法则                    */
  542.                 break;

  543.             case LEFT:                                                  /*  当前电脑鼠向左              */
  544.             //    delay(20000);
  545.                 frontLeftMethod();                                      /*  中左法则                    */
  546.                 break;

  547.             default:
  548.                 break;
  549.             }            
  550.         }
  551.     }
  552. }

  553. //搜索返回的法则
  554. void mazeBackChoice()
  555. {
  556.     if (!(GmcMouse.cX & 0x08)) {
  557.         if (!(GmcMouse.cY & 0x08)) {
  558.          
  559.             /*
  560.              *  此时电脑鼠在迷宫的左下角
  561.              */   
  562.             switch (GucMouseDir) {
  563.                
  564.             case UP:                                                    /*  当前电脑鼠向上              */
  565.             //    delay(20000);  
  566.                 frontRightMethod();                                     /*  中右法则                    */
  567.                 break;

  568.             case RIGHT:                                                 /*  当前电脑鼠向右              */
  569.             //    delay(20000);
  570.                 frontLeftMethod();                                      /*  中左法则                    */
  571.                 break;

  572.             case DOWN:                                                  /*  当前电脑鼠向下              */
  573.             //    delay(20000);
  574.                 leftMethod();                                           /*  左手法则                    */
  575.                 break;

  576.             case LEFT:                                                  /*  当前电脑鼠向左              */
  577.             //    delay(20000);
  578.                 rightMethod();                                          /*  右手法则                    */
  579.                 break;

  580.             default:
  581.                 break;
  582.             }

  583.         } else {
  584.          
  585.             /*
  586.              *  此时电脑鼠在迷宫的左上角
  587.              */   
  588.             switch (GucMouseDir) {
  589.                
  590.             case UP:                                                    /*  当前电脑鼠向上              */
  591.             //    delay(20000);
  592.                 rightMethod();                                          /*  右手法则                    */
  593.                 break;

  594.             case RIGHT:                                                 /*  当前电脑鼠向右              */
  595.             //    delay(20000);
  596.                 frontRightMethod();                                     /*  中右法则                    */
  597.                 break;

  598.             case DOWN:                                                  /*  当前电脑鼠向下              */
  599.             //    delay(20000);
  600.                 frontLeftMethod();                                      /*  中左法则                    */
  601.                 break;

  602.             case LEFT:                                                  /*  当前电脑鼠向左              */
  603.             //    delay(20000);
  604.                 leftMethod();                                           /*  左手法则                    */
  605.                 break;

  606.             default:
  607.                 break;
  608.             }
  609.         }
  610.     } else {
  611.         if (!(GmcMouse.cY & 0x08)) {
  612.          
  613.             /*
  614.              *  此时电脑鼠在迷宫的右下角
  615.              */   
  616.             switch (GucMouseDir) {
  617.                
  618.             case UP:                                                    /*  当前电脑鼠向上              */
  619.             //    delay(20000);
  620.                 frontLeftMethod();                                      /*  中左法则                    */
  621.                 break;

  622.             case RIGHT:                                                 /*  当前电脑鼠向右              */
  623.             //    delay(20000);
  624.                 leftMethod();                                           /*  左手法则                    */
  625.                 break;

  626.             case DOWN:                                                  /*  当前电脑鼠向下              */
  627.             //    delay(20000);
  628.                 rightMethod();                                          /*  右手法则                    */
  629.                 break;

  630.             case LEFT:                                                  /*  当前电脑鼠向左              */
  631.            //     delay(20000);
  632.                 frontRightMethod();                                     /*  中右法则                    */
  633.                 break;

  634.             default:
  635.                 break;
  636.             }
  637.             
  638.         } else {

  639.             /*
  640.              *  此时电脑鼠在迷宫的右上角
  641.              */
  642.             switch (GucMouseDir) {
  643.                
  644.             case UP:                                                    /*  当前电脑鼠向上              */
  645.            //     delay(20000);
  646.                 leftMethod();                                           /*  左手法则                    */
  647.                 break;

  648.             case RIGHT:                                                 /*  当前电脑鼠向右              */
  649.            //     delay(20000);
  650.                 rightMethod();                                          /*  右手法则                    */
  651.                 break;

  652.             case DOWN:                                                  /*  当前电脑鼠向下              */
  653.            //     delay(20000);
  654.                 frontRightMethod();                                     /*  中右法则                    */
  655.                 break;

  656.             case LEFT:                                                  /*  当前电脑鼠向左              */
  657.             //    delay(20000);
  658.                 frontLeftMethod();                                      /*  中左法则                    */
  659.                 break;

  660.             default:
  661.                 break;
  662.             }            
  663.         }
  664.     }
  665. }
  666. /*********************************************************************************************************
  667. ** Function name:       crosswayCheck
  668. ** Descriptions:        统计某坐标存在还未走过的支路数
  669. ** input parameters:    ucX,需要检测点的横坐标
  670. **                      ucY,需要检测点的纵坐标
  671. ** output parameters:   无
  672. ** Returned value:      ucCt,未走过的支路数
  673. *********************************************************************************************************/
  674. uint8 crosswayCheck (int8  cX, int8  cY)
  675. {
  676.     uint8 ucCt = 0;
  677.     if ((GucMapBlock[cX][cY] & 0x01) &&                                 /*  绝对方向,迷宫上方有路      */
  678.         (GucMapBlock[cX][cY + 1]) == 0x00) {                            /*  绝对方向,迷宫上方未走过    */
  679.         ucCt++;                                                         /*  可前进方向数加1             */
  680.     }
  681.     if ((GucMapBlock[cX][cY] & 0x02) &&                                 /*  绝对方向,迷宫右方有路      */
  682.         (GucMapBlock[cX + 1][cY]) == 0x00) {                            /*  绝对方向,迷宫右方没有走过  */
  683.         ucCt++;                                                         /*  可前进方向数加1             */
  684.     }
  685.     if ((GucMapBlock[cX][cY] & 0x04) &&                                 /*  绝对方向,迷宫下方有路      */
  686.         (GucMapBlock[cX][cY - 1]) == 0x00) {                            /*  绝对方向,迷宫下方未走过    */
  687.         ucCt++;                                                         /*  可前进方向数加1             */
  688.     }
  689.     if ((GucMapBlock[cX][cY] & 0x08) &&                                 /*  绝对方向,迷宫左方有路      */
  690.         (GucMapBlock[cX - 1][cY]) == 0x00) {                            /*  绝对方向,迷宫左方未走过    */
  691.         ucCt++;                                                         /*  可前进方向数加1             */
  692.     }
  693.     return ucCt;
  694. }
  695. /*********************************************************************************************************
  696. ** Function name:       crosswayChoice
  697. ** Descriptions:        选择一条支路作为前进方向
  698. ** input parameters:    无
  699. ** output parameters:   无
  700. ** Returned value:      无
  701. *********************************************************************************************************/
  702. void crosswayChoice (void)
  703. {
  704.     switch (SEARCHMETHOD) {
  705.         
  706.     case RIGHTMETHOD:
  707.         rightMethod();
  708.         break;
  709.    
  710.     case LEFTMETHOD:
  711.         leftMethod();
  712.         break;
  713.    
  714.     case CENTRALMETHOD:
  715.         centralMethod();
  716.         break;

  717.     case FRONTRIGHTMETHOD:
  718.         frontRightMethod();
  719.         break;

  720.     case FRONTLEFTMETHOD:
  721.         frontLeftMethod();
  722.         break;

  723.     default:
  724.         break;
  725.     }
  726. }
  727. /*********************************************************************************************************
  728. ** Function name:      StopMazeSearch
  729. ** Descriptions:      停止向前搜索的函数   
  730. ** input parameters:    当前的坐标
  731. ** output parameters:     无
  732. ** Returned value:      0代表结束,1代表继续
  733. *********************************************************************************************************/
  734. int8 StopMazeSearch(int8 cX,int8 cY)
  735. {
  736.     if(cX==7 && cY==7)
  737.         return 1;
  738.     if(cX==8 && cY==7)
  739.         return 1;
  740.     if(cX==7 && cY==8)
  741.         return 1;
  742.     if(cX==8 && cY==8)
  743.         return 1;
  744.     return 0;
  745. }
  746. /*********************************************************************************************************
  747. ** Function name:      FastOperating
  748. ** Descriptions:     对特殊格子处理的函数  
  749. ** input parameters:    当前的坐标
  750. ** output parameters:     无
  751. ** Returned value:      1表示前方,2表示右方,3表示后方,4表示左方
  752. *********************************************************************************************************/
  753. int8 FastOperating(int8 cX,int8 cY)
  754. {
  755.   if(cX==5 && cY==7){
  756.       if(GucMapBlock[cX][cY] & 0x02)
  757.         return 2;
  758.   }
  759.   if(cX==5 && cY==8){
  760.       if(GucMapBlock[cX][cY] & 0x02)
  761.         return 2;
  762.   }
  763.   
  764.   if(cX==6 && cY==7){
  765.       if(GucMapBlock[cX][cY] & 0x02)
  766.         return 2;
  767.   }
  768.   if(cX==6 && cY==8){
  769.       if(GucMapBlock[cX][cY] & 0x02)
  770.         return 2;
  771.   }
  772.   
  773.   if(cX==7 && cY==5){
  774.       if(GucMapBlock[cX][cY] & 0x01)
  775.         return 1;
  776.   }
  777.   if(cX==8 && cY==5){
  778.       if(GucMapBlock[cX][cY] & 0x01)
  779.         return 1;
  780.   }
  781.   if(cX==7 && cY==6){
  782.       if(GucMapBlock[cX][cY] & 0x01)
  783.         return 1;
  784.   }
  785.   if(cX==8 && cY==6){
  786.       if(GucMapBlock[cX][cY] & 0x01)
  787.         return 1;
  788.   }
  789.   
  790.   if(cX==10 && cY==7){
  791.       if(GucMapBlock[cX][cY] & 0x08)
  792.         return 4;
  793.   }
  794.   if(cX==10 && cY==8){
  795.       if(GucMapBlock[cX][cY] & 0x08)
  796.         return 4;
  797.   }
  798.   if(cX==9 && cY==7){
  799.       if(GucMapBlock[cX][cY] & 0x08)
  800.         return 4;
  801.   }
  802.   if(cX==9 && cY==8){
  803.       if(GucMapBlock[cX][cY] & 0x08)
  804.         return 4;
  805.   }
  806.   
  807.   if(cX==8 && cY==10){
  808.       if(GucMapBlock[cX][cY] & 0x04)
  809.         return 3;
  810.   }
  811.   if(cX==7 && cY==10){
  812.       if(GucMapBlock[cX][cY] & 0x04)
  813.         return 3;
  814.   }
  815.   if(cX==8 && cY==9){
  816.       if(GucMapBlock[cX][cY] & 0x04)
  817.         return 3;
  818.   }
  819.   if(cX==7 && cY==9){
  820.       if(GucMapBlock[cX][cY] & 0x04)
  821.         return 3;
  822.   }
  823.   return 0;
  824. }
  825. /*********************************************************************************************************
  826. ** Function name:       piontMethod
  827. ** Descriptions:        向点法则,电脑鼠从终点找起点
  828. ** input parameters:    无
  829. ** output parameters:   无
  830. ** Returned value:      无
  831. *********************************************************************************************************/
  832. void piontMethod(void)
  833. {
  834.     switch(GucMouseDir)
  835.     {
  836.     case UP:
  837.       leftMethod();
  838.       break;
  839.     case RIGHT:
  840.       rightMethod();
  841.       break;
  842.     case DOWN:
  843.       frontRightMethod();
  844.       break;
  845.     case LEFT:
  846.       frontLeftMethod();
  847.       break;
  848.     default:
  849.       break;
  850.     }
  851. }
  852. /*********************************************************************************************************
  853. ** Function name:      StopMazeSearch
  854. ** Descriptions:      停止向前搜索的函数   
  855. ** input parameters:    当前的坐标
  856. ** output parameters:     无
  857. ** Returned value:      0代表结束,1代表继续
  858. *********************************************************************************************************/
  859. int8 StopSearch(int8 cX,int8 cY,int8 n)
  860. {
  861.    int8 i;
  862.    for(i=0;i<n;i++){
  863.       if(GmcCrossway[i].cX == cX && GmcCrossway[i].cY == cY){
  864.           return 1;
  865.       }
  866.    }
  867.    if(cX==7 && cY==7)
  868.        return 1;
  869.    if(cX==8 && cY==7)
  870.        return 1;
  871.    if(cX==7 && cY==8)
  872.        return 1;
  873.    if(cX==8 && cY==8)
  874.        return 1;
  875.     return 0;
  876. }
  877. /*********************************************************************************************************
  878. ** Function name:       main
  879. ** Descriptions:      主函数
  880. ** input parameters:    无
  881. ** output parameters:   无
  882. ** Returned value:      无
  883. *********************************************************************************************************/
  884. main (void)
  885. {
  886.     uint8 n          = 0;                                               /*  GmcCrossway[]下标           */  
  887.     uint8 ucRoadStat = 0;                                               /*  统计某一坐标可前进的支路数  */
  888.     uint8 ucTemp     = 0;                                               /*  用于START状态中坐标转换     */
  889.    
  890.     //用户自定义变量
  891.     int8    cXdst = 0,    cYdst = 0;
  892.    
  893.     mouseInit();                                                        /*  底层驱动的初始化            */
  894.     zlg7289Init();                                                      /*  显示模块初始化              */

  895.     while (1) {
  896.         switch (GucMouseTask) {                                         /*  状态机处理                  */
  897.             
  898.         case WAIT:
  899.             sensorDebug();
  900.             voltageDetect();
  901.             delay(100000);
  902.             if (keyCheck() == true) {                                   /*  检测按键等待启动            */
  903.                 zlg7289Reset();                                         /*  复位ZLG7289                 */
  904.                 GucMouseTask = START;
  905.             }
  906.             break;
  907.             
  908.         case START:                                                     /*  判断电脑鼠起点的横坐标      */
  909.             mazeSearch();                                               /*  向前搜索                    */
  910.             if (GucMapBlock[GmcMouse.cX][GmcMouse.cY] & 0x08) {         /*  判断电老鼠左边是否存在出口  */
  911.                 if (MAZETYPE == 8) {                                    /*  修改四分之一迷宫的终点坐标  */
  912.                     GucXGoal0 = 1;
  913.                     GucXGoal1 = 0;
  914.                 }
  915.                 GucXStart   = MAZETYPE - 1;                             /*  修改电脑鼠起点的横坐标      */
  916.                 GmcMouse.cX = MAZETYPE - 1;                             /*  修改电脑鼠当前位置的横坐标  */   
  917.                 /*
  918.                  *  由于默认的起点为(0,0),现在需要把已记录的墙壁资料转换过来
  919.                  */
  920.                 ucTemp = GmcMouse.cY;
  921.                 do {
  922.                     GucMapBlock[MAZETYPE - 1][ucTemp] = GucMapBlock[0][ucTemp];
  923.                     GucMapBlock[0 ][ucTemp] = 0;
  924.                 }while (ucTemp--);
  925.                 /*
  926.                  *  在OFFSHOOT[0]中保存起点坐标
  927.                  */
  928.                 GmcCrossway[n].cX = MAZETYPE - 1;
  929.                 GmcCrossway[n].cY = 0;
  930.                 n++;
  931.                 GucMouseTask = MAZESEARCH;                              /*  状态转换为搜寻状态          */
  932.             }
  933.             if (GucMapBlock[GmcMouse.cX][GmcMouse.cY] & 0x02) {         /*  判断电老鼠右边是否存在出口  */
  934.                 /*
  935.                  *  在OFFSHOOT[0]中保存起点坐标
  936.                  */
  937.                 GmcCrossway[n].cX = 0;
  938.                 GmcCrossway[n].cY = 0;
  939.                 n++;
  940.                 GucMouseTask = MAZESEARCH;                              /*  状态转换为搜寻状态          */
  941.             }
  942.             break;
  943.             
  944.         case MAZESEARCH:
  945.               //从起点搜索找终点
  946.               if(StopMazeSearch(GmcMouse.cX,GmcMouse.cY)==1){
  947.                     cXdst=GmcMouse.cX,cYdst=GmcMouse.cY;
  948.                     mouseTurnback();
  949.                     GucMouseTask = BACKSEARCH;
  950.                     n--;
  951.                     objectGoTo(GmcCrossway[n].cX,GmcCrossway[n].cY);
  952.                     break;
  953.                }
  954.                ucRoadStat = crosswayCheck(GmcMouse.cX,GmcMouse.cY);
  955.                if (ucRoadStat) {                                           /*  有可前进方向                */                  
  956.                     if (ucRoadStat > 1) {                                   /*  有多条可前进方向,保存坐标  */
  957.                         GmcCrossway[n].cX = GmcMouse.cX;
  958.                         GmcCrossway[n].cY = GmcMouse.cY;
  959.                         n++;                                       
  960.                     }
  961.                     switch(FastOperating(GmcMouse.cX,GmcMouse.cY)){
  962.                         case 0:
  963.                             centralMethod();
  964.                             mazeSearch();
  965.                             break;
  966.                         case 1:
  967.                            objectGoTo(GmcMouse.cX,GmcMouse.cY+1);
  968.                            //  mazeSearch();
  969.                             break;
  970.                         case 2:
  971.                           objectGoTo(GmcMouse.cX+1,GmcMouse.cY);
  972.                           //    mazeSearch();
  973.                             break;
  974.                         case 3:
  975.                            objectGoTo(GmcMouse.cX,GmcMouse.cY-1);
  976.                           //   mazeSearch();
  977.                             break;
  978.                         case 4:
  979.                            objectGoTo(GmcMouse.cX-1,GmcMouse.cY);
  980.                            //  mazeSearch();
  981.                             break;
  982.                        default:
  983.                             break;
  984.                     }
  985.                }else{                    /*  没有可前进方向,回到最近支路*/
  986.                     while (--n) {
  987.                           ucRoadStat = crosswayCheck(GmcCrossway[n].cX,GmcCrossway[n].cY);
  988.                           if (ucRoadStat) {
  989.                               objectGoTo(GmcCrossway[n].cX,GmcCrossway[n].cY);
  990.                               if (ucRoadStat > 1) {
  991.                                   n++;
  992.                               }
  993.                               centralMethod();
  994.                               mazeSearch();
  995.                               break;
  996.                           }
  997.                     
  998.                      }
  999.                    if (n == 0){                                           /*  走完了所有的支路,回到起点  */
  1000.                         objectGoTo(GmcCrossway[0].cX, GmcCrossway[0].cY);
  1001.                         mouseTurnback();
  1002.                            //异常处理那种死迷宫(即根本走不出去的迷宫)
  1003.                         if(GmcMouse.cX==GucXStart && GmcMouse.cY==GucYStart){
  1004.                             while(1){
  1005.                                 if(keyCheck()==true){
  1006.                                     break;
  1007.                                 }
  1008.                                 sensorDebug();
  1009.                                 delay(20000);
  1010.                             }
  1011.                         }
  1012.                     }
  1013.                 }
  1014.                 break;
  1015.          case BACKSEARCH:
  1016.              //从终点搜索找起点
  1017.              /*  while(1){
  1018.                     if(keyCheck()==true){
  1019.                          break;
  1020.                     }
  1021.                     sensorDebug();
  1022.                     delay(20000);
  1023.                 }*/
  1024.                 ucRoadStat = crosswayCheck(GmcMouse.cX,GmcMouse.cY);               
  1025.                 if (ucRoadStat) {                                           /*  有可前进方向                */
  1026.                     if (ucRoadStat > 1) {                                   /*  有多条可前进方向,保存坐标  */
  1027.                         GmcCrossway[n].cX = GmcMouse.cX;
  1028.                         GmcCrossway[n].cY = GmcMouse.cY;
  1029.                         n++;                                       
  1030.                     }
  1031.                     piontMethod();       //设定为向点法则                                
  1032.                     mazeSearch();          // 前进一格               
  1033.                     }else{                    /*  没有可前进方向,回到最近支路*/
  1034.                         while (--n) {
  1035.                             if(GmcMouse.cX==0 && GmcMouse.cY==0){
  1036.                                 mouseTurnback();
  1037.                                 GucMouseTask=SPURT;
  1038.                                 break;
  1039.                             }
  1040.                             ucRoadStat = crosswayCheck(GmcCrossway[n].cX,GmcCrossway[n].cY);
  1041.                             if(ucRoadStat) {
  1042.                                 objectGoTo(GmcCrossway[n].cX,GmcCrossway[n].cY);
  1043.                                 if (ucRoadStat > 1) {
  1044.                                     n++;
  1045.                                 }
  1046.                                 piontMethod();
  1047.                                 mazeSearch();
  1048.                                 break;
  1049.                            }
  1050.                            if(n==0){
  1051.                              GucMouseTask=SPURT;
  1052.                              break;
  1053.                         }
  1054.                     }
  1055.                 }
  1056.                 break;
  1057.         case SPURT:
  1058.           //  mouseSpurt ();
  1059.             objectGoTo(cXdst,cYdst);
  1060.             n--;
  1061.             objectGoTo(GmcCrossway[n].cX, GmcCrossway[n].cY);
  1062.             GucMouseTask = BACKSEARCH;
  1063.             break;
  1064.         default:
  1065.             break;
  1066.         }
  1067.     }
  1068. }


  1069. /*********************************************************************************************************
  1070.   END FILE
  1071. *********************************************************************************************************/





  1072. /*********************************************************************************************************
  1073. ** Function name:       piontMethod
  1074. ** Descriptions:        向点法则,电脑鼠从终点找起点
  1075. ** input parameters:    无
  1076. ** output parameters:   GmcMouse.cX,GmcMouse.cY
  1077. ** Returned value:      无
  1078. *********************************************************************************************************/

  1079. void piontMethod(int8 cX,int8 cY)
  1080. {
  1081.         if (!(GmcMouse.cX & 0x08))
  1082.         {
  1083.         if (!(GmcMouse.cY & 0x08))
  1084.                 {
  1085.                                 /*
  1086.                                  *  此时电脑鼠在迷宫的左下角
  1087.                                  */  
  1088.                                 switch (GucMouseDir)
  1089.                                 {
  1090.                         
  1091.                                 case UP:                                                    /*  当前电脑鼠向上              */
  1092.                                         LeftMethod();                                                                                        /*  左手法则                    */
  1093.                                         break;

  1094.                                 case RIGHT:                                                 /*  当前电脑鼠向右              */
  1095.                                         RightMethod();                                          /*  右手法则                    */
  1096.                                         break;

  1097.                                 case DOWN:                                                  /*  当前电脑鼠向下              */
  1098.                                         frontRightMethod();                                     /*  中右手法则                    */
  1099.                                         break;

  1100.                                 case LEFT:                                                  /*  当前电脑鼠向左              */
  1101.                                         frontLeftMethod();                                      /*  中左手法则                    */
  1102.                                         break;

  1103.                                 default:
  1104.                                         break;
  1105.                         }
  1106.                 }
  1107.     }
  1108.         else
  1109.         {
  1110.         
  1111.             frontLeftMethod();                                      /*  中左法则                    */


  1112.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_F) &&         /*  电脑鼠的前方有路            */
  1113.         (mazeBlockDataGet(MOUSEFRONT) == 0x00)) {                       /*  电脑鼠的前方没有走过        */
  1114.         return;                                                         /*  电脑鼠不用转弯              */
  1115.     }
  1116.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_L) &&         /*  电脑鼠的左边有路            */
  1117.         (mazeBlockDataGet(MOUSELEFT ) == 0x00)) {                       /*  电脑鼠的左边没有走过        */
  1118.         //delay(20000);
  1119.        // delay(10000);
  1120.         mouseTurnleft();                                                /*  电脑鼠左转                  */
  1121.         return;
  1122.     }
  1123.     if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_R) &&         /*  电脑鼠的右边有路            */
  1124.         (mazeBlockDataGet(MOUSERIGHT) == 0x00)) {                       /*  电脑鼠的右边没有走过        */
  1125.         //delay(20000);
  1126.        // delay(10000);
  1127.         mouseTurnright();                                               /*  电脑鼠右转                  */
  1128.         return;
  1129.     }
  1130.     }
  1131. }
复制代码

所有资料51hei提供下载:
.rar (198.73 KB, 下载次数: 18)



回复

使用道具 举报

ID:687193 发表于 2020-1-18 17:24 | 显示全部楼层
有这个代码的头文件吗
回复

使用道具 举报

ID:687193 发表于 2020-1-18 17:25 | 显示全部楼层
有这个代码的头文件吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表