📄 34
字号:
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 + -