⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 34

📁 电脑鼠走迷宫程序
💻
📖 第 1 页 / 共 3 页
字号:
                rightMethod();                                          /*  右手法则                    */
                break;

            case RIGHT:                                                 /*  当前电脑鼠向右              */
                frontRightMethod();                                     /*  中右法则                    */
                break;

            case DOWN:                                                  /*  当前电脑鼠向下              */
                frontLeftMethod();                                      /*  中左法则                    */
                break;

            case LEFT:                                                  /*  当前电脑鼠向左              */
                leftMethod();                                           /*  左手法则                    */
                break;

            default:
                break;
            }
        } else {

            /*
             *  此时电脑鼠在迷宫的左下角
             */    
            switch (GucMouseDir) {
                
            case UP:                                                    /*  当前电脑鼠向上              */
                frontRightMethod();                                     /*  中右法则                    */
                break;

            case RIGHT:                                                 /*  当前电脑鼠向右              */
                frontLeftMethod();                                      /*  中左法则                    */
                break;

            case DOWN:                                                  /*  当前电脑鼠向下              */
                leftMethod();                                           /*  左手法则                    */
                break;

            case LEFT:                                                  /*  当前电脑鼠向左              */
                rightMethod();                                          /*  右手法则                    */
                break;

            default:
                break;
            }
        }
    }
}
/*********************************************************************************************************
** Function name:       crosswayCheck
** Descriptions:        统计某坐标存在还未走过的支路数
** input parameters:    ucX,需要检测点的横坐标
**                      ucY,需要检测点的纵坐标
** output parameters:   无
** Returned value:      ucCt,未走过的支路数
*********************************************************************************************************/
uint8 crosswayCheck (int8  cX, int8  cY)
{
    uint8 ucCt = 0;
    if ((GucMapBlock[cX][cY] & 0x01) &&                                 /*  绝对方向,迷宫上方有路      */
        (GucMapBlock[cX][cY + 1]) == 0x00) {                            /*  绝对方向,迷宫上方未走过    */
        ucCt++;                                                         /*  可前进方向数加1             */
    }
    if ((GucMapBlock[cX][cY] & 0x02) &&                                 /*  绝对方向,迷宫右方有路      */
        (GucMapBlock[cX + 1][cY]) == 0x00) {                            /*  绝对方向,迷宫右方没有走过  */
        ucCt++;                                                         /*  可前进方向数加1             */
    }
    if ((GucMapBlock[cX][cY] & 0x04) &&                                 /*  绝对方向,迷宫下方有路      */
        (GucMapBlock[cX][cY - 1]) == 0x00) {                            /*  绝对方向,迷宫下方未走过    */
        ucCt++;                                                         /*  可前进方向数加1             */
    }
    if ((GucMapBlock[cX][cY] & 0x08) &&                                 /*  绝对方向,迷宫左方有路      */
        (GucMapBlock[cX - 1][cY]) == 0x00) {                            /*  绝对方向,迷宫左方未走过    */
        ucCt++;                                                         /*  可前进方向数加1             */
    }
    return ucCt;
}
/*********************************************************************************************************
** Function name:       crosswayChoice
** Descriptions:        选择一条支路作为前进方向
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
static int methodself = 1;

void crosswayChoice (void)
{

          switch (methodself)						//摆放位置注意
	{
    case 0:
        rightMethod();
        break;
    
    case 1:
        leftMethod();
        break;
        
     case 2:
        frontLeftMethod();
     break;
        
    
    default:
        break;
    }

  

}
/*********************************************************************************************************
** Function name:       main
** Descriptions:        主函数
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/

main (void)
{
    uint8 n          = 0;                                               /*  GmcCrossway[]下标           */
    uint8 ucRoadStat = 0;                                               /*  统计某一坐标可前进的支路数  */
    uint8 ucTemp     = 0;                                               /*  用于START状态中坐标转换     */

    mouseInit();                                                        /*  底层驱动的初始化            */
    zlg7289Init();                                                      /*  显示模块初始化              */

    while (1) {
        switch (GucMouseTask) {                                         /*  状态机处理                  */
            
        case WAIT:
            sensorDebug();
            voltageDetect();
            delay(100000);
            if (keyCheck() == true) {                                   /*  检测按键等待启动            */
                zlg7289Reset();                                         /*  复位ZLG7289                 */
                GucMouseTask = START;
            }
            break;
            
        case START:                                                     /*  判断电脑鼠起点的横坐标      */
            mazeSearch();                                               /*  向前搜索                    */
            if (GucMapBlock[GmcMouse.cX][GmcMouse.cY] & 0x08) {         /*  判断电老鼠左边是否存在出口  */
                if (MAZETYPE == 8) {                                    /*  修改四分之一迷宫的终点坐标  */
                    GucXGoal0 = 1;
                    GucXGoal1 = 0;
                }
                GucXStart   = MAZETYPE - 1;                             /*  修改电脑鼠起点的横坐标      */
                GmcMouse.cX = MAZETYPE - 1;                             /*  修改电脑鼠当前位置的横坐标  */    
                /*
                 *  由于默认的起点为(0,0),现在需要把已记录的墙壁资料转换过来
                 */
                ucTemp = GmcMouse.cY;
                do {
                    GucMapBlock[MAZETYPE - 1][ucTemp] = GucMapBlock[0][ucTemp];
                    GucMapBlock[0 ][ucTemp] = 0;
                }while (ucTemp--);
                /*
                 *  在OFFSHOOT[0]中保存起点坐标
                 */
                GmcCrossway[n].cX = MAZETYPE - 1;
                GmcCrossway[n].cY = 0;
                n++;
                GucMouseTask = MAZESEARCH;                              /*  状态转换为搜寻状态          */
            }
            if (GucMapBlock[GmcMouse.cX][GmcMouse.cY] & 0x02) {         /*  判断电老鼠右边是否存在出口  */
                /*
                 *  在OFFSHOOT[0]中保存起点坐标
                 */
                GmcCrossway[n].cX = 0;
                GmcCrossway[n].cY = 0;
                n++;
                GucMouseTask = MAZESEARCH;                              /*  状态转换为搜寻状态          */
            }
            break;
            
        case MAZESEARCH:
            ucRoadStat = crosswayCheck(GmcMouse.cX,GmcMouse.cY);        /*  统计可前进的支路数          */
            
            if ((GmcMouse.cX == 7&&GmcMouse.cY == 7)||(GmcMouse.cX == 8&& GmcMouse.cY== 7)||(GmcMouse.cX == 8&&GmcMouse.cY == 8)||(GmcMouse.cX == 7&&GmcMouse.cY == 8) )///////////////////////////////////
	{
		delay(10);
		objectGoTo(GmcCrossway[0].cX, GmcCrossway[0].cY);
                mouseTurnback();
		GucMouseTask = SPURT;
	}
        if(GmcMouse.cX<=7)
        {
            if (GmcMouse.cY == 0)			//注意根据情况修改////////////////////////////////////////////////////
	{
		methodself = 0;
	}
	if (GmcMouse.cY == 7 )
	{
		methodself = 1;
	}
        }
           else{

      if(GucMouseDir==UP) methodself=2;       /*如果电子鼠向上运动,采用中心法则*/
    if(GucMouseDir==DOWN) methodself=0;   /*如果电子鼠向下运动,采用右手法则*/
    if(GucMouseDir==RIGHT) methodself=1;    /*如果电子鼠向右运动,采用左手法则*/
    if(GucMouseDir==LEFT) methodself=0;    /*如果电子鼠向左运动,采用中心法则*/
   }
            if (ucRoadStat) {                                           /*  有可前进方向                */
                if (ucRoadStat > 1) {                                   /*  有多条可前进方向,保存坐标  */
                    GmcCrossway[n].cX = GmcMouse.cX;
                    GmcCrossway[n].cY = GmcMouse.cY;
                    n++;
                }
                crosswayChoice();                                       /*  用右手法则搜索选择前进方向  */
                mazeSearch();                                           /*  前进一格                    */
            } else {                                                    /*  没有可前进方向,回到最近支路*/
                while (--n) {
                    ucRoadStat = crosswayCheck(GmcCrossway[n].cX,
                                               GmcCrossway[n].cY);
                                                                        /*  统计最近支点未走过的方向数  */
                                                                        
                    /*
                     *  若存在未走过的路,则前往该支点,并跳出循环
                     *  否则继续查找还有未走过的支路。
                     */
                    if (ucRoadStat) {
                        objectGoTo(GmcCrossway[n].cX,
                                   GmcCrossway[n].cY);
                        if (ucRoadStat > 1) {
                            n++;
                        }
                        crosswayChoice();
                        mazeSearch();
                        break;
                    }
                }
                if (n == 0) {                                           /*  走完了所有的支路,回到起点  */
                    objectGoTo(GmcCrossway[0].cX, GmcCrossway[0].cY);
                    mouseTurnback();
                    GucMouseTask = SPURT;                               /*  电脑鼠将开始冲刺状态        */
                }
            }
            break;

        case SPURT:
            mouseSpurt();                                               /*  以最优路径冲向终点          */
            objectGoTo(GucXStart,GucYStart);                            /*  回到起点                    */
            mouseTurnback();                                            /*  向后转,恢复出发姿势        */
            while (1) {
                if (keyCheck() == true) {
                    break;
                }
                sensorDebug();
                delay(20000);
            }
            break;

        default:
            break;
        
        }
    }
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -